360SDN.COM

首页/Java/列表

基于SpringCloud开发的微服务在Docker Swarm集群中跨Host主机通信的一种解决方案

来源:  2018-01-03 14:04:12    评论:0点击:

一、前言

        当我们开发好微服务(笔者是基于SpringCloud开发的微服务)之后,考虑到灵活快速持续部署的需要,通常会考虑将其Docker镜像化并在Docker环境下运行。由于微服务个数通常会较多,把所有微服务部署在一台docker主机上是不现实的,因此需要考虑到跨主机通信的问题,对实际部署必然会提出以下几点要求:
        1. 微服务作为一个docker container可以在任意host上运行;
        2. 同一host上可以运行多个相同的微服务;
        3. 运行在同一个host上的微服务之间可以相互通信;
        4. 运行在不同host上的微服务也可以相互通信;
        5. 每个微服务的ip地址不受host所在本地局域网ip地址段限制,即拥有独立网段,避免占用本地IP地址,同时确保container数量受限尽量小;
        6. 每个微服务container避免通过端口暴露的方式相互通信,确保不会因端口独占而导致无法灵活部署。
 
        综上原因,笔者研究并采用在docker swarm模式下将各微服务加入同一个overlay network网络的方式实现微服务之间的相互通信。

二、总体架构图

        

       说明:

  • 如图所示,假设本地局域网段10.159.62.0/24中存在主机10.159.62.231,10.159.62.232和10.159.62.233互联互通
  • 每个主机上都运行dockerengine,通过docker engine运行若干个docker container,例如图中的Order,Billing等等。
  • 将这3台主机建立成为一个dockerswarm集群
  • 创建一个docker overlay网络(网段10.10.0.0/24),每个主机上的container都被加入到该overlay网络中,通过overlay网络实现跨主机的container相互通信
  • 假设console,terminal和api这三个服务均需要暴露端口到物理网络,因为物理网络10.159.62.0/24无法直接访问overlay网络中的container,需要container中映射端口到物理网络。
  • overlay网络中的container默认通过与主机之间的bridge访问物理网络。

三、创建Swarm 集群

        1. 在主机231上创建管理节点
    $ docker swarm init --advertise-addr 10.159.62.231
        

        执行完会显示token,例如SWMTKN-1-0t7yro4d6rtkn6eecw58od4m18lswr181k9z028x219q3cxlsg-366f5j9x1fuvo7jnxwa7bxz0z

        创建工作节点时需要引用该token,Manager和Worker节点之间通信端口是2377

        
    2. 在主机232上创建工作节点
   $ docker swarm join --token SWMTKN-1-0t7yro4d6rtkn6eecw58od4m18lswr181k9z028x219q3cxlsg-366f5j9x1fuvo7jnxwa7bxz0z10.159.62.231:2377
 
   3.在主机231上创建工作节点
   $ docker swarm join --token SWMTKN-1-0t7yro4d6rtkn6eecw58od4m18lswr181k9z028x219q3cxlsg-366f5j9x1fuvo7jnxwa7bxz0z 10.159.62.231:2377

四、构建Overlay network

       在管理节点主机231上执行
       
$ docker network create -d overlay \
  --subnet=10.10.0.0/16 \
  --gateway=10.10.0.254 \
  --attachable=true \
overlay

五、部署服务

根据上文架构图中所示分别在各主机上执行类似的命令,将各微服务docker container启动起来。
对于不需要暴露端口的微服务,命令类似如下
$ docker run --name order --network=overlay 10.159.62.231/somecom/order:1.0.0 &

对于需要暴露端口的微服务,命令类似如下:

$ docker run --name -p 9769:8769 api --network=overlay 10.159.62.231/somecom/api:1.0.0 &

六、验证测试

由于对于读者而言并不知道文中各微服务之间的关系,所以不从服务调用方面测试微服务之间可达,而通过代表各微服务的docker container间的ping ip的方式测试验证。
 
1. 查看231上已经启动的container
$ docker ps
CONTAINER ID        IMAGE                                                                                COMMAND                  CREATED             STATUS              PORTS                                            NAMES
585c46f5f8fb        10.159.62.231/somecom/console:3.0.0                "/bin/sh -c 'java ..."    5 hours ago         Up 5 hours          22/tcp, 0.0.0.0:9086->8086/tcp   console
10e61f6fe11e        10.159.62.231/somecom/terminal:3.0.0               "/bin/sh -c 'java ..."   5 hours ago         Up 5 hours          22/tcp, 0.0.0.0:9088->8088/tcp   terminal
 
2. 查看其中console的overlay network ip地址
$ docker inspect -f {{.NetworkSettings.Networks.overlay.IPAMConfig.IPv4Address}} 585c46f5f8fb
10.10.0.2
 
3. 查看232上已经启动的container
CONTAINER ID        IMAGE                                                          COMMAND                  CREATED             STATUS              PORTS                            NAMES
31411d3g33g1       10.159.62.231/somecom/sso:3.0.0        "/bin/sh -c 'java ..."   5 days ago          Up 5 days           22/tcp, 8085/tcp                  sso
151f48b3130b        10.159.62.231/somecom/api:3.0.0        "/bin/sh -c 'java ..."    5 days ago          Up 5 days           0.0.0.0:9769->8769/tcp      api
 
4. 查看api对应的pid
$ docker inspect -f {{.State.Pid}} 31411d3g33g1
22256
 
5. 进入container,ping 10.10.0.2
$ nsenter --target 22256 --mount --uts --ipc --net --pid
root@585c46f5f8fb:/#   ping 10.10.0.2
64 bytes from 10.10.0.2: icmp_seq=0 ttl=64 time=0.049 ms
64 bytes from 10.10.0.2: icmp_seq=1 ttl=64 time=0.038 ms
64 bytes from 10.10.0.2: icmp_seq=2 ttl=64 time=0.042 ms
64 bytes from 10.10.0.2: icmp_seq=3 ttl=64 time=0.055 ms
 
至此,验证跨主机的container之间通过overlay network互联成功。
 

本文为笔者原创,转载请注明出处。

来源:http://cache.baiducontent.com/c?m=9f65cb4a8c8507ed4fece7631046893b4c4380146d96864968d4e414c42246121935a2e274351770839e2c3c1cfc091ab1a168252a5577f1c893d60bc0be982e2c8e2c34700b87354c8e48fc8d1d789d5cd705feae6fe1adf036c7ec93c4de2250de16583ad6ff9c2a7003be64e76230f4d0ea5f142f51f8ad6b39aa4e7659ce7d1df111eee1427977f5e1ae2f5bb32fc7121180ae45a74e15a262a2081a5453d13ba67b513131905857fa534973859a2af05e7a5722c65fc5bfd6c0985f8dacbc6cc9a39cef389511a780b9b92e557122ed55cfbccec62a154f15a9b9c917b425cafefbcc4efe15a7072cce4a012a7ccf1bcedfce11e5632ae3916ce95d2731587ac8c707e874007840de296bbb08b677a6ff715cdd9a8af8980234a98ec4036088ada832c77a0f53fb514601baf34176658e7c0c8ba4ae7ea70b13d7cd17c1770dec6f056e8bf3c5fccf1cbe&p=937d8d1781904ead08e2947e0e55c1&newp=8a769a47c0962db419bd9b7e0d15c1231610db2151d7db146b82c825d7331b001c3bbfb423251202d2c5786d02a4435becfb307237012ba3dda5c91d9fb4c574799e72586b5d&user=baidu&fm=sc&query=%BB%F9%D3%DASpringCloud%BF%AA%B7%A2%B5%C4%CE%A2%B7%FE%CE%F1%D4%DADocker+Swarm%BC%AF%C8%BA%D6%D0%BF%E7Host%D6%F7%BB%FA%CD%A8%D0%C5%B5%C4%D2%BB%D6%D6%BD%E2%BE%F6%B7%BD%B0%B8&qid=c0e489b700007d99&p1=1
为您推荐

友情链接 |九搜汽车网 |手机ok生活信息网|ok生活信息网|ok微生活
 Powered by www.360SDN.COM   京ICP备11022651号-4 © 2012-2016 版权