基于Docker的dubbo容器,实现简单弹性云扩展

基于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();
    }

 

猜你喜欢

转载自crabdave.iteye.com/blog/2363576