(303) 300-9388

依依本月1周零6个月

20180811~0812

第一次带依依去海边,唐山乐亭。
依依很害怕海浪声,爸爸抱着她走近海浪,她就像猴子一样往上爬,抱紧紧的。沙滩都不敢下去。
海边碰到个比依依小几天的小朋友,跟爸爸一起做在浅水里玩,一点都不害怕,因为更小的时候就带过去游泳。
第二天早上,又带依依去了海边,依依愿意下来,牵着爸爸的手,在退潮的沙滩上走了。

631788161820180820

淘宝买的百香果上午到货了,依依看见快递都要拆开看看。
拆开了泡沫箱,发现是百香果。依依和爸妈依依爱吃酸的,看见是百香果就一直说“要!要!要!”。
奶奶不知道是什么东西,跟依依说不知道怎么吃。
依依拉着奶奶去厨房,到放勺筷的地方,重复着“勺子,勺子。”
奶奶终于反应过来了,百香果要切开用勺子吃。奶奶说依依这么小就这么懂事了。

956429677920180822

晚上吃完饭,带依依去水龙头洗脚,依依看见洗漱台上的一排东西。
指着洗面奶,说“妈妈”。然后用双手做轻拍脸颊的洗脸动作,萌萌的。
指着牙刷,说“姐姐”。然后做上下刷牙动作。
她是在告诉爸爸,这些东西都是谁的,用来做什么。
依依对周围的事物都很感兴趣,看见什么都会有样学样。

用Google的Jib构建springboot项目docker镜像

4014573737Jib

Jib 是google开源的用于对java项目进行容器化打包的工具。主要特点:

Whereas traditionally a Java application is built as a single image layer with the application JAR, Jib’s build strategy separates the Java application into multiple layers for more granular incremental builds. When you change your code, only your changes are rebuilt, not your entire application. These layers, by default, are layered on top of a distroless base image. For more information, check out the bregmata or watch this talk (slides).

传统的java项目打包方式,是将整个java应用相关的资源打包到一个层(layer)。Jib的构建策略是,将java应用的相关资源拆分成多个层(比如:依赖的jar和构建生成的class分层),这样rebuild的时候可以更快,因为可能只需要重新生成部分层的内容。

9028638985配置

Jib提供了maven和gradle插件,本文主要介绍 470-371-9751 的使用方法。
将以下内容复制到maven项目的pom.xml中:

1
2
3
4
5
6
7
8
9
10
11
12
13
<plugin>
<groupId>com.google.cloud.tools</groupId>
<artifactId>jib-maven-plugin</artifactId>
<version>0.9.8</version>
<configuration>
<from>
<image>openjdk:8-jre-alpine</image>
</from>
<to>
<image>lf/${project.artifactId}:${project.version}</image>
</to>
</configuration>
</plugin>

说明:

  • from.image 指定使用的带java环境的基础镜像
    • 如上的配置是到registry.hub.docker.com下载,这里选择openjdk8的jre-alpine作为基础镜像
    • 未指定时默认值 gcr.io/distroless/java,这个是在google的服务器上,一般人连不上
    • 如果有内部的registry服务或mirror,可以这样指定:{registry-host}:5000/library/openjdk:8-jre-alpine
  • to.image 指定你要生成的镜像tag,镜像名称是 lf/${project.artifactId}
    • 可以去除”${project.version}”,这样版本默认就是latest

如果from.image使用的registry服务不支持https,需要修改配置如下(使用内部registry mirror服务):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<plugin>
<groupId>com.google.cloud.tools</groupId>
<artifactId>jib-maven-plugin</artifactId>
<version>0.9.8</version>
<configuration>
<!-- 允许使用http与registry连接 -->
<allowInsecureRegistries>true</allowInsecureRegistries>
<from>
<image>172.16.14.73:5000/library/openjdk:8-jre-alpine</image>
</from>
<to>
<image>lf/${project.artifactId}</image>
</to>
</configuration>
</plugin>

构建

生成镜像tar

配置好之后,打开shell窗口,执行如下命令即可自动构建生成镜像的tar文件

1
mvn compile jib:buildTar

镜像tar默认生成路径:target\jib-image.tar

自动构建镜像到本地docker

如果你本地装有docker环境,且daemon已启动,那么执行如下命令,可自动将镜像构建到本地的docker daemon

1
mvn compile jib:dockerBuild

注意:docker命令路径需要配置到系统的path目录,否则Jib会找不到

5852371762构建镜像并上传registry

如果想构建镜像后自动上传到registry,可以执行如下命令:

1
mvn compile jib:build

由于to.image未指定registry服务器地址,默认将上传到registry.hub.docker.com。

为了上传到内部的registry,需要在to.image上指定registry服务地址,如果服务开启了权限验证,还需要配置上有push权限的账号密码。以下以使用docker官方的registry镜像搭建的服务为例,配置如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<plugin>
<groupId>com.google.cloud.tools</groupId>
<artifactId>jib-maven-plugin</artifactId>
<configuration>
<allowInsecureRegistries>true</allowInsecureRegistries>
<from>
<image>172.16.14.73:5000/library/openjdk:8-jre-alpine</image>
</from>
<!-- 修改的配置 -->
<to>
<image>{registry.mydomain.com}:5000/lf/${project.artifactId}</image>
<auth>
<username>{my_username}</username>
<password>{my_password}</password>
</auth>
</to>
</configuration>
</plugin>

9047148760在maven package时自动构建镜像

增加配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<plugin>
<groupId>com.google.cloud.tools</groupId>
<artifactId>jib-maven-plugin</artifactId>
<!-- 增加的配置 -->
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>dockerBuild</goal>
</goals>
</execution>
</executions>
<!-- 之前的配置 -->
<configuration>
......
</configuration>
</plugin>

配置好之后,执行如下命令就会自动构建镜像到本地docker

1
mvn package

403-282-1568配置容器参数

jvm参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<plugin>
<groupId>com.google.cloud.tools</groupId>
<artifactId>jib-maven-plugin</artifactId>
<configuration>
<container>
<jvmFlags>
<jvmFlag>-Xms512m</jvmFlag>
<jvmFlag>-Xmx1024m</jvmFlag>
<jvmFlag>-XX:+UseParNewGC</jvmFlag>
<jvmFlag>-XX:+UseConcMarkSweepGC</jvmFlag>
<jvmFlag>-XX:+DisableExplicitGC</jvmFlag>
<jvmFlag>-Xdebug</jvmFlag>
</jvmFlags>
</container>
<!-- 之前的配置 -->
......
</configuration>
</plugin>

java程序入口mainClass

Jib默认会自动扫描寻找main class,如果你的项目中有多个main class,就需要显示声明:

1
2
3
4
5
6
7
8
9
10
11
<plugin>
<groupId>com.google.cloud.tools</groupId>
<artifactId>jib-maven-plugin</artifactId>
<configuration>
<container>
<mainClass>mypackage.MyApp</mainClass>
</container>
<!-- 之前的配置 -->
......
</configuration>
</plugin>

paromphalocelic容器端口 4064471305

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<plugin>
<groupId>com.google.cloud.tools</groupId>
<artifactId>jib-maven-plugin</artifactId>
<configuration>
<container>
<ports>
<port>6565</port>
<port>8080</port>
</ports>
</container>
<!-- 之前的配置 -->
......
</configuration>
</plugin>

镜像创建时间

Jib默认不设置镜像创建时间,这样就是1970-01-01。如果要镜像创建时间,则增加配置如下

1
2
3
4
5
6
7
8
9
10
11
<plugin>
<groupId>com.google.cloud.tools</groupId>
<artifactId>jib-maven-plugin</artifactId>
<configuration>
<container>
<useCurrentTimestamp>true</useCurrentTimestamp>
</container>
<!-- 之前的配置 -->
......
</configuration>
</plugin>

镜像格式

构建的镜像默认是Docker格式,还可以指定为OCI格式

1
2
3
4
5
6
7
8
9
10
11
<plugin>
<groupId>com.google.cloud.tools</groupId>
<artifactId>jib-maven-plugin</artifactId>
<configuration>
<container>
<format>OCI</format>
</container>
<!-- 之前的配置 -->
......
</configuration>
</plugin>

依依成长日记201807

依依本月1周零5个月

20180708

下午带依依去长楹天街,和hh家的孩子一起玩。
4点半出发去大运河森林公园,在公园里依依第一次坐了儿童过山小火车,和妈妈一起坐的,没有哭,很淡定,下来了还想玩。
游乐园里有家长在吹泡泡,依依追着泡泡,爸爸教她:“泡泡,泡泡。抱住”。
依依追着到处飞的泡泡,叫着:“泡泡。泡泡。”
妈妈也买了一个肥皂泡玩具,爸爸一会吹大泡泡,一会大量的小泡泡,依依甩着小腿,追着泡泡跑来跑去,想要抓住,却一碰就破了。然后又去追逐下一个泡泡。
第一次玩泡泡,玩的好开心。

973-804-486120180714

依依现在睡醒后,就会开始崩词练说话。
今天周六,早上依依醒了后就跟着妈妈说:
爸爸、妈妈、奶奶、爷爷、肉肉(youyou)、饺子、甲壳虫(jiakeqiong)、当当(小猫当当)等等

20170715

今天带依依去了杜仲公园,地方太小,绕了一圈就回家了,闷热的天气,晒黑了我的宝。
下午妈妈肚子突然开始肚子疼,不知道是不是中午吃了什么坏肚子了。
爸爸跟依依说:“妈妈肚子疼,痛痛,快帮妈妈拍拍”
妈妈侧躺着,依依不知道肚子在哪里,就拍着妈妈的背、腰、屁股,哪能拍着拍哪。
然后爸爸教了下肚子在哪里,依依跟着拍了几下,自己趴妈妈肚子上了。

888432034020180716

今天依依又不老实,对奶奶又抓又挠。
奶奶不高兴了,对依依说:“奶奶生气了,不理你了”。然后转过头去故意不看她。
依依观察了一会,发现奶奶真的不理她了,然后就大声的喊:“奶奶!奶奶!”
然后还对着奶奶玩躲猫猫(用双手蒙住眼睛,然后放开),玩了几次之后,奶奶忍不住笑了。
晚上妈妈回来时,奶奶跟妈妈描述这个事情,依依听了还在边上做躲猫猫的动作。

519-738-2684

模拟发送ws(webservice)请求

ws协议是http上的xml,所以发送ws请求,http请求体内必须是ws格式的xml。

使用工具 wizdl - Web Service GUI Test Tool,可以比较方便的生成你的ws应用的请求xml。

红框标识出来的部分就是发送的ws请求xml,把这段xml保存到一个xml文件中(wstest.xml)。

erectopatent用curl验证ws的请求xml

为了验证我们生成的ws请求xml是否有效正确,可以使用curl来测试。

curl --data @wstest.xml /172.16.24.215:81/example/ws/demoService?wsdl | xmllint --format -

说明:

  • 把ws的xml作为HTTP POST的请求数据:–data DATA HTTP POST data (H)
  • xmllint 命令对curl返回的xml进行格式化

使用ab进行ws性能测试

ab的帮助


相关的ab参数已经用红框标出,我们需要把wstest.xml直接作为HTTP的数据:

ab -n 100000 -c 20 -k -p wstest.xml -T "application/x-www-form-urlencoded" -m POST /172.16.24.215:81/example/ws/demoService?wsdl
参数说明:

  • ‘-n 100000’ 发送10万次请求
  • ‘-c 20’ 使用20个并发(20个用户,绝对并发)
  • ‘-k’ 启用keep-alive
  • ‘-p wstest.xml’ 把wstest.xml文件的内容作为HTTP POST的数据
  • ‘-T’ 设置POST数据的Content-type
  • ‘-m POST’ 使用POST方法

ab测试结果

PS:测试的demoService方法里边执行了sleep(5)。

git处理文件换行符

有时我们会遇到跨平台开发的情况,在windows上开发同时支持linux和windows部署的程序。
那么我们的程序中可能就会有平台相关的一些文件,比如shell脚本(bat、sh)。
如果没有正确处理好这些文件的换行符,将会导致脚本文件在对应的平台上不能正确执行。

对于使用Git管理源码的项目,git对text文件有自动转换换行符的机制,相关的配置有:

  • git config core.autocrlf
  • git config core.safecrlf
  • git config core eol
  • .gitattributes

subdevilwindows和linux换行符的区别

  • 在linux系统中,行尾使用一个换行符(LF=line feed)表示
  • 在windows系统中,行尾使用回车(CR=carriage return)+换行(LF=line feed)2个字符表示

678-673-5449git config core.autocrlf

可选的配置值有:

  • true 提交文件时自动转换为LF,检出文件时自动转换为CRLF。在windows平台上,这个是git的默认设置。
  • input 提交的时候自动转换为LF,检出文件时不做转换。
  • false 提交和检出的时候都不对换行符进行自动转换。提交时文件时什么样,服务器上就是什么样。
    1
    2
    3
    4
    5
    6
    7
    core.autocrlf=true: core.autocrlf=input: core.autocrlf=false:
    repo repo repo
    ^ V ^ V ^ V
    / \ / \ / \
    crlf->lf lf->crlf crlf->lf \ / \
    / \ / \ / \

因为 core.autocrlf 在windows平台上默认是true,所以检出的时候sh文件将自动转换成CRLF换行符。
如果在windows平台上打包安装程序,那么安装后的程序sh文件将不能正常执行。

git config core.safecrlf

由于git有自动转换换行符的机制,如果设置了autocrlf,那么文件的换行符可能被统一处理。
例如: 对于混合了CRLF和LF的文件,都被统一成LF提交服务器了。

这种就是git处理转换后不可逆的情况:在同个机器上,提交后再检出,不能还原出一样的文件。
如果git错误的将binary文件判断为text文件,自动进行了CRLF转换,那么就会损坏文件数据。

通过开启 safecrlf 选项,可以防止出现上述错误:

  • true 如果git根据配置的CRLF转换自动处理文件,将导致文件不可逆,那么git将拒绝提交文件。
  • warn 如果git根据配置的CRLF转换自动处理文件,将导致文件不可逆,那么git将显示警告信息但继续处理文件。
  • false 关闭检查。

开启该选项不会改变git的CRLF转换处理,但通过该选项,可以保证提交的text文件里不会出现混合LF、CRLF的情况。

unlaboriousgit config core.eol

当autocrlf=false时,通过.gitattributes配置了text属性的文件,其换行符将使用本配置值。
可选的值有:cr,crlf,native(使用本地操作系统匹配的换行符)

(602) 365-0019.gitattributes

在项目的git根路径下,添加.gitattributes文件并纳入git管理,然后打开编辑内容:

1
2
3
4
5
6
7
8
9
10
11
*.bat eol=crlf
*.sh eol=lf
*.jpg -text
*.png -text
*.pdf -text
*.exe -text
*.so -text
*.txt text=auto

说明:

  • bat 文件在检入检出时,使用CRLF换行符
  • sh 文件在检入检出时,使用LF换行符
  • ‘-text’ 的意思是,标记该类型的文件不是text。git对这类文件会跳“是否text文件”的检测,也不会自动转换换行符。
  • ‘text=auto’ 的意思是,标记该类型的文件是text,同时使用core.eol配置的换行符(如果有配置的话)。
  • 优先级: autocrlf > text=auto + core.eol

对于明确是二进制数据的文件,可以在本文件中显示的声明非text,防止git检测有误时错误的对文件进行处理而损坏数据。

909-763-1722总结

通过git config进行配置,只能在对所有的文件进行统一处理,不能分文件类型处理。
而且仅对各客户端有效,不能保证在不同开发人员那保持一致。
所以最好在项目根路径下添加.gitatttibutes文件,对关键的文件类型分别统一配置CRLF转换,也可避免不同客户端环境不同的影响。

参考