1. 程式人生 > >Docker下dubbo開發,三部曲之二:本地環境搭建

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 [email protected]: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 <[email protected]>

#定義工作目錄
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註冊中心,具體的程式碼我們會在下一章詳細介紹;

和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 <[email protected]>

#定義工作目錄
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原始碼地址是:[email protected]: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本地搭建的整個過程,經過本章的實戰,我們已經能夠根據自己的需求訂製dubbo環境了,下一章是dubbo學習的終章,我們一起實戰編碼,學會開發dubbo環境下的服務提供者和消費者;

相關推薦

Dockerdubbo開發三部曲本地環境搭建

在上一篇文章《Docker下dubbo開發,三部曲之一:極速體驗》中,我們快速體驗了dubbo服務的註冊、發現、呼叫,今天我們一起在本地製作一套這樣的環境,經過這次實戰,大家就可以根據實際需求對自己的環境量身定製了。 基礎架構 整個環境由四個容器組成,梳

Docker的Spring Cloud三部曲細說Spring Cloud開發

本文是《Docker下的Spring Cloud三部曲》系列的第二篇,詳細講解上一篇例項中用到的eureka、provider、consumer等三個應用的開發過程; 環境資訊 回顧一下實戰環境,如下圖: 原始碼地址 上圖的eureka、

DockerJava檔案上傳服務三部曲服務端開發

本章是《Docker下Java檔案上傳服務三部曲》的第二篇,上一章《Docker下Java檔案上傳服務三部曲之一:準備環境》我們把客戶端準備好了,Tomcat容器也部署好了,今天就來開發和部署檔案服務的後臺應用吧; 本章實戰內容概要 本章要建立三個w

kubernetes的Nginx加Tomcat三部曲細說開發

本文是《kubernetes下的Nginx加Tomcat三部曲》的第二章,在《kubernetes下的Nginx加Tomcat三部曲之一:極速體驗》一文我們快速部署了Nginx和Tomcat,達到以下效果: 本文我會詳細說明在kubernetes部署上述網

Docker實戰zabbix三部曲監控其他機器

在上一章《Docker下實戰zabbix三部曲之一:極速體驗》中,我們快速安裝了zabbix server,並登入管理頁面查看了zabbix server所在機器的監控資訊,但是在實際場景中,應該是對應用伺服器做監控,所以今天我們來實戰將應用伺服器的監控加入到zabbix server中。 全系列文章連結:

自定義spring boot starter三部曲實戰開發

本文是《自定義spring boot starter三部曲》的第二篇,上一篇中我們通過學習spring cloud的starter,對spring boot的starter有了初步瞭解,也設計好了實戰內容,今天就來一起實現; 三部曲文章連結 《自定義spring boot

maven構建docker映象三部曲編碼和構建映象

在《maven構建docker映象三部曲之一:準備環境》中,我們在vmware上準備好了ubuntu16虛擬機器,並且裝好了docker、jdk8、maven等必備工具,現在我們來開發一個java web工程,再用docker-maven-plugin外掛來

Docker搭建disconf環境三部曲細說搭建過程

Docker下的disconf實戰全文連結 《Docker搭建disconf環境,三部曲之一:極速搭建disconf》; 《Docker搭建disconf環境,三部曲之二:本地快速構建disconf映象》; 《Docker搭建disconf環境,三部曲之三:細說搭建過程》; 《Docker下使用discon

spring4.1.8初始化原始碼學習三部曲setConfigLocations方法

本章是學習spring4.1.8初始化原始碼的第二篇,前一章《spring4.1.8初始化原始碼學習三部曲之一:AbstractApplicationContext構造方法》對AbstractApplicationContext的初始化做了分析,本章我們聚焦

【U3D系統架構教程——開發篇】Log日誌系統2.0

這篇文章由唐三胖ヾ(•ω•`)o網路整理總結,將告訴你如何開發一個高效率的日誌系統。 通過這篇文章,你可以知道 1)C#特性Condtional 2)開發2.0版的日誌系統 開篇介紹 通過上一章節的介紹,我們已經實現了重寫的日誌

elasticsearch實戰三部曲文件操作

本文是《elasticsearch實戰三部曲》系列的第二篇,上一篇文章我們動手熟悉了索引相關的基本操作,現在一起來熟悉文件相關的操作; 系列文章連結 《elasticsearch實戰三部曲之一:索引操作》; 《elasticsearch實戰三部曲之二:文件操作》;

實戰maven私有倉庫三部曲上傳到私有倉庫

在上一章《實戰maven私有倉庫三部曲之一:搭建和使用》我們搭建了maven私有倉庫,並體驗了私有倉庫快取jar包的能力,避免了局域網內開發人員去遠端中央倉庫下載的痛苦等待,本章我們再來體驗私有倉庫的另一個功能:儲存二方庫; 使用場景 mvndemos

docker容器自動化部署落地實踐搭建gitlab(上)

在自動化部署工程的時候 version control這裡會起到一個很重要的作用 當我們完成一段程式碼需要部署的時候 那麼push到version control 讓他幫我們去告訴持續整合工具 說需要構建部署了 那麼持續整合工具才會去弄 本篇文章的gitlab版本非最新版本

CDH5部署三部曲部署和設定

### 歡迎訪問我的GitHub [https://github.com/zq2599/blog_demos](https://github.com/zq2599/blog_demos) 內容:所有原創文章分類彙總及配套原始碼,涉及Java、Docker、Kubernetes、DevOPS等; ### 本

Flink on Yarn三部曲部署和設定

### 歡迎訪問我的GitHub [https://github.com/zq2599/blog_demos](https://github.com/zq2599/blog_demos) 內容:所有原創文章分類彙總及配套原始碼,涉及Java、Docker、Kubernetes、DevOPS等; 本文是《

CDH+Kylin三部曲部署和設定

### 歡迎訪問我的GitHub [https://github.com/zq2599/blog_demos](https://github.com/zq2599/blog_demos) 內容:所有原創文章分類彙總及配套原始碼,涉及Java、Docker、Kubernetes、DevOPS等; ###

CoProcessFunction實戰三部曲狀態處理

### 歡迎訪問我的GitHub [https://github.com/zq2599/blog_demos](https://github.com/zq2599/blog_demos) 內容:所有原創文章分類彙總及配套原始碼,涉及Java、Docker、Kubernetes、DevOPS等; ###

LVS負載均衡LVS-NAT搭建web群集

ice 其余 連接方式 rest show MF Oz service 高可用 實現LVS的NAT模式 其原理及特點詳細介紹請看LVS負載均衡之一:LVS-NAT、LVS-DR模式的原理詳細介紹 1.實驗環境 IP地址規劃 客戶端訪問服務的請求IP地址:VIP 12.0.0

MQTT研究mosquitto環境搭建

環境資訊: 1. Linux Centos7.2 環境,CPU 2核,記憶體8G. 2. mosquitto版本:mosquitto-1.5.4 官網:http://mosquitto.org/download/libwebsockets官網: https://libwebsockets.org/ 本

DockerRabbitMQ延時佇列實戰兩部曲細說開發

本章是《Docker下RabbitMQ延時佇列實戰兩部曲》的終篇,上一章《Docker下RabbitMQ延時佇列實戰兩部曲之一:極速體驗》我們快速體驗了延時佇列的生產和消費,今天來實戰整個開發過程; SpringBoot框架下進行RabbitMQ開發,相關