二.Docker之Springboot容器和Zk容器之间用服务名调用

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地址,而是可以由我们自己定义一个服务名称,来帮助我们在标准功能中提前定义好各个服务的地址,从而简化部署。

你可能感兴趣的:(docker,spring,boot,容器)