基于Docker的dubbo容器,实现简单弹性云扩展
本文章基于该样例进行修改:
git clone https://github.com/binblee/dubbo-docker.git
cd dubbo-docker
ls -l
drwxr-xr-x 4 root root 43 3月 16 16:16 service-api
drwxr-xr-x 4 root root 60 3月 16 16:16 service-consumer
drwxr-xr-x 4 root root 60 3月 16 16:16 service-producer
我们使用zookeeper集群,使用三个节点
修改
service-consumer/src/main/resources/services.xml
service-producer/src/main/resources/services.xml
修改zookeeper配置,一共配置三个节点,使用系统环境变量([12 factor](https://12factor.net/)应用的一个推荐实践之一)
<dubbo:registry protocol="zookeeper" address="${ZOOKEEPER_NODE_01}:2181,${ZOOKEEPER_NODE_02}:2181,${ZOOKEEPER_NODE_03}:2181" />
在maven的顶级目录中编译打包,并安装到本地maven仓库(主要安装api包)
mvn clean compile package install -Dmaven.test.skip=true
第一个Docker镜像
build producer 镜像(使用openjdk基础镜像)
cd service-producer
vi Dockerfile
FROM openjdk:8-jre
VOLUME /tmp
COPY target/*.jar /app.jar
RUN sh -c 'touch /app.jar'
CMD ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
docker build -t dubbo-producer .
第二个Docker镜像
build consumer 镜像(使用openjdk基础镜像)
cd service-consumer
vi Dockerfile
FROM openjdk:8-jre
VOLUME /tmp
COPY target/*.jar /app.jar
RUN sh -c 'touch /app.jar'
CMD ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
docker build -t dubbo-consumer .
第三个Docker镜像
build dubbo-admin 镜像(使用openjdk基础镜像)
本文使用dubbo源码自己打dubbo-admin的war包
git clone https://github.com/alibaba/dubbo.git
配置dubbo-admin管理控制台的zookeeper集群地址
cd dubbo/dubbo-admin/src/main/webapp/WEB-INF
vi dubbo.properties
dubbo.registry.address=zookeeper://${ZOOKEEPER_NODE_01}:2181?backup=${ZOOKEEPER_NODE_02}:2181,${ZOOKEEPER_NODE_03}:2181
打包,跳过测试
mvn clean compile package install -Dmaven.test.skip=true
cd dubbo/dubbo-admin
vi Dockerfile
FROM openjdk:8-jre
ADD apache-tomcat-8.0.33.tar.gz /opt
RUN rm -rf /opt/apache-tomcat-8.0.33/webapps/ROOT
COPY target/dubbo-admin-2.5.4-SNAPSHOT.war /opt/apache-tomcat-8.0.33/webapps/ROOT.war
CMD ["/opt/apache-tomcat-8.0.33/bin/catalina.sh", "run"]
本例使用了apache-tomcat-8.0.33请自行下载
docker build -t dubbo-admin .
编辑docker-compose准备自动编排
vi docker-compose.yml
version: '2'
services:
zookeeper-node-01:
image: zookeeper
restart: always
container_name: dubbo-zookeeper-node-01
ports:
- "2181:2181"
environment:
ZOO_MY_ID: 1
ZOO_SERVERS: server.1=zookeeper-node-01:2888:3888 server.2=zookeeper-node-02:2888:3888 server.3=zookeeper-node-03:2888:3888
zookeeper-node-02:
image: zookeeper
restart: always
container_name: dubbo-zookeeper-node-02
ports:
- "2182:2181"
environment:
ZOO_MY_ID: 2
ZOO_SERVERS: server.1=zookeeper-node-01:2888:3888 server.2=zookeeper-node-02:2888:3888 server.3=zookeeper-node-03:2888:3888
zookeeper-node-03:
image: zookeeper
restart: always
container_name: dubbo-zookeeper-node-03
ports:
- "2183:2181"
environment:
ZOO_MY_ID: 3
ZOO_SERVERS: server.1=zookeeper-node-01:2888:3888 server.2=zookeeper-node-02:2888:3888 server.3=zookeeper-node-03:2888:3888
producer:
image: 'producer:latest'
container_name: dubbo-producer
environment:
- ZOOKEEPER_NODE_01=zookeeper-node-01
- ZOOKEEPER_NODE_02=zookeeper-node-02
- ZOOKEEPER_NODE_03=zookeeper-node-03
consumer:
image: 'consumer:latest'
container_name: dubbo-consumer
environment:
- ZOOKEEPER_NODE_01=zookeeper-node-01
- ZOOKEEPER_NODE_02=zookeeper-node-02
- ZOOKEEPER_NODE_03=zookeeper-node-03
- SERVER_PORT=8899
ports:
- 8899
dubbo-admin:
image: 'dubbo-admin:latest'
container_name: dubbo-admin
environment:
- ZOOKEEPER_NODE_01=zookeeper-node-01
- ZOOKEEPER_NODE_02=zookeeper-node-02
- ZOOKEEPER_NODE_03=zookeeper-node-03
ports:
- 8003:8080
后台启动
docker-compose up -d
停止
docker-compose stop
强制删除(动态扩展的容器也可以一并删除)
docker-compose rm -f
先配置zookeeper集群,一共三个节点
导出consumer的8899端口,在宿主机上会随机映射端口,可以通过docker ps查看
dubbo-admin控制台使用8003端口
http://yourip:对应用随机端口
你可以看到Greetings from Dubbo Docker
http://yourip:8003
进入dubbo-admin管理控制台
账号密码可以在dubbo.properties中修改,我们使用root/root
如果已安装shipyard等管理工具(可参考:http://crabdave.iteye.com/blog/2362149),可以对其中的producer 和 consumer进行动态scale 横向扩展指定个数的容器,实现简单的弹性扩展
在扩展后可以观察当前 consumer 调用的是哪个producer
可以修改consumer和producer中的java文件记录ip地址,然后再调用时进行观察
consumer 调用的是哪个producer
修改consumer中的Application.java
修改producer中的GreetingsImpl.java
修改文件见附件
页面调用显示:
Greetings from (Producer IP: ip:172.21.0.2 ip:127.0.0.1 )Dubbo Docker (Consumer IP: ip:172.21.0.5 ip:127.0.0.1 )
其中调用的Producer地址一直在变化(scale两个Producer和两个consumer)
/**
* 获取本地IP地址
* @return
* @throws SocketException
*/
private static String getLocalIP() throws SocketException {
Enumeration allNetInterfaces = NetworkInterface.getNetworkInterfaces();
InetAddress ip = null;
StringBuffer str=new StringBuffer();
while (allNetInterfaces.hasMoreElements())
{
NetworkInterface netInterface = (NetworkInterface) allNetInterfaces.nextElement();
System.out.println(netInterface.getName());
Enumeration addresses = netInterface.getInetAddresses();
while (addresses.hasMoreElements())
{
ip = (InetAddress) addresses.nextElement();
if (ip != null && ip instanceof Inet4Address)
{
System.out.println("本机的IP = " + ip.getHostAddress());
str.append(" ip:").append(ip.getHostAddress()).append(" ");
}
}
}
return str.toString();
}