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集群管理工具,使用自定义网络解决服务发现问题,最终的解决方案: