歡迎光臨
每天分享高質量文章

分散式部署攜程Apollo構建配置中心

一、開場白

在系統設計裡我們有很多配置希望獨立於系統之外,而又能夠被系統實時讀取。但是在傳統的系統設計裡,配置資訊通常是耦合在系統內的,比如.net裡通常會放在App.config或者web.config裡,.net core則是appsettings.json裡,這些都不夠靈活,如果在制度嚴格,不允許隨便登入伺服器的中大型公司裡,每次的配置更改就意味著系統的釋出,毫無疑問,肯定有帶哥要吐槽了,什麼垃圾架構!為瞭解決這一問題,Apollo應運而生,專門用來構建微服務架構裡的配置中心,在實際生產專案裡為了達到高可用,我們會將其以分散式的方式部署。

 貼上下官方的下載和檔案:

官網:https://github.com/ctripcorp/apollo

Wiki:https://github.com/ctripcorp/apollo/wiki(一切的整合方式和使用方法都在這裡)

Issues:https://github.com/ctripcorp/apollo/issues(如果期間有任何問題,請透過這裡查詢大部分解決方法)

二、Maven編譯原始碼

首先要說明一下,官方提供的Quick Start以及預先打好的安裝包如果不進行特殊配置都只能單機搭建使用,透過所以如果你想把Apollo搭建在公有雲或者呼叫放和部署不在同一環境,最好自己編譯專案。

我這裡使用阿裡雲搭建Apollo,系統是CentOs 7。

1.首先我們需要在以下地址下載原始碼:

https://github.com/ctripcorp/apollo/releases

2. 原始碼下載完成後我們需要修改兩個地方,Apoolo是微服務架構,使用Eureka實現服務的註冊和發現,分散式部署的時候,apollo-configserviceapollo-adminservice需要把自己的IP和埠註冊到MetaServer(apollo-configservice本身)Server(apollo-configservice本身)。所以如果實際部署的機器有多塊網絡卡(如docker),或者存在某些網絡卡的IP是Apollo客戶端和Portal無法訪問的(如網路安全限制),那麼我們就需要在apollo-configserviceapollo-adminservice中做相關限制以避免Eureka將這些網絡卡的IP註冊到Meta Server。

我這裡的解決方式是直接指定IP。透過修改apollo-adminservice或apollo-configservice 的bootstrap.yml檔案,指定apollo-configservice和apollo-adminservice的IP埠。

解壓原始碼檔案,透過 apollo-1.3.0\apollo-adminservice\src\main\resources 找到 bootstrap.yml 檔案,新增以下配置:

eureka:
  instance:
    ip-address: xx.xx.xx.xx
    hostname: ${hostname:47.99.92.76}
    preferIpAddress: true
    status-page-url-path: /info
    health-check-url-path: /health
  client:
    serviceUrl:
      # This setting will be overridden by eureka.service.url setting from ApolloConfigDB.ServerConfig or System Property
      # see com.ctrip.framework.apollo.biz.eureka.ApolloEurekaClientConfig
      defaultZone: http://${eureka.instance.hostname}:8080/eureka/
    healthcheck:
      enabled: true
    eurekaServiceUrlPollIntervalSeconds: 60

management:
  health:
    status:
      order: DOWN, OUT_OF_SERVICE, UNKNOWN, UP 

ip-address是我阿裡雲的公有IP,其它部署環境同理。

透過 apollo-1.3.0\apollo-configservice\src\main\resources 找到 bootstrap.yml 檔案,配置同上。

同時我們還需要配置下MySQL資料庫的連結資訊,透過 apollo-1.3.0\scripts 找到 build.sh 檔案,編輯連結資訊:

# apollo config db info
apollo_config_db_url=jdbc:mysql://localhost:3306/ApolloConfigDB?characterEncoding=utf8
apollo_config_db_username=xxx
apollo_config_db_password=xxx

# apollo portal db info
apollo_portal_db_url=jdbc:mysql://localhost:3306/ApolloPortalDB?characterEncoding=utf8
apollo_portal_db_username=xxx
apollo_portal_db_password=xxx

因為我的MySQL就是部署在同一個阿裡雲上,所以就使用localhost,大家酌情修改。

Apollo依賴於MySQL,我們需要先把其對應的資料庫跑出來,透過以下路徑載入兩個sql檔案:

Configdb:apollo-1.3.0\scripts\db\migration\configdb

Portaldb:apollo-1.3.0\scripts\db\migration\portaldb

配置就到這裡,接下來我們要安裝Maven環境來編譯原始碼:

1.安裝maven

wget http://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gz

Windows環境透過本文安裝:https://blog.csdn.net/Snowprincev/article/details/81670037

2、解壓安裝

tar -zxvf apache-maven-3.3.9-bin.tar.gz

mv apache-maven-3.3.9 /usr/local/maven-3.3.9

3、配置環境變數

vi /etc/profile

#在適當的位置新增

export M2_HOME=/usr/local/maven3  (這裡需要制定你的安裝目錄 自定義的哈)

export PATH=$PATH:$JAVA_HOME/bin:$M2_HOME/bin

4、使配置生效

儲存退出後執行下麵的命令使配置生效,或者重啟伺服器生效。

source /etc/profile

5、驗證版本

mvn -v

6.配置阿裡雲倉庫,國內速度快

在maven的settings.xml 檔案裡配置mirrors的子節點,新增如下mirror:

        nexus-aliyun
        *
        Nexus aliyun
        http://maven.aliyun.com/nexus/content/groups/public

 

7.阿裡雲cd到原始碼檔案夾路徑 apollo-1.3.0\scripts ,執行以下命令編譯原始碼:

該指令碼會依次打包apollo-configservice, apollo-adminservice, apollo-portal。

8.編譯完成後

獲取位於apollo-configservice/target/目錄下的apollo-configservice-x.x.x-github.zip。解壓後執行scripts/startup.sh即可。如需停止服務,執行scripts/shutdown.sh.

獲取位於apollo-adminservice/target/目錄下的apollo-adminservice-x.x.x-github.zip。解壓後執行scripts/startup.sh即可。如需停止服務,執行scripts/shutdown.sh.

獲取位於apollo-portal/target/目錄下的apollo-portal-x.x.x-github.zip。解壓後執行scripts/startup.sh即可。如需停止服務,執行scripts/shutdown.sh.

OK,上面3個啟動後,我們就可以透過Ip:8070 訪問Apollo的UI介面的,透過預設的 賬戶密碼登入:apollo/admin

透過IP:8080訪問Eureka的UI介面檢視被註冊的configure和admin兩個行程。

 

二、新建.Net Core API專案試用

1.新建.net core api專案,透過nuget引入專案包:Com.Ctrip.Framework.Apollo.Configuration。

2.在Program.cs中新增如下程式碼:

    public class Program
    {
        public static void Main(string[] args)
        {
            CreateWebHostBuilder(args).Build().Run();
        }

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration((hostingContext, builder) =>
            {
                builder
                .AddApollo(builder.Build().GetSection("apollo"))
                .AddDefault();
            })
                .UseStartup();
    }

3.appsettings.json中進行如下配置,我們這裡試用預設自帶的SimpleApp測試:

{
  "apollo": {
    "AppId": "SampleApp",
    "MetaServer": "http://47.99.92.76:8080",
    "Env": "Dev"
  }
}

這裡配置的意思是客戶端需要透過Eureka查詢Configure服務的地址,從而獲取配置資訊。

  private IConfiguration _configuration;

        public ValuesController(IConfiguration configuration)
        {
            _configuration = configuration;
        }

        [HttpGet]
        public ActionResultstring>> Get()
        {
            string title = _configuration["timeout"];
            return new string[] { "value1", "value2", title };
        }

執行專案檢視:

OK,執行成功,更多資訊大家可以去官方gitHub檢視哦,目前博主所在的公司已經使用Apollo很久了,而且.net 端一個分支的維護者還是博主公司架構組的一位同事,就是下麵這個:

看下使用Apollo後的專案執行圖,服務配置資料可以正常請求:

今天就到這了,12點睡覺了!!

已同步到看一看
贊(0)

分享創造快樂