1. 程式人生 > >配置服務 apollo 部署實踐

配置服務 apollo 部署實踐

tro o-c all 規範 命名空間 pri 分布 -o ring

前言

????Apollo(阿波羅)是攜程框架部門研發的分布式配置中心,能夠集中化管理應用不同環境、不同集群的配置,配置修改後能夠實時推送到應用端,並且具備規範的權限、流程治理等特性,適用於微服務配置管理場景。

  • github 地址:https://github.com/ctripcorp/apollo
  • 服務端基於Spring Boot和Spring Cloud開發,打包後可以直接運行,不需要額外安裝Tomcat等應用容器
  • Java客戶端不依賴任何框架,能夠運行於所有Java運行時環境,同時對Spring/Spring Boot環境也有較好的支持
  • .Net客戶端不依賴任何框架,能夠運行於所有.Net運行時環境
  • 以上摘抄自官方文檔,該框架目前已達 9000 多個 star,而且目前已經支持了 .netcore 客戶端

安裝

服務器環境安裝檢查

????由於本次是按照正式環境來模擬一次部署,所以,按照官方指引,正式環境部署並不建議使用 Quick Start;接下來打開官方“分布式部署”指引文檔:https://github.com/ctripcorp/apollo/wiki/%E5%88%86%E5%B8%83%E5%BC%8F%E9%83%A8%E7%BD%B2%E6%8C%87%E5%8D%97

  • 首先是檢查服務器是否安裝了 Java 環境,在服務器輸入 java -version

技術分享圖片

  • 可以看到,服務已經安裝,如果沒有安裝,這輸入 yum install java-1.8.0-openjdk(本次使用的服務器為 Centos 7.0)。
數據庫檢查

????官方要求數據庫為 MySQL,版本要求:5.6.5+,我在這裏使用了 MariaDB 10.3,效果相同,安裝好數據庫後,下載官方 SQL 文件,執行,創建 apollo 所需的數據庫。數據庫文件一共有兩個

  • ApolloPortalDB 地址:https://github.com/ctripcorp/apollo/blob/master/scripts/sql/apolloportaldb.sql 這個是 Portal 數據庫,可以用來做各種環境的統一管理
  • ApolloConfigDB 地址:https://github.com/ctripcorp/apollo/blob/master/scripts/sql/apolloconfigdb.sql 這是“配置”存儲數據庫,每個環境應該單獨部署一份,比如 開發、測試、產品 環境,應該每個環境部署一份,因為各自環境的配置內容是不同的
  • 為了方便,我現在把兩個數據庫都安裝在本地,安裝好數據庫文件後,進入 ApolloConfigDB 通過執行 SQL 命令,進行檢查

技術分享圖片

  • ApolloPortalDB 同理,可以看到,數據庫已經成功安裝
安裝服務和 web 管理控制臺

????服務一共有 3 個實例,都從這裏下載:https://github.com/ctripcorp/apollo/releases,我直接下載作者編譯好的 zip 文件

技術分享圖片

下面簡單介紹各個服務以及用途

  • apollo-configservice apollo 配置文件服務,該服務直接對外提供服務,同時需要在 portal 進行元數據註冊,下面修改該服務的數據庫配置文件。
    修改配置文件 /apollo-configservice-1.1.2/config/application-github.properties 為剛才數據庫的配置
spring.datasource.url = jdbc:mysql://127.0.0.1:3406/ApolloConfigDB?characterEncoding=utf8
spring.datasource.username = root
spring.datasource.password = root
  • apollo-adminservice-1.1.2 web 管理服務,同樣修改其配置文件 apollo-adminservice-1.1.2/config/application-github.properties 為 ApolloConfigDB 數據庫的地址,同上。
  • apollo-portal-1.1.2 元數據服務,修改配置文件 apollo-portal-1.1.2/config/application-github.properties,註意,這裏的數據必須為 ApolloPortalDB ,如下:
spring.datasource.url = jdbc:mysql://127.0.0.1:3406/ApolloPortalDB?characterEncoding=utf8
spring.datasource.username = root
spring.datasource.password = root
  • 最後,還需要修改 apollo-portal-1.1.2/config/apollo-env.properties 文件,將 configservice 都註冊到 portalservice 中
local.meta=http://localhost:8080
dev.meta=http://172.16.1.220:8080
fat.meta=http://172.16.1.220:8080
uat.meta=http://172.16.1.220:8080
lpt.meta=${lpt_meta}
pro.meta=http://172.16.1.227:8080

啟動和修改配置

????在上面做好三個服務端配置後,下面我們就可以逐一的啟動各個服務了,各自服務端監聽端口都位於 xxx/scripts/startup.sh 中

  • 執行 sh apollo-configservice-1.1.2/scripts/startup.sh 啟動 config 服務,監聽端口默認:8080
  • 執行 sh apollo-portal-1.1.2/scripts/startup.sh 啟動 portal 服務,監聽端口默認:8070
  • 執行 sh apollo-adminservice-1.1.2/scripts/startup.sh 啟動 admin 服務,監聽端口默認:8090

如果輸出看到以上三個服務都輸出信息為,證明服務啟動成功

Waiting for server startup....
Mon Nov 19 11:07:15 CST 2018 Server started in 20 seconds!
  • 通過查看 cat apollo-adminservice-1.1.2/scripts/startup.sh 得知,該服務監聽端口為 8070,打開瀏覽器,輸入地址:http://localhost:8090,看到了如下界面

技術分享圖片

  • 輸入默認賬號密碼:apollo/admin 登錄 web 控制臺進行查看。

技術分享圖片

  • 為了方便演示,首先創建一個項目 webapplication1

技術分享圖片

  • 進入 webapplication1,

技術分享圖片

  • 點擊左側按鈕“添加Namespace”,創建一個公共的命名空間,取名為:common

技術分享圖片

  • 創建成功,返回項目主頁

技術分享圖片

  • 在 dotnet.versin 命名空間下點擊“新增配置”按鈕,增加一個配置節點

技術分享圖片

  • 創建完成後,可以看到,該節點狀態為 “未發布”

技術分享圖片

  • 點擊該命名空間下的“發布”按鈕,將其進行發布

技術分享圖片

  • 使用以上方法,在默認的命名空間“application” 下也創建一個名為“connectionstring" 的節點,同樣將其發布
  • 此時,恭喜你,已完成服務器部署發布,接下來,我們通過創建一個 web 應用程序訪問該配置服務

客戶端訪問

  • 首先創建 web 項目,完成後在 nuget 包管理器上引用 apollo 的 .netcore 客戶端 Com.Ctrip.Framework.Apollo.Configuration

技術分享圖片

  • 打開 Program.cs 文件,將剛才在 apollo 服務上創建的命名空間加入到管道中
 public static IWebHostBuilder CreateWebHostBuilder(string[] args)
        {
            var hostBuilder = WebHost.CreateDefaultBuilder(args)
                   .UseStartup<Startup>()
                   .ConfigureAppConfiguration((context, builder) =>
            {
                builder.AddApollo(builder.Build().GetSection("apollo"))
                       .AddDefault()
                       .AddNamespace("dotnet.version")
                       .AddNamespace("application");
            });

            return hostBuilder;
        }
  • 以上代碼中有一個方法 AddApollo ,這裏傳入了本地配置文件節點 builder.Build().GetSection("apollo"),其配置如下
{
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "AllowedHosts": "*",
  "apollo": {
    "AppId": "webapplication1",
    "MetaServer": "http://172.16.1.220:8080"
  }

}
  • AppId 對於 我們創建的在 apollo web 控制臺上創建的項目ID webapplication1,元數據服務指向 8080 端口,正是 configservice 的監聽端口
  • 在 HomeController 的操作 Action 中,獲取配置節點,並輸出到客戶端
  public IActionResult Index()
        {
            this.ViewBag.ConnectionString = this.cfg["connectionstring"];
            this.ViewBag.LastVersion = this.cfg["last-version"];
            return View();
        }
  • 啟動項目,可以看到

技術分享圖片

  • 至此,測試完成

結語

  • apollo 項目官方部署指引非常復雜,原因就在於整個官方文檔都是大片大片的文字進行鋪排,聖人說:看圖就會,見字想睡,本文希望通過自己的測試能幫助更多想應用 apollo 配置管理服務的朋友
  • 註意,安裝完成默認只有 DEV 配置環境,如果需要增加環境,可直接修改數據庫 apolloportaldb.serverconfig 表,字段名稱為 apollo.portal.envs 的列值,多個環境以逗號分隔,保存,重啟服務即可

配置服務 apollo 部署實踐