1. 程式人生 > >Apollo學習(三): 分散式部署

Apollo學習(三): 分散式部署

說明

通過之前的博文《在本地Windows系統下搭建Apollo配置中心》,學習了Apollo利用指令碼在本地部署,但是使用這種方式部署,有很多限制如埠號無法修改,無法增加自定義環境、部門資訊,無法讓其他計算機使用配置中心等。本篇博文通過學習Apollo的分散式部署,彌補了之前的不足,在這裡記錄總結下。

正文

在之前的博文中我使用的是通過網盤下載的壓縮包快速部署,在本篇博文中通過git將apollo專案克隆的本地來進行修改部署。克隆地址

分散式部署結構

通過在實際的開發中,我們會有不同的環境,如開發環境,測試環境,正式環境等。每個環境都需要有各自的配置服務,分散式部署就是為不同環境配置配置管理服務,同時要保證服務的高可用。
下圖為Apollo官方提供的部署策略圖
在這裡插入圖片描述


可以看到整體分為4部分,在每部分中都有多個相同的服務和db。接下解釋下每部分代表什麼含義。
這裡的每部分都表示不同的環境,有FAT,UAT,PROD. 目前Apollo支援以下幾種環境

  • DEV 開發環境
  • FAT 測試環境
  • UAT 整合環境
  • PRO 生產環境 (包括圖上的PROD)
    通過閱讀原始碼,可以發現還支援其他環境,這裡只做瞭解即可
    在這裡插入圖片描述
    通過圖片我們還可以看到
  • Portal部署在生產環境,通過它直接來管理其他不同環境的配置
  • Meta Server、Config Service和Admin Service在每個環境都單獨部署,使用獨立的資料庫
  • Meta Server和Config Service部署在同一個JVMji程序中,Admin
    Service部署在同一伺服器的另一個JVM程序中
  • Meta Server、Config Service和Admin Servcie在生產環境中部署在兩個機房,實現雙活
    由於條件限制無法實現上圖的部署方式,接下來在通過介紹在本地環境新增自定義環境,修改服務埠號,修改服務的註冊方式來進行學習。

自定義環境

假設我們我們需要新增TEST,DEMO環境

1. 修改apollo-core專案中的Env列舉類

修改com.ctrip.framework.apollo.core.enums.Env類,在其中新增需要新增環境的名稱

public enum Env{
  LOCAL, DEV, FWS, FAT, UAT, LPT, PRO, TOOLS, UNKNOWN, DEMO, TEST;
	...
}

2.修改EnvUtils類

修改com.ctrip.framework.apollo.core.enums.EnvUtils類,在其中新增環境的轉換邏輯

 switch (envName.trim().toUpperCase()) {
 	...
      case "DEMO":
        return Env.DEMO;
      case "TEST":
        return Env.TEST;
      default:
        return Env.UNKNOWN;
 }

3.修改apollo-portal專案中的apollo-env.porperties配置檔案

修改apollo-env.properties配置檔案,在該檔案中新增環境所需的meta server地址

demo.meta=${demo_meta}
test.meta=${test_meta}

這裡由於在本地,可以將其配置成和dev相同的值,在啟動時,如果不指定具體的值portal會心跳檢測,一直報錯

4.修改apollo-core專案中的LegacyMetaServerProvider類

修改com.ctrip.framework.apollo.core.internals.LegacyMetaServerProvider類,新增需要環境的獲取meta server地址的邏輯

 private void initialize() {
	...
    domains.put(Env.DEMO,
        env.getProperty("demo_meta", prop.getProperty("demo.meta")));
    domains.put(Env.TEST,
        env.getProperty("test_meta", prop.getProperty("test.meta")));
  }

5.修改apolloportaldb庫中serverconfig表

修改serverconfig表的apollo.portal.envs欄位,新增需要的環境名稱,用 , 分割
在這裡插入圖片描述
這裡可以根據需要修改organizations的值來新增部門資訊,按照前面的格式新增json串

修改埠

之前通過指令碼部署,config service為8080 admin service為8090 portal service為8070,通過分別修改apollo-configservice、apollo-adminservice、apollo-portal專案的application.yml檔案,修改server.port的值
注意
在修改埠號後,如果依然使用的是configservice作為eureka註冊中心,一定要修改bootstrap.yml配置檔案中服務的註冊地址埠號,其值為config service的埠號,需要修改apollo-configservice和apollo-adminservice專案的註冊埠號

defaultZone: http://${eureka.instance.hostname}:8088/eureka/

這裡將configservice的server.port修改為8088

在將config service的埠後修改後必須在apolloconfigdb庫中修改serverconfig表,在eureka.service.url 新增新的eureka地址,用,分隔。這裡為了讓其他計算機也可以使用本地的註冊中心,所以使用ip+埠的形式

eureka.service.url 新增 http://ip:8088/eureka/

分散式部署

在分散式部署中,每個環境都有各自對應的資料庫,需要修改不同環境的的eureka地址,修改apolloconfigdb.serviceconfig表中eureka.service.url的值,對應config service的地址,這裡由於條件限制,本地無法實現。更多詳細內容請檢視官方文件

1.配置資料庫資訊

分別修改apollo-configservice和apollo-adminservice的application-github.properties檔案,在其中新增資料庫連線資訊

spring.datasource.url=jdbc:mysql://localhost:3307/ApolloConfigDB?characterEncoding=utf8
spring.datasource.username=***
spring.datasource.password=**

再修改apollo-portal的application-github.properties檔案

spring.datasource.url = jdbc:mysql://localhost:3307/ApolloPortalDB?characterEncoding=utf8
spring.datasource.username =***
spring.datasource.password =**

注意:configservice和adminservice使用的是ApolloConfigDB資料庫,portal使用的是ApolloPortalDB資料庫
在添加了資料庫連線資訊後,需要在啟動類新增配置資訊
分別在PortalApplication、ConfigServiceApplication、AdminServiceApplication新增配置

@PropertySource(value = {"classpath:application-github.properties"})

這裡介紹另一種方式,直接在各自專案的配置檔案新增資料庫連線資訊,configservice在configservice.properties檔案,adminservice在adminservice.properties檔案新增

apollo_profile=github
spring.datasource.url=jdbc:mysql://localhost:3307/ApolloConfigDB?characterEncoding=utf8
spring.datasource.username=***
spring.datasource.password=**

在apollo-portal中需要在resources目錄下建立portal.properties檔案,在其中新增

apollo_profile=github
spring.datasource.url=jdbc:mysql://localhost:3307/ApolloPortalDB?characterEncoding=utf8
spring.datasource.username=***
spring.datasource.password=***

新增完後,需要在PortalApplication啟動類上新增配置資訊

@PropertySource(value = {"classpath:portal.properties"})

在分散式部署中,每個環境都需要單獨配置,使用各自的資料庫。

之前講到指令碼配置啟動後,其他計算機無法使用本地的Apollo的配置中心,這裡通過修改服務的ip來實現

2. 修改ip地址

分別修改apollo-configservice和apollo-adminservice的服務註冊地址及服務例項的ip地址
在這裡插入圖片描述
這裡需要注意在使用ip-adress配置了ip地址後,preferIpAddress的值必須設定為true,否則當呼叫該服務時,會通過主機名稱+埠的方式呼叫,也就是hostname+server-port的方式,會導致呼叫不到。同時修改defaultZone的值,由於這裡使用的configservice自帶的eureka服務,所以兩個專案的值都是configservice的ip+server-port。要注意之前我們修改的configdb中eureka.service.url的值的ip一定要與configservice對應

eureka.instance.ip-address=${ip地址}
eureka.instance.preferIpAddress=true

配置啟動後,其他計算機就可以通過使用http://configservice-ip:port/eureka/地址將專案註冊到該註冊中心,發現Apollo配置中心的服務例項。

這裡再介紹另一種註冊方式,以上都是使用的configservice整合的eureka服務,如果已經有了一個eureka配置中心,需要使用同一個註冊中心統一管理時,我們需要修改apollo-configservice的配置。

3.註冊到單獨的Eureka Server上

  • 修改ConfigServiceApplication 將@EnableEurekaServer修改為@EnableEurekaClient
  • 修改ApolloConfigDB.ServerConfig表中的eureka.service.url,指向自己的Eureka地址
  • 修改apollo-confgservice和apollo-adminservice的eureka.client.serviceUrl.defaultZone的值

參考資料:
https://github.com/ctripcorp/apollo/wiki/分散式部署指南
https://blog.csdn.net/Michael_HM/article/details/80310606