Apollo 配置中心的部署與使用經驗

来源:https://www.cnblogs.com/morang/archive/2023/10/31/devops-apollo-install.html
-Advertisement-
Play Games

Apollo 特點:成熟,穩定 支持管理多環境/多集群/多命名空間的配置 配置修改發佈實時(1s)通知到應用程式 支持許可權控制、配置繼承,版本管理,灰度發佈,使用監控等 ...


前言

Apollo(阿波羅)是攜程開源的分散式配置管理中心。

本文主要介紹其基於 Docker-Compose 的部署安裝和一些使用的經驗

特點

  • 成熟,穩定
  • 支持管理多環境/多集群/多命名空間的配置
  • 配置修改發佈實時(1s)通知到應用程式
  • 支持許可權控制、配置繼承,版本管理,灰度發佈,使用監控等
  • 官方提供了 。NET/Java/Go 的 SDK 以及 Http 介面
  • 國產中文,文檔友好,大廠背書,使用方案成熟
  • 使用簡單,支持 Docker , K8S,官方也提供多種高可用方案參考

使用情況

  • 目前在微服務項目中做為配置中心,表現穩定,體驗良好
  • 記憶體情況:新安裝啟動在 100M 左右,工作中實際 20 項目,80 客戶端使用時,三個服務占 1.5G 左右
  • 測試環境和生產環境分開,安全及避免錯誤操作
  • 為什麼選擇 Apollo:穩定&簡單,雖然比不上 Nacos 的性能,也沒有服務發現功能,但是穩定啊!!!
  • 在我自己部署前,會覺得這個東西好難,好重,好麻煩。寫這篇文章的時候的感受只有兩個字:牛*

實踐

準備

  • 當前版本:v2.1

  • apollo-db:mysql 5.6.6+ 資料庫

    • 預設埠:3306
    • 依賴兩個資料庫:ApolloPortalDB,ApolloConfigDB
    • 預設賬號/密碼:apollo/admin
  • apollo-configservice:Config Service 提供配置的讀取、推送等功能。

    • 預設埠:8080
    • 應用程式端連接到此服務使用
  • apollo-adminservice: Admin Service 提供配置的修改、發佈等功能

    • 預設埠:8090
    • 管理界面使用此服務
  • apollo-portal:Portal 提供 Web 界面用來管理配置

    • 預設埠:8070
    • Web 管理界面
    • 預設賬號/密碼:apollo/admin
  • Deureka:提供服務註冊和發現

    • Config Service 和 Admin Service 會向 Eureka 註冊服務,並保持心跳
    • 在 Admin Service 需要指定 eureka.service.url
  • 服務配置方式的優先順序從高到低分別為:系統參數>環境變數>外部配置文件

使用 Docker Compose 安裝

本篇文章基於 Docker V24 及 Docker Compose V2,安裝可以參考之前的文章

配置說明

  • 掛載了日誌文件到。/logs 目錄
  • 固定了鏡像版本 mysql v5.7 , apollo v2.1.0
  • 指定 MySql 賬號密碼: root devops666 ,修改了埠映射 13306:3306
  • 掛載 MySql 數據,初始化腳本文件夾 。/initsql(v2.1 腳本
  • Apollo 服務中使用服務名 apollo-db 連接 MySql:SPRING_DATASOURCE_URL:'...apollo-db:3306/...'
  • 設置先啟動資料庫:depends_on:apollo-db
  • apollo-configservice 服務中指定向 Deureka(Apollo 服務發現組件)註冊的地址:http://192.168.123.214:8080
  • apollo-adminservice 服務中指定向 Deureka 註冊的服務地址:http://192.168.123.214:809
  • apollo-adminservice 服務需指定 Deureka 服務地址-Deureka.service.url=``http://192.168.123.214:8080/eureka/
  • 指定網路:devopsnetwork (docker network create devopsnetwork)
  • web 管理端預設賬號密碼:apollo admin,登錄後修改!!!

配置文件 compose.yml

  • 準備好 compose.yml 及 。/initsql/初始化腳本,修改其中的 IP

  • 拷貝到伺服器

  • 然後運行docker compose up -d即可

     version: '3.1'
     services:
       # Apollo資料庫
       apollo-db:
         image: mysql:5.7
         container_name: apollo_db_5_7
         restart: always
         environment:
           TZ: Asia/Shanghai
           MYSQL_ROOT_PASSWORD: 'devops666'
         ports:
           - "13306:3306"
         volumes:
           - ./initsql:/docker-entrypoint-initdb.d
           - ./data:/var/lib/mysql
         networks:
           - devopsnetwork
    
       # Apollo 服務發現註冊中心
       apollo-configservice:
         container_name: apollo_configservice_2_1
         image: apolloconfig/apollo-configservice:2.1.0
         restart: always
         depends_on:
           - apollo-db
         environment:
           SPRING_DATASOURCE_URL: 'jdbc:mysql://apollo-db:3306/ApolloConfigDB?characterEncoding=utf8'
           SPRING_DATASOURCE_USERNAME: 'root'
           SPRING_DATASOURCE_PASSWORD: 'devops666'
           JAVA_OPTS: "-Deureka.instance.homePageUrl=http://192.168.123.214:8080"
           # EUREKA_INSTANCE_HOME_PAGE_URL: http://192.168.123.214:8080
           # EUREKA_INSTANCE_PREFER_IP_ADDRESS: false
         volumes:
           - ./logs:/opt/logs
         ports:
           - "8080:8080"
         networks:
           - devopsnetwork
    
       #核心介面服務
       apollo-adminservice:
         container_name: apollo_adminservice_2_1
         image: apolloconfig/apollo-adminservice:2.1.0
         restart: always
         environment:
           SPRING_DATASOURCE_URL: 'jdbc:mysql://apollo-db:3306/ApolloConfigDB?characterEncoding=utf8'
           SPRING_DATASOURCE_USERNAME: 'root' 
           SPRING_DATASOURCE_PASSWORD: 'devops666'
           JAVA_OPTS: "-Deureka.instance.homePageUrl=http://192.168.123.214:8090 -Deureka.service.url=http://192.168.123.214:8080/eureka/ "
         depends_on:
           - apollo-db
         ports:
           - "8090:8090"
         volumes:
           - ./logs/:/opt/logs      
         networks:
           - devopsnetwork
           
      
       apollo-portal:
         image: apolloconfig/apollo-portal:2.1.0
         container_name: apollo_portal_2_1
         restart: always
         environment:
           SPRING_DATASOURCE_URL: 'jdbc:mysql://apollo-db:3306/ApolloPortalDB?characterEncoding=utf8'
           SPRING_DATASOURCE_USERNAME: 'root'
           SPRING_DATASOURCE_PASSWORD: 'devops666'
           APOLLO_PORTAL_ENVS: 'dev'      
           DEV_META: 'http://192.168.123.214:8080'
           # 預設賬號 apollo admin
         depends_on:
           - apollo-db
         ports:
           - "8070:8070"
         volumes:
           - ./logs/:/opt/logs         
         networks:
           - devopsnetwork
    
     networks:
       devopsnetwork:
         external: true
     ```
    
    

部署成功

部署機器IP:192.168.123.214

使用 K8S 安裝

跟著官方文檔一步步來即可,helm 的文件可以從 apolloconfig/apollo-helm-chart 獲取,這裡只分享下步驟和些註意的地方

  1. 初始化資料庫

    1. 可以使用已有或者部署 mysql 服務,並創建 apollo 專門的賬號密碼
    2. 執行 Apollo 對應版本的 v2.1 預設初始化腳本 創建 ApolloConfigDB,ApolloPortalDB
    3. 生產環境 記得修改 ServerConfig 表的 環境和組織apollo.portal.envs:pro organizations:[{"orgId":"xxx","orgName":"xxx公司"}]
  2. 使用 helm 添加 apollo repo

  3. 安裝 apollo-service

  4. 安裝 apollo-portal

  5. k8s 使用

    • 可以將 Apollo 相關配置存儲到 k8s 的 ConfigMap 中方便 k8s 服務中使用

使用

.NET SDK

官方:Com.Ctrip.Framework.Apollo.Configuration

  1. 添加包:Com.Ctrip.Framework.Apollo.Configuration

  2. appsetting.json 中添加 apollo 配置

    1. MetaServer:Apollo 服務地址,系統信息中也可以查看到
    2. AppId:應用 Id
    3. Namespaces:命名空間預設是 application
  3. 獲取參數註冊:可以是配置,也可以是從環境變數中

    builder.Configuration.AddApollo(builder.Configuration.GetSection("apollo"));

  4. 註入 IConfiguration 使用即可

連接配置

  "apollo": {
    "MetaServer": "http://192.168.123.214:8080",
    "AppId": "devops.test",
    "Namespaces": [ "application" ]
  }

Demo 示例

dotnet v7.0

var builder = WebApplication.CreateBuilder(args);
builder.Configuration.AddApollo(builder.Configuration.GetSection("apollo"));
app.MapGet("/config", context =>
{
    context.Response.Headers["Content-Type"] = "text/html; charset=utf-8";
    //配置服務
    var configService = context.RequestServices.GetRequiredService<IConfiguration>();
    string? key = context.Request.Query["key"];
    if (string.IsNullOrWhiteSpace(key))
    {
        return context.Response.WriteAsync("獲取配置:/config?key=test");
    }
    var value = configService[key];
    return context.Response.WriteAsync(value ?? "undefined");
});

完整 Demo 示例 :Github 地址

踩過的坑

  • 資料庫配置連接,使用服務名,而不是容器名
  • -Deureka.instance.homePageUrl 和 -Deureka.service.url 參數一開始沒有理解到是做什麼的,只知道配置健康檢查失敗,看了文檔才理解到是 Deureka.instance.homePageUrl 是註冊的服務地址,-Deureka.service.url 是註冊中心的介面地址

相關文檔

後語

時間充裕的情況最好是過一遍文檔,知道是怎麼設計的,遇到問題真會一頭霧水。

每天進步一點,哪怕只是一點!

作者:易墨
Github:yimogit
純靜態工具站點:metools
說明:歡迎拍磚,不足之處還望園友們指出;
迷茫大概是因為想的太多做的太少。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 各種閑著沒事的 scanf 奇葩用法 然而這些卻很好用誒。 同理,scanf 可以拓展到 sscanf、fscanf~ 例題:P1580 yyy loves Easter_Egg I、P7911 網路連接 未計入更加奇葩的 C 語言用法,比如 %i %a 這種明顯等價的轉換字元。 基礎1:整數輸入 ...
  • 今天在對接支付寶 APP 支付的時候遇到了一個報錯,記錄下問題的排查過程~ 報錯過程 APP 中彈窗提示的報錯“商家訂單參數異常,請重新發起付款”,檢查了下參數感覺沒啥問題,不知道是啥問題導致的。 去官網搜了下,折騰排查了一遍,發現是環境問題,沒有切到沙箱環境導致的 (*/ω\*) 。 先放個官網提 ...
  • Gradle8.4構建SpringBoot多模塊項目 一、基本 1、版本 這個版本是Jdk8最後一個SpringBoot版本 軟體 版本 Gradle 8.4 SpringBoot 2.7.15 JDK 8 2、Gradle基本介紹 2.1、使用Wrapper方式構建 好處:統一gradle的版本 ...
  • 背景 在我們系統中有這麼一個需求,業務方會通過mq將一些用戶信息傳給我們,我們的服務處理完後,再將信息轉發給子系統。mq的內容如下: @Data public class Person { //第一部分 private Integer countryId; private Integer compa ...
  • 1 ELK日誌系統 經典的ELK架構或現被稱為Elastic Stack。Elastic Stack架構為Elasticsearch + Logstash + Kibana + Beats的組合: Beats負責日誌的採集 Logstash負責做日誌的聚合和處理 ES作為日誌的存儲和搜索系統 Kib ...
  • 一、排查過程 問題發現是因為當時接到了記憶體UMP報警信息,如下: 通過查看PFinder發現記憶體一直在增長,沒有停止跡象,觸發fullGC也並沒有下降趨勢: 當機立斷,先立即去NP上摘除了此台機器流量,然後繼續觀察,發現記憶體依然在不斷增長。 隨即查看故障分析,並沒有得到有效信息: 因為流量已經摘除, ...
  • CodeBuilder是一款強大的代碼生成工具,目前發佈了 3.2 版本,大家可以前去下載體驗 官方主頁。 1、多種數據源 基於 ADO.NET 的數據驅動 Power Designer PDManer DbSchema Swagger 這幾種數據源基本上已經覆蓋了我們常用的數據環境了,如果你有能力 ...
  • 300元到手啦-阿裡云云工開物計劃 阿裡雲要給所有中國高校在讀大學生每人送一臺雲伺服器 先放鏈接: 點擊進入 優惠券適用於以下場景 阿裡雲預付費通用,增量帶寬,降級,阿裡雲按量付費賬單,新購,續費,轉正,帶寬補償,試用,轉換訂單,更換操作系統,擴容,升級,換購 必須是在校大學生且完成認證,認證跟著指 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...