1.首先在上一篇文章中,此时已经在248 249 216的机器上搭建好了Springboot的负载均衡,然后我们在Manager机器上的docker-compose.xml中加入以下参数
service_zk: //服务名
image: zookeeper:3.4.14
restart: always
network_mode: "eg1"
deploy:
mode: replicated
replicas: 1 //部署在一台机器上
ports:
- "2181:2181"
2.然后在Manager机器上启动zk服务
docker stack deploy --compose-file docker-compose.yml myapp1
3.然后在其他容器中可以通过 stack的服务名称+docker-compose的服务名来访问到各个服务,在这里,我们想要在其他容器的springboot中访问zk,只需要连接zk的地方配置上:myapp1_service_zk:2181
4.验证脚本(这里不用springboot来验证了,知识图谱里面用的springboot太重了不好调试,自己简单弄了个轻量级的程序来调用zk,通过传入arg来指定zk的地址
pom:
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
代码:
import org.I0Itec.zkclient.ZkClient;
public class ZkOperater {
private ZkClient zk;
public static void main(String[] args) throws Exception {
ZkOperater sc = new ZkOperater();
sc.connect(args[0] + ":2181");
while (true) {
System.out.println(sc.zk.getChildren("/test"));
Thread.sleep(2000);
}
}
public synchronized void connect(String servers) {
// 连接超时时间
int timeout = 20000;
// 建立连接
zk = new ZkClient(servers, timeout);
}
}
assembly插件配置
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<appendAssemblyId>false</appendAssemblyId>
<descriptorRefs>
<!--设置将所有的依赖打进jar包中-->
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<!-- 此处指定main方法入口的class -->
<mainClass>ZkOperater</mainClass>
</manifest>
</archive>
<!--指定打出的jar包输出目录-->
<outputDirectory>target</outputDirectory>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<!--将assembly插件绑定到package上,到时只需要双击package指令即可-->
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
使用assembly插件对maven项目打个完整包即可直接运行,执行
maven clean package
5.对上述程序打包后,docker cp到springboot服务对应的容器内,(这个时候,我们的springboot是在三个不同的容器当中,zk也在单独的一个容器当中,因此只要我们能证明,上述程序在springboot容器内执行的时候,如果可以通过myapp1_service_zk来访问到zk的话,说明上述理论成功)
docker cp xxx.jar springboot1:/ #cp java程序到springboot1的机器中
6.启动java程序,验证是否连接,执行
java -jar xxx.jar myapp1_service_zk
返回对应的节点数据(这里我提前在zk上创建过数据了,所以运行程序能返回结果,否则会返回/test节点不存在
这样我们不需要管docker swam启动的时候,各个容器分配的随机ip地址,而是可以由我们自己定义一个服务名称,来帮助我们在标准功能中提前定义好各个服务的地址,从而简化部署。