Dubbo使用Docker Swarm集群部署

Dubbo是高性能的Java RPC框架
Apache Dubbo (incubating) |ˈdʌbəʊ| 是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。
想要了解Dubbo的请到 官网

Docker Swarm 请看前面的文章Docker Swarm集成搭建 本章只讲在已搭建好的Docker Swarm基础上搭建dubbo 项目Demo源码


创建一个dubbo项目
首先根据 官网提供的示例 创建一个dubbo项目

├── dubbo-api-demo
├── dubbo-consumer-demo
├── dubbo-service-demo
├── dubbo-swarm-demo.iml
└── pom.xml
  • dubbo-consumer-demo 消费者
  • dubbo-service-demo 服务提供者 dubbo对外暴露的端口 12345

修改dubbo-service-demo和dubbo-consumer-demo的pom.xml增加docker的打包插件


        
            
                org.springframework.boot
                spring-boot-maven-plugin
            
            
                com.spotify
                docker-maven-plugin
                ${docker.plugin.version}

                
                    ${docker.image.prefix}/${project.artifactId}
                    src/main/docker
                    
                        
                            /
                            ${project.build.directory}
                            ${project.build.finalName}.jar
                        
                    
                    
                        
                        latest
                    
                
            
        
    

docker.image.prefix 是指私库的地址

LiangdeMacBook-Pro:dubbo-swarm-demo liangbo$ docker images
REPOSITORY                              TAG                 IMAGE ID            CREATED             SIZE
172.16.10.192:5000/dubbo-service-demo   latest              c96376a456a3        6 hours ago         664MB

具体docker的打包在 spring cloud 快速学习教程中有如何使用docker部署的详细说明,这里不做详细说明

打包镜像
先在项目根目录执行

mvn clean install

然后分别在dubbo-service-demo和dubbo-consumer-demo目录执行

mvn package docker:build -Dmaven.test.skip=true

打包镜像后查看 docker images

[root@swarm-m webapp]# docker images
REPOSITORY                                    TAG                 IMAGE ID            CREATED             SIZE
172.16.10.192:5000/dubbo-consumer-demo        latest              426061d84275        31 hours ago        671MB
172.16.10.192:5000/dubbo-service-demo         latest              b690bf7c78be        31 hours ago        664MB

开始部署
先创建一个自定义网络

docker network create --driver overlay --subnet 10.10.11.0/16 my-overlay-network2

查看我的创建的my-overlay-network2网络

[root@swarm-m webapp]# docker network ls
NETWORK ID          NAME                     DRIVER              SCOPE
62da21ffb04c        bridge                   bridge              local
feda5f07db92        docker_gwbridge          bridge              local
098ea2be9f99        host                     host                local
tvzzyrfomhlm        ingress                  overlay             swarm
oyturtdlbonn        my-overlay-network2      overlay             swarm

下面创建 dubbo-service服务

docker service create --name dubbo-service --with-registry-auth --replicas 2 --network my-overlay-network2 --publish 12345:12345 172.16.10.192:5000/dubbo-service-demo
[root@swarm-m webapp]# docker service ps dubbo-service 
ID                  NAME                IMAGE                                          NODE                        DESIRED STATE       CURRENT STATE          ERROR               PORTS
w4ickswerr7p        dubbo-service.1     172.16.10.192:5000/dubbo-service-demo:latest   swarm-node01.nahong.cm.cn   Running             Running 31 hours ago                       
n9nfm12tt5o6        dubbo-service.2     172.16.10.192:5000/dubbo-service-demo:latest   swarm-m.nahong.com.cn       Running             Running 31 hours ago        

创建消费者服务dubbo-consumer-demo

docker service create --name dubbo-consumer --with-registry-auth --replicas 2 --network my-overlay-network2 --publish 8801:8080 172.16.10.192:5000/dubbo-consumer-demo
[root@swarm-m webapp]# docker service ps dubbo-consumer 
ID                  NAME                IMAGE                                           NODE                         DESIRED STATE       CURRENT STATE          ERROR               PORTS
ylq2o4f1m1fw        dubbo-consumer.1    172.16.10.192:5000/dubbo-consumer-demo:latest   swarm-node01.nahong.cm.cn    Running             Running 31 hours ago                       
vj7o9mf8tl2a        dubbo-consumer.2    172.16.10.192:5000/dubbo-consumer-demo:latest   swarm-node02.nahong.com.cn   Running             Running 31 hours ago         

查看docker swarm中的service

[root@swarm-m webapp]# docker service ls
ID                  NAME                           MODE                REPLICAS            IMAGE                                                PORTS
8xmf3ehj46x0        dubbo-consumer                 replicated          2/2                 172.16.10.192:5000/dubbo-consumer-demo:latest        *:8801->8080/tcp
0r5g6szv7yxd        dubbo-service                  replicated          2/2                 172.16.10.192:5000/dubbo-service-demo:latest         *:12345->12345/tcp

去查看注册中心注册的服务,我的注册中心不在docker swarm集群中,因为懒先用之前在其它机器上部署的zookeeper和dubbo-admin


可以看到注册的使用的ip是我创建的自定义网络段10.10.11.0/16,所以四个docker容器实例之间的网络是互通

为什么上面我会提到互通,下面说一下以前遇到的坑

在很久很久以前,使用Dubbo是这样的,都是以单主机的形式


上图中的布局除了nginx服务有外网外,其它和nginx都在内网,它们内网之间是互通的,假如它们在内网的ip如下:

服务器 IP
nginx 192.168.1.10
消费者1 192.168.1.11
消费者2 192.168.1.12
服务1 192.168.1.13
服务2 192.168.1.14
注册中心 192.168.1.15

在后来有了Docker想尝试把这种浪费资源的状态改成节约开的Docker环境部署,具体Docker是什么,去问度娘;我把 消费者1、消费者2、服务3、 服务4 这四台主机减为两台,所以改为以下架构:



假如这种架构的内网ip:

服务器 IP
nginx 192.168.1.10
docker1 192.168.1.11
docker2 192.168.1.12
注册中心 192.168.1.13

现在只剩下四台主机,其中两台docker主机的容器分布:


能看出,Docker容器是有内部的ip,所以这样服务注册到zookeeper的ip就变成了 容器ip,所以消费者访问服务端,是两个跨主机的两个容器访问,这样是不通的,不能访问,如果要让两个跨主机的容器互通 docker 1.10 以上的版本 会有Docker DNS Server 或 joined、主机IP、etcd等来实现;

由于那时刚开始使用docker技术,不太懂,没办法只能把容器的hostname改为宿主机的IP,这样注册到zookeeper的ip就是宿主机的ip了,但是现在docker 1.12以上的版本,自带的swarm集群管理工具,使用自定义网络解决服务发现问题,最终的解决方案:

你可能感兴趣的:(Dubbo使用Docker Swarm集群部署)