社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  docker

Docker下dubbo开发,三部曲之二:本地环境搭建

zq2599 • 7 年前 • 602 次点击  

在上一篇文章《Docker下dubbo开发,三部曲之一:极速体验》中,我们快速体验了dubbo服务的注册、发现、调用,今天我们一起在本地制作一套这样的环境,经过这次实战,大家就可以根据实际需求对自己的环境量身定制了。

基础架构

整个环境由四个容器组成,梳理后相互之间的关系如下图:

这里写图片描述

接下来我们按照下面的表格来设计和制作对应的镜像:

容器 作用 镜像 功能 link连接
zk_server 注册中心 zookeeper:3.3.6 官方镜像
dubbo_admin 管理平台 bolingcavalry/dubbo_admin_tomcat 定制镜像,用tomcat官方镜像加dubbo_admin.war生成 用别名zkhost连接zk_server
dubbo_provider 服务提供者 bolingcavalry/dubbo_provider_tomcat 定制镜像,用tomcat官方镜像加dubboserviceprovider.war文件生成 用别名zkhost连接zk_server
dubbo_consumer 服务消费者 bolingcavalry/online_deploy_tomcat 定制镜像,是个支持在线部署的tomcat

特别关注

dubbo_provider和dubbo_consumer是分别用来提供服务和消费服务的,其实是两个web应用被部署在不同的容器中,一般来说把web应用在docker的tomcat容器中运行起来有两种方式:
1. 写Dockerfile文件做一个定制镜像,用tomcat官方镜像做基础镜像,在Dockerfile中将war包复制到tomcat的webapps目录下,dubbo_admin和dubbo_provider都是用这种方式;
2. 运行一个支持在线部署的tomcat容器,然后在线部署war包,具体细节请看《实战docker,编写Dockerfile定制tomcat镜像,实现web应用在线部署》,dubbo_consumer用的就是这种方式;

很明显,第一种方式用起来更简单,在docker-compose.yml中把镜像指定了就行,而第二种方式略为麻烦,要自己动手去部署war包;

读者们可能会有疑问:既然第一种方式简单,为什么dubbo_consumer不用这种方式部署呢?其实我之前是用过的,只是在启动应用的时候会失败才改成了第二种,详细原因请看《Docker下部署dubbo,消费者应用无法使用link参数的问题》

下面我们开始本地搭建dubbo体验环境的过程,首先把所有步骤列出来,然后逐个实现:
1. 镜像zk_server不用制作,pull即可;
2. 制作镜像dubbo_admin;
3. 制作镜像dubbo_provider;
4. 镜像dubbo_consumer不用制作,pull即可;
5. 制作docker-compose.yml文件;
6. 启动所有容器;
7. 下载、编译dubbo_consumer对应的源码,在线部署到dubbo_consumer容器;
8. 开始体验;

开始啦:

镜像:zk_server

zk_server的作用是注册中心,其他几个容器都会用到,自身是个普通的zookeeper,这里我们用官方镜像,启动一个单机实例即可;

镜像:dubbo_admin

这是dubbbo的管理平台,是个web应用,部署在tomcat下,需要我们手工定制;
首先我们要准备war包,有两种方式得到war包:
1. 我已经编译好了,在我的github下载,地址是:github.com/zq2599/dock…,里面有三个文件夹,dubbo_tomcat目录下的dubbo-admin.war文件就是我们需要的war包;
2. 去dubbo的github仓库下载官方源码,然后自己动手编译,一共需要四步完成,如下:
2.1 执行 git clone git@github.com:alibaba/dubbo.git,下载dubbo源码;
2.2 下载后,打开dubbo/dubbo-admin/src/main/webapp/WEB-INF/dubbo.properties这个文件,修改 dubbo.registry.address这个参数的值,修改后 dubbo.registry.address=zookeeper://zkhost:2181
2.3 进入dubbo-admin子目录,执行命令 mvn clean package -U -Dmaven.test.skip=true
2.4 mvn执行完成后,在dubbo/dubbo-admin/target目录下找到dubbo-admin-2.5.4-SNAPSHOT.war文件,重命名为dubbo-admin.war;

得到war包后,我们开始制作Dockerfile文件,内容很简单,就是以tomcat官方镜像为基础,复制dubbo-admin.war文件到镜像中,另外为了让访问url更短,我们把tomcat镜像的server.xml替换掉,新的server.xml中把webapps/dubbo-admin目录配制成了url的根目录,这样只要输入localhost:8080就能访问dubbo-admin的目录了;

先看server.xml,内容如下:

<?xml version='1.0' encoding='utf-8'?>
<Server port="8005" shutdown="SHUTDOWN">
  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  <Listener className="org.apache.catalina.core.JasperListener" />
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />

  <GlobalNamingResources>
    <Resource name="UserDatabase" auth="Container"
              type="org.apache.catalina.UserDatabase"
              description="User database that can be updated and saved"
              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
              pathname="conf/tomcat-users.xml" />
  </GlobalNamingResources>
  <Service name="Catalina">
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
    <Engine name="Catalina" defaultHost="localhost">
      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>
      </Realm>
      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log." suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />
        <Context path="" docBase="/usr/local/tomcat/webapps/dubbo-admin" debug="0" reloadable="true" crossContext="true"/>        
      </Host>
    </Engine>
  </Service>
</Server>

Dockerfile内容如下:

# Docker image of dubbo-admin webapp tomcat
# VERSION 0.0.1
# Author: bolingcavalry

#基础镜像使用tomcat:7.0.77-jre8
FROM tomcat:7.0.77-jre8

#作者
MAINTAINER BolingCavalry <zq2599@gmail.com>

#定义工作目录
ENV TOMCAT_BASE /usr/local/tomcat

#复制配置文件
COPY ./server.xml $TOMCAT_BASE/conf/

#复制war包
COPY ./dubbo-admin.war $TOMCAT_BASE/webapps/

#给配置文件增加读权限
RUN chmod a+xr $TOMCAT_BASE/conf/server.xml

#删除默认的ROOT文件件
RUN rm -rf $TOMCAT_BASE/webapps/ROOT

把Dockerfile,server.xml,dubbo-admin.war三个文件放在同一个目录下,然后打开控制台进入这个目录,执行以下命令构建镜像:

docker build -t bolingcavalry/dubbo_admin_tomcat:0.0.1 .

执行完毕后构建dubbo_admin镜像成功,通过docker images命令可以看到;

镜像:dubbo_provider

这个镜像是个tomcat容器,里面运行了一个war包,功能是提供服务并注册到dubbo注册中心,具体的代码我们会在下一章详细介绍;

下载地址是:github.com/zq2599/dock…,里面有三个文件夹,provider_tomcat目录下的dubboserviceprovider.war文件就是我们需要的war包;

和dubbo_admin一样,我们也配置了server.xml:

<?xml version='1.0' encoding='utf-8'?>
<Server port="8005" shutdown="SHUTDOWN">
  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  <Listener className="org.apache.catalina.core.JasperListener" />
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
  <GlobalNamingResources>
    <Resource name="UserDatabase" auth="Container"
              type="org.apache.catalina.UserDatabase"
              description="User database that can be updated and saved"
              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
              pathname="conf/tomcat-users.xml" />
  </GlobalNamingResources>
  <Service name="Catalina">
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
    <Engine name="Catalina" defaultHost="localhost">
      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>
      </Realm>
      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log." suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />
        <Context path="" docBase="/usr/local/tomcat/webapps/dubboserviceprovider" debug="0" reloadable="true" crossContext="true"/>        
      </Host>
    </Engine>
  </Service>
</Server>

接下来是Dockerfile文件,内容也很简单,复制war,替换server.xml,删除原有的root目录:




    
# Docker image of dubbo-admin webapp tomcat
# VERSION 0.0.1
# Author: bolingcavalry

#基础镜像使用tomcat:7.0.77-jre8
FROM tomcat:7.0.77-jre8

#作者
MAINTAINER BolingCavalry <zq2599@gmail.com>

#定义工作目录
ENV TOMCAT_BASE /usr/local/tomcat


#复制配置文件
COPY ./server.xml $TOMCAT_BASE/conf/

#复制war包
COPY ./dubboserviceprovider.war $TOMCAT_BASE/webapps/

#给配置文件增加读权限
RUN chmod a+xr $TOMCAT_BASE/conf/server.xml

#删除默认的ROOT文件件
RUN rm -rf $TOMCAT_BASE/webapps/ROOT

把Dockerfile,server.xml,dubboserviceprovider.war三个文件放在同一个目录下,然后打开控制台进入这个目录,执行以下命令构建镜像:

docker build -t bolingcavalry/dubbo_provider_tomcat:0.0.1 .

执行完毕后构建dubbo_provider镜像成功,通过docker images命令可以看到;

镜像:dubbo_consumer

dubbo_consumer也是web应用,前面已说过此应用的部署方式和dubbo_provider不同,是在线部署,所以镜像文件用bolingcavalry/online_deploy_tomcat:0.0.1,此镜像已发布到hub.docker.com,可以直接使用,它里面有个tomcat,支持提过maven插件在线部署,有关此镜像的详情请看《实战docker,编写Dockerfile定制tomcat镜像,实现web应用在线部署》,请记得修改maven的配置文件,否则在线部署的鉴权无法通过;

dubbo_consumer对应的war包需要下载对应的源码,然后编译部署,这个我们后面会讲到;

制作docker-compose.yml

docker-compose.yml内容如下:

version: '2'
services:
  zk_server: 
    image: daocloud.io/library/zookeeper:3.3.6
    restart: always
  dubbo_admin: 
    image: bolingcavalry/dubbo_admin_tomcat:0.0.1
    links: 
      - zk_server:zkhost
    depends_on:
          - "zk_server"
    ports: 
      - "8080:8080"
    restart: always
  dubbo_provider: 
    image: bolingcavalry/dubbo_provider_tomcat:0.0.1
    links: 
      - zk_server:zkhost
    depends_on:
          - "dubbo_admin"
    environment:
      TOMCAT_SERVER_ID: dubbo_provider_tomcat
    restart: always
  dubbo_consumer: 
    image: bolingcavalry/online_deploy_tomcat:0.0.1
    ports: 
      - "8082:8080"
    environment:
      TOMCAT_SERVER_ID: dubbo_consumer_tomcat
    restart: always

这里面使用了depends_on参数,是为了保证启动顺序;

启动所有容器

执行命令:

docker-compose up -d

多个容器启动成功,如下图:

这里写图片描述

dubbo_consumer对应的源码编译和在线部署

编译代码前,要先确定zookeeper的ip,前面执行docker-compose up -d的时候,控制台提示zookeeper容器的名称是16_zk_server_1,因此执行以下命令可看zookeeper容器ip:

docker exec -it 16_zk_server_1 ip a

如下图红框,ip是172.28.0.3

这里写图片描述

现在开始下载和编译源码了,dubbo消费者的webapp源码地址是:git@github.com:zq2599/blog_demos.git,里面有多个工程,本次实战用到的工程是dubbo_service_consumer,如下图红框所示:

这里写图片描述

代码下载后,在dubbo_service_consumer/src/main/resources目录下,打开spring-extends.xml文件,修改下图红框中的ip,改成zookeeper的ip:172.28.0.3:

这里写图片描述

执行命令 mvn clean package -U -Dmaven.test.skip=true tomcat7:redeploy

mvn执行完成后,web应用已经部署到dubbo_consumer的tomcat上;

开始体验

现在本地环境搭建已经完成,可以开始体验了,体验步骤和《Docker下dubbo开发,三部曲之一:极速体验》中的体验环节一致,就不在此赘述了,简单来说分为以下两步:
1. 在dubbo-admin的web页面上查看服务提供者、消费者的注册情况,地址是 http://localhost:8080
2. 在dubbo_consumer的web页面上验证远程调用,地址是http://localhost:8082/dubboserviceconsumer/add

以上就是docker下dubbo本地搭建的整个过程,经过本章的实战,我们已经能够根据自己的需求订制dubbo环境了,下一章是dubbo学习的终章,我们一起实战编码,学会开发dubbo环境下的服务提供者和消费者;


今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/Em84f2EUjm
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/11230
 
602 次点击