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

在上一篇文章《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下载,地址是:https://github.com/zq2599/docker_dubbo_all_in_one,里面有三个文件夹,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注册中心,具体的代码我们会在下一章详细介绍;

下载地址是:https://github.com/zq2599/docker_dubbo_all_in_one,里面有三个文件夹,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环境下的服务提供者和消费者;

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏finleyMa

docker学习系列7 容器化Node项目

本节我们自己打包一个docker镜像并发布到官方的镜像仓库中。这样任何人只需执行以下命令: docker run -d -p 3000:3000 finley...

531
来自专栏企鹅号快讯

大型网站技术架构:Web 前端性能优化

浏览器访问渲染优化 减少 http 请求数 http 协议是无状态的应用层协议,每次 http 请求都会建立新的通信链路,并且在服务端,每个 http 连接都会...

1856
来自专栏大数据和云计算技术

hadoop运行环境搭建

森哥/洋哥hadoop系列,非常适合初学者: Hive 元数据表结构详解 HDFS学习:HDFS机架感知与副本放置策略 Yarn【label-based sch...

34511
来自专栏about云

Hadoop HTTP web-consoles认证机制

问题导读 1.如何配置 Hadoop HTTP web-consoles 所需要的用户身份验证? 2.哪个配置文件可以配置 Hadoop HTTP认证? 3....

2756
来自专栏云计算教程系列

如何使用fsck - 快速解答

fsck是文件系统一致性检查的缩写,是一个实用程序,用于检查文件系统是否存在错误,并尝试在可能的情况下修复它们。它使用内置工具的组合来检查磁盘并生成其结果的报告...

943
来自专栏乐百川的学习频道

安装和使用Redis

Redis是一个高性能的内存数据库,它体积轻巧性能又高,在企业中被广泛使用。 安装Redis Windows安装 Redis是为Linux系统设计的,但是也有团...

31610
来自专栏云计算教程系列

如何在Ubuntu 16.04上使用PM2和Nginx开发Node.js TCP服务器应用程序

Node.js是一个流行的开源JavaScript运行时环境,它基于Chrome的V8 Javascript引擎构建。Node.js用于构建服务器端和网络应用程...

833
来自专栏ChaMd5安全团队

常见端口转发工具的使用方式

NetCat NetCat是一个非常简单的Unix工具,可以读、写TCP或UDP网络连接。 用途: 1: 侦听/传输模式 2:获取banner信息 3:传输文...

43315
来自专栏苍云横渡学习笔记

【Jenkins 学习笔记】玩转持续集成与持续交付

Jenkins 是一个开源软件项目,是基于Java开发的一种可拓展持续集成工具,主要用于持续、自动地构建 / 测试 / 集成软件项目以及监控一些定时执行的任务

662
来自专栏云计算教程系列

使用GNU Screen管理持久终端会话

GNU Screen是一种与终端会话配合使用的工具,允许用户在断开连接后恢复会话。Screen可防止会话“超时”或断开SSH连接或本地终端仿真器。单个Scree...

912

扫码关注云+社区