基於Docker 5分鐘搭建攜程Apollo分佈式配置中心

前言

由於一開始對Apollo的架構方式瞭解的不夠升入,同時爲了能夠使得安裝過程更加的簡單,做到一條指令實現Apollo環境的搭建,經歷了比較多的測試;本文基於apollo 1.6.0的版本進行編譯打包的,後面會將整個鏡像的創建過程逐一的列舉出來,避免想了解的朋友再次花時間去研究;

什麼是Apollo

攜程官方Apollo倉庫對該分佈式配置中心做了詳細的說明,這裏就不再對起解析過多的解釋,官方文檔永遠是最新、最全、最權威的介紹,下面只引用官方的一張圖來簡單說明一下;

總體設計

file

上圖簡要描述了Apollo的總體設計,我們可以從下往上看:

  • Config Service
    提供配置的讀取、推送等功能,服務對象是Apollo客戶端
  • Admin Service
    提供配置的修改、發佈等功能,服務對象是Apollo Portal(管理界面)
  • Config ServiceAdmin Service都是多實例無狀態部署,所以需要將自己註冊到Eureka中並保持心跳
  • 在Eureka之上我們架了一層Meta Server用於封裝Eureka的服務發現接口
  • Client通過域名訪問Meta Server獲取Config Service服務列表(IP+Port),而後直接通過IP+Port訪問服務,同時在Client側會做load balance、錯誤重試
  • Portal通過域名訪問Meta Server獲取Admin Service服務列表(IP+Port),而後直接通過IP+Port訪問服務,同時在Portal側會做load balance、錯誤重試
  • 爲了簡化部署,我們實際上會把Config Service、Eureka和Meta Server三個邏輯角色部署在同一個JVM進程中

修改流程圖

file

更多詳細的介紹,請通讀官方,讀官方,官方,方的文檔,讀完之後,詳細你會對Apollo有一個全面及系統的認識;這裏主要是想如何以最快的方式將環境搭建起來。

Docker 安裝apollo

Docker安裝及基礎操作

參考此:CentOS 7下安裝Docker及基礎操作 博客,這裏不是重點,所以也就不做過多的說明及解釋

鏡像介紹

  • apollo-portal
    docker pull pengfeilu/apollo-portal:1.6.0
    
  • apollo-configservice
    docker pull pengfeilu/apollo-configservice:1.6.0
    
  • apollo-adminservice
    docker pull pengfeilu/apollo-adminservice:1.6.0
    
  • apollo-mysql
    // 該鏡像基於mysql 5.7.22版本允許時自動執行了apollo 1.6.0版本中相關的sql
    // 通俗一點說就是鏡像啓動之後數據庫裏面就包含apollo默認的相關數據庫
    docker pull pengfeilu/apollo-mysql:5.7.22_1.6.0
    

安裝Apollo

  • 創建一個apollo環境管理的配置文件

    // 這個文件是用於配置apollo-portal管理的各個環境的Eureka地址
    vim apollo-env.properties
    // 創建好之後添加以下配置
    
    #本地默認環境配置,沒啥用
    local.meta=http://localhost:8080
    #下面的環境,你有幾個就添加幾個,沒有的或者不需要的可以直接刪掉
    dev.meta=http://fill-in-dev-meta-server:8080
    fat.meta=http://fill-in-fat-meta-server:8080
    uat.meta=http://fill-in-uat-meta-server:8080
    lpt.meta=http://fill-in-lpt-meta-server:8080
    pro.meta=http://fill-in-pro-meta-server:8080
    
  • 創建docker-conpose.yml文件

    // 任意目錄下創建docker-compose.yml
    vim docker-compose.yml
    // 並在文件中添加一下內容
    
    version: "3"
    
    services:
      apollo-mysql:
        container_name: apollo-mysql
        image: pengfeilu/apollo/apollo-mysql:5.7.22_1.6.0
        ports:
          - "13306:3306"
        environment:
          - MYSQL_ROOT_PASSWORD=你的數據庫密碼
          - UPDATE_EUREKA_URL_SQL=update ApolloConfigDB.ServerConfig set `Value`="http://部署環境的主機IP:8080/eureka/" where `Key`="eureka.service.url"
      apollo-configservice:
        container_name: apollo-configservice
        image: pengfeilu/apollo-configservice:1.6.0
        ports:
          - "8080:8080"
        depends_on:
          - apollo-mysql
        volumes:
          - "/opt/logs/100003171:/opt/logs/100003171"
        environment:
          - spring_datasource_url=jdbc:mysql://數據庫的主機IP:13306/ApolloConfigDB?characterEncoding=utf8
          - spring_datasource_username=數據庫名稱
          - spring_datasource_password=數據庫密碼
          - host_ip=這個是我自己加的Eureka上服務的IP地址(部署服務的宿主機IP)
      apollo-adminservice:
        container_name: apollo-adminservice
        image: pengfeilu/apollo-adminservice:1.6.0
        ports:
          - "8090:8090"
        depends_on:
          - apollo-mysql
          - apollo-configservice
        links:
          - apollo-configservice
        volumes:
          - "/opt/logs/100003172:/opt/logs/100003172"
        environment:
          - spring_datasource_url=jdbc:mysql://數據庫的主機IP:13306/ApolloConfigDB?characterEncoding=utf8
          - spring_datasource_username=數據庫的用戶名
          - spring_datasource_password=數據庫密碼
          - host_ip=這個是我自己加的Eureka上服務的IP地址(部署服務的宿主機IP)
      apolo-portal:
        container_name: apollo-portal
        image: pengfeilu/apollo-portal:1.6.0
        ports:
          - "8070:8070"
        volumes:
          - "/opt/logs/100003173:/opt/logs/100003173"
          - "$PWD/apollo-env.properties:/apollo-portal/config/apollo-env.properties"
        environment:
          - spring_datasource_url=jdbc:mysql://數據庫的主機IP:13306/ApolloPortalDB?characterEncoding=utf8
          - spring_datasource_username=數據庫的用戶名
          - spring_datasource_password=數據庫密碼
    

    好!到此,所有的配置項都已經完成了;務必要注意上面設計到的IP端口用戶密碼等信息;下面對上面核心的部分進行一些簡單的說明

  • UPDATE_EUREKA_URL_SQL
    這個變量在基礎的Mysql鏡像中是不存在的,是我後來加的,用來修改adminservice和configservice連接的Eureka地址的sql,它會在數據庫創建成功之後執行;如果你使用的基礎的Mysql鏡像,可以優先啓動Mysql的服務,啓動之後手動允許官方提供的apolloportaldb.sql和apolloconfigdb.sql

  • host_ip
    這也是自定義的一個變量,用於admin和config服務註冊到Eureka的時候,指明自己服務所處的IP地址,由於使用Docker安裝,如果不指定服務註冊到eureka上的地址就是容器內部的IP,從而導致客戶端訪問配置的時候失敗;官方在分佈式部署中的1.4中有介紹網絡策略,這裏使用的是其中的第二種。

  • apolo-portal
    該服務是管理服務,所以他只需要部署一份,對應的數據庫爲ApolloPortalDB;一般其部署在正式環境,確保其可用性;

  • apolo-portal環境配置文件掛載

    "$PWD/apollo-env.properties:/apollo-portal/config/apollo-env.properties"
    

    該配置爲將不同環境相關的配置信息掛載到容器下對於的路徑,這樣,環境的增加及移除只需要修改對應的文件,並將apollo-portal容器重啓一下即可

  • configservice和adminservice
    各個環境服務,每個環境需要單獨部署;同時每個環境各自關聯着各自的ApolloConfigDB數據庫,互不干擾,互不影響;

  • 啓動服務

    // 首次啓動會下載鏡像,會比較的慢
    // 如果存在鏡像啓動失敗,請往下看。
    docker-compose up -d
    

    file

  • 重啓容器 (着重關注)

      docker-compose restart
    

    在docker-compose.yml中雖然指定了容器之間的關聯關係,但是Mysql在首次啓動的時候會比較慢一點,從而會導致admin、config或者portal在啓動的時候,mysql服務還沒有準備好,導致服務啓動失敗;這個時候我們只需要等mysql初始化好之後再把所有的服務重新啓動一遍就好了。
    file


測試

  • 查看Eureka
    http://ip:8080 如:http://192.168.1.22:8080 看adminservice和configservice服務是否註冊上來
    file
  • 查看Apollo配置管理平臺
    http://ip:8070 如: http://192.168.1.22:8070 默認管理員用戶名:apollo 密碼: admin
    file
    file

添加環境

上面默認我們創建了一個Dev的環境,但是實際的使用過程中並不是只有一個環境,可能還有測試環境預發佈環境正式環境;那我們如何來添加一個環境呢?有了上面的基礎鏡像,這個事情就變的非常的簡單了;一句話,將上面的docker-compose.yml配置文件的apollo-portal相關的服務去掉並啓動即可

  • 第一步:準備docker-compose.yml

    // 任意目錄下創建docker-compose.yml
    vim docker-compose.yml
    // 並在文件中添加一下內容
    
    version: "3"
    
    services:
      apollo-mysql:
        container_name: apollo-mysql
        image: pengfeilu/apollo/apollo-mysql:5.7.22_1.6.0
        ports:
          - "13306:3306"
        environment:
          - MYSQL_ROOT_PASSWORD=你的數據庫密碼
          - UPDATE_EUREKA_URL_SQL=update ApolloConfigDB.ServerConfig set `Value`="http://部署環境的主機IP:8080/eureka/" where `Key`="eureka.service.url"
      apollo-configservice:
        container_name: apollo-configservice
        image: pengfeilu/apollo-configservice:1.6.0
        ports:
          - "8080:8080"
        depends_on:
          - apollo-mysql
        volumes:
          - "/opt/logs/100003171:/opt/logs/100003171"
        environment:
          - spring_datasource_url=jdbc:mysql://數據庫的主機IP:13306/ApolloConfigDB?characterEncoding=utf8
          - spring_datasource_username=數據庫名稱
          - spring_datasource_password=數據庫密碼
          - host_ip=這個是我自己加的Eureka上服務的IP地址(部署服務的宿主機IP)
      apollo-adminservice:
        container_name: apollo-adminservice
        image: pengfeilu/apollo-adminservice:1.6.0
        ports:
          - "8090:8090"
        depends_on:
          - apollo-mysql
          - apollo-configservice
        links:
          - apollo-configservice
        volumes:
          - "/opt/logs/100003172:/opt/logs/100003172"
        environment:
          - spring_datasource_url=jdbc:mysql://數據庫的主機IP:13306/ApolloConfigDB?characterEncoding=utf8
          - spring_datasource_username=數據庫的用戶名
          - spring_datasource_password=數據庫密碼
          - host_ip=這個是我自己加的Eureka上服務的IP地址(部署服務的宿主機IP)
    

    除了把apollo-portal相關的去掉了,其他的沒有任何變得;同是把ip、數據庫等相關環境個性化的東西做一下修改就好了;

  • 第二步:啓動並二次重啓服務

    docker-compose up -d
    // 重啓的原因和上面說的一樣
    docker-compose restart
    // 查看服務
    docker ps -a | grep apollo
    // 如果出現下圖切Eureka上面正常註冊了,說明環境相關的服務以及啓動正常了
    

    file
    file

  • 第三步,修改環境配置文件apollo-env.properties
    file

  • 第四步,修改ApolloPortalDB.ServerConfig表中的envs字段
    找到系統參數配置並查找apollo.portal.envs配置,並將其修改爲你需要支持的多個環境,記得用英文的逗號隔開
    file

  • 第五步,重啓apollo-portal服務

    docker restart apollo-portal
    

    file
    file

到此,分佈式的apollo環境搭建就完成了;集羣就在以上環境下做相關配置即可。


鏡像創建過程

apollo-mysql鏡像

  • 獲取sql腳本,下載
  • 配置文件
    vim mysql.cnf
    
    [mysql]
    default-character-set = utf8
    [mysql.server]
    default-character-set = utf8
    [mysqld_safe]
    default-character-set = utf8
    [client]
    default-character-set = utf8
    [mysqld]
    character_set_server=utf8
    init_connect='SET NAMES utf8'
    
  • 添加初始化數據庫腳本
    vim init_db.sh
    
    mysql -uroot -p$MYSQL_ROOT_PASSWORD <<EOF
    source $WORK_PATH/apolloconfigdb.sql;
    source $WORK_PATH/apolloportaldb.sql;
    EOF
    mysql -uroot -p$MYSQL_ROOT_PASSWORD <<EOF
    $UPDATE_EUREKA_URL_SQL;
    EOF
    
  • 創建Dockerfile
    # mysql 官方鏡像
    FROM mysql:5.7.22
    # 作者
    MAINTAINER lupf <[email protected]>
    # 定義會被容器自動執行的目錄
    ENV AUTO_RUN_DIR /docker-entrypoint-initdb.d
    # 定義工作目錄
    ENV WORK_PATH /usr/local/work
    # 將要執行的sql腳本拷貝至工作目錄
    COPY ./*.sql $WORK_PATH/
    # 將執行sql的shell腳本拷貝至docker-entrypoint-initdb.d,這個目錄會在容器啓動的時候自動執行下面的指令
    COPY ./init_db.sh $AUTO_RUN_DIR/
    # 將配置文件拷貝到對應的目錄
    #COPY ./mysql.cnf /etc/mysql/mysql.conf.d/
    # 給執行文件增加可執行權限
    RUN chmod a+x $AUTO_RUN_DIR/*
    
  • 構建鏡像即可
    docker build -t pengfeilu/apollo-mysql:5.7.22_1.6.0
    

adminservice、configservice和portal鏡像構建

  • 下載官方代碼

    // github 地址
    git clone https://github.com/ctripcorp/apollo.git
    // 如果github下載慢,也可以去碼雲下
    git clone https://gitee.com/nobodyiam/apollo.git
    
  • 微調一點Eureka配置

    //進入apollo-adminservice和apollo-configservice
    cd apollo-adminservice/src/main/resources/
    // 以及
    cd apollo-configservice/src/main/resources/
    

    分別在application.yml添加以下配置

    spring:
      cloud:
        inetutils:
          ignoredInterfaces:
            - docker0
            - veth.*
    

    親測上面這種忽略網卡的做法貌似不會生效,因此,這裏再添加下面的一行配置
    分別在bootstrap.yml添加以下配置

    eureka:
      instance:
        ip-address: ${host_ip}
    
  • Maven編譯

    // 進入項目的根目錄,apollo目錄,允許以下指令
    sh scripts/build.sh
    // 如果是windows,允許build.bat即可
    
  • 使用各個項目的Docker腳本將打好的包打成鏡像

    • 找到Dockerfile

      將apollo-configservice、apollo-adminservice和apollo-portal下,target目錄中的apollo-*-1.6.0-SNAPSHOT-github.zip文件分別拷貝到各自項目的src/main/docker/目錄下

    • 生成鏡像
      // 在各自的src/main/docker/ 分別執行以下各自的指令編譯成對於的鏡像
      cd apollo-configservice/src/main/docker/
      docker build -t pengfeilu/apollo-configservice:1.6.0 .
        
      cd apollo-adminservice/src/main/docker/
      docker build -t pengfeilu/apollo-adminservice:1.6.0 .
        
      cd apollo-portal/src/main/docker/
      docker build -t pengfeilu/apollo-portal:1.6.0 .
      
      file

到此,所有的鏡像即創建完成!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章