1. 了解wisp-rs部署的基本概念
- domain的概念,wisp-rs是一个osgi的服务端系统,他本身是支持多企业运行的。每个企业都可以有独特的系统配置,wisp-rs可以对这些不同的配置统一管理。这些配置放置在一个domain的目录中。wisp-rs的启动参数需要指定这一目录。很明显,如果我们要运行多个wisp-rs的集群,这个目录是完全可以共享的。
- OSGi,wisp-rs是基于Equinox OSGi的系统,他的启动可以用两种方式:1)使用Java命令行启动,2)使用Equinox Launcher启动。这两者都是可行的,我们选择使用Equinox Launcher启动,可以全部读取配置文件。如果选择Equinox启动,我们运行的程序就是rs,它会读取同目录下的rs.ini文件作为配置。
- 配置,wisp-rs有两个配置文件,包含了大量的配置,java的启动参数和Launcher的启动参数只能在rs.ini中配置,其他的配置可以放置在config.ini中,也可以放置在rs.ini中。那么,我们需要规划一下配置放置的位置,在rs.ini中只配置Java参数,启动器,服务端口号,其余的在config.ini中进行配置。config.ini完全可以在各个wisp-rs的容器中统一。
- OSGi 运行区,标准的Equinox OSGi在启动时会在configuration目录下产生一组OSGi的文件。大家先姑且认为是缓存。而config.ini同样也在这个目录中。那么问题出现了,我们希望config.ini可以暴露到host上进行修改,而OSGi的运行时产生的文件,我们并不想理会。如果我们直接将configuration目录给host挂载,肯定是行不通的。所以,我们需要给wisp-rs增加一个参数,改变它的OSGi运行区。
2. 一个标准的wisp-rs的运行时目录结构
他在运行环境的目录结构包括:
domain //下面放置的是各个不同企业的业务配置
----abc1 //abc1公司的业务配置
----abc2 //abc2公司的业务配置
----host //主机业务配置
----scheme //业务模板
server //下面是运行所需的系统配置和Jar文件
----configuration //OSGi 运行区和config.ini文件
----jre // 我们用的jre8
----lang //语言包
----log //系统日志
----plugins //OSGi bundle,jar包
----rs.ini //rs配置
----rs//可执行文件
XXX //其他第三方的文件,库等,例如:hanlp的字典
3. wisp-rs目录结构的改造
我们希望 wisp-rs的集群在业务层面(domain)上是共享的,而且,domain里面所有的文件对于wisp-rs而言都是只读的。所以,domain可以mount到host上。
configuration里面的config.ini是共享的,但OSGi运行区是内部的。我们要把他们分开。在rs.ini中增加一行配置新的运行区目录:
-Dosgi.configuration.area=osgiconf
那么,这样wisp-rs在启动时就会在osgiconf目录中存放运行时文件。
lang,语言文件,也是可以在各个wisp-rs容器间共享的。
所以,我们把wisp-rs的文件夹结构改造如下:
configuration
----domain
----lang //语言包
----config.ini
----其他的配置文件
server
----osgiconf //OSGi 运行区,这个目录不需要手工建,系统启动时会自动建立
----jre // 我们用的jre8
----log //系统日志
----plugins //OSGi bundle,jar包
----rs.ini //rs配置
----rs //可执行文件
4. 根据新的目录关系重新配置
config.ini
我们后面将在/wisp-rs目录中安装系统,config.ini的配置修改为以下
org.eclipse.equinox.http.jetty.customizer.class=com.bizvisionsoft.server.jetty.RSServerCustomizer
com.bizvisionsoft.service.url=http://rs.wisplanner.com:9158/services
com.bizvisionsoft.client.url=https://www.wisplanner.com/
com.bizvisionsoft.service.DPSList=192.168.101.13:8199
com.bizvisionsoft.service.MongoDBDumpCmd=mongodump
com.bizvisionsoft.service.MongoDBStoreCmd=mongorestore
com.bizvisionsoft.service.ServerConfigRootPath=/wisp-rs/configuration/domains
com.bizvisionsoft.service.Lang=/wisp-rs/configuration/lang
com.bizvisionsoft.service.Swagger=/wisp-rs/configuration/swagger.properties
com.bizvisionsoft.service.MongoDBConnector=/wisp-rs/configuration/db.properties
logback.configurationFile=/wisp-rs/configuration/log-rs.xml
com.hankcs.hanlp.properties=/wisp-rs/configuration/hanlp.properties
org.quartz.properties=/wisp-rs/configuration/quartz-db.properties
hanlp.properties
root=/wisp-rs/configuration/hanlp1.7.1
db.properties
更改为我们上一章安装的复制集地址
db.name=bvs_host
db.hosts=192.168.100.2:27017 192.168.100.3:27017 192.168.100.4:27017
db.user=
db.password=
quartz-db.properties
更改为我们上一章安装的复制集地址
org.quartz.jobStore.mongoUri=mongodb://192.168.100.2:27017,192.168.100.3:27017,192.168.100.4:27017
rs.ini
-startup
plugins/org.eclipse.equinox.launcher_1.4.0.v20161219-1356.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.gtk.linux.x86_64_1.1.551.v20171108-1834
-console
-vmargs
-Dosgi.requiredJavaVersion=1.8
-XX:+UseG1GC
-Xms2048m
-Xmx2048m
-server
-Dosgi.configuration.area=osgiconf
-Declipse.ignoreApp=true
-Dosgi.noShutdown=true
-Dorg.osgi.service.http.port=9158
-Dosgi.console=6123
4. 准备复制到Docker Image的文件
进入wisp-rs的上级目录,压缩wisp-rs为tag.gz文件,这个文件在ADD到Image时会自动解压。
wis@wis:~/build/server$ tar -cvf wisp-rs.tar.gz wisp-rs
5. 创建Dockerfile文件
在wisp-rs的同级目录下创建一个Dockerfile文件,内容如下:
FROM ubuntu
LABEL version="6.0" description="wisp-rs" by="ghuazh"
ADD wisp-rs.tar.gz /
ENV LANG C.UTF-8
VOLUME ["/wisp-rs/configuration"]
WORKDIR /wisp-rs/
EXPOSE 9158 6123
CMD ["./rs"]
具体的Docker Image Build,请查看更多的资料
https://docs.docker.com/get-started/part2/
https://docs.docker.com/develop/dev-best-practices/
6. 构建 Docker Image
wis@wis:~/build/server$ sudo docker build -t wisp-rs:latest .
Sending build context to Docker daemon 2.359GB
Step 1/8 : FROM ubuntu
---> 4e5021d210f6
Step 2/8 : LABEL version="6.0" description="wisp-rs" by="ghuazh"
---> Running in ff7bfdbc519a
Removing intermediate container ff7bfdbc519a
---> 3e7171276c56
Step 3/8 : ADD wisp-rs.tar.gz /
---> 275032b2f4ca
Step 4/8 : ENV LANG C.UTF-8
---> Running in 4366bcd80606
Removing intermediate container 4366bcd80606
---> 5275b33770ed
Step 5/8 : VOLUME ["/wisp-rs/configuration"]
---> Running in 70c88edbd7b0
Removing intermediate container 70c88edbd7b0
---> ef2f55fb1c9d
Step 6/8 : WORKDIR /wisp-rs/
---> Running in 2ef2dcd1a6ac
Removing intermediate container 2ef2dcd1a6ac
---> aff1fc71e8c3
Step 7/8 : EXPOSE 9158 6123
---> Running in 0cd7dcb34b60
Removing intermediate container 0cd7dcb34b60
---> 8e13cb20206d
Step 8/8 : CMD ["./rs"]
---> Running in d44af0cde5c3
Removing intermediate container d44af0cde5c3
---> f6f42d9ec009
Successfully built f6f42d9ec009
Successfully tagged wisp-rs:latest
现在已经构建成功:
wis@wis:~/build/server$ sudo docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
wisp-rs latest f6f42d9ec009 About an hour ago 441MB
mongo latest fddee5bccba3 3 days ago 388MB
alpine latest a187dde48cd2 4 weeks ago 5.6MB
ubuntu latest 4e5021d210f6 4 weeks ago 64.2MB
7. 创建 Docker Container 运行wisp-rs
sudo docker run --name wisp-rs --network mongo --ip 192.168.100.10 -p 9158:9158 \
-v /home/wis/build/server/configuration:/wisp-rs/configuration -d wisp-rs
运行成功后,我们可以在浏览器上查看wisp-rs的swagger页面