前言

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 是注册中心的接口地址

相关文档

后语

时间充裕的情况最好是过一遍文档,知道是怎么设计的,遇到问题真会一头雾水。

每天进步一点,哪怕只是一点!

Apollo 配置中心的部署与使用经验的更多相关文章

  1. docker apollo配置中心分布式部署

    Apollo 简介 Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境.不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限.流程治理等特性,适用于微服 ...

  2. 基于winserver的Apollo配置中心分布式&集群部署实践(正确部署姿势)

    基于winserver的Apollo配置中心分布式&集群部署实践(正确部署姿势)   前言 前几天对Apollo配置中心的demo进行一个部署试用,现公司已决定使用,这两天进行分布式部署的时候 ...

  3. Win10上部署Apollo配置中心

    基于Docker在Win10上部署Apollo配置中心 https://www.jianshu.com/p/a1215056ce75 http://nobodyiam.com/2016/07/09/i ...

  4. Apollo配置中心

    背景: 当前我们项目,所有的配置基本都是通过本地properties 文件进行配置的,比如ip地址.端口.消息中间件和数据库连接的各种参数,当我们需要切换环境或调整参数的时候,我们必须手动的修改这些配 ...

  5. apollo配置中心初探

    近在搞微服务框架的开发,需要有一个配置中心来满足统一管理业务应用以及组件的配置,在此期间也使用了多个配置中心比如:spring cloud config,自研的配置中心,当然还有apollo. spr ...

  6. spring boot2.1读取 apollo 配置中心1

    第一篇:搭建apollo配置中心 为什么选择apollo,我做了一些对比:   Diamond Disconf Apollo Spring Cloud Config 数据持久性 mysql mysql ...

  7. Apollo配置中心转

    尊重原创,本文转自:https://www.cnblogs.com/FlyAway2013/p/8811385.html 前我们项目,所有的配置基本都是通过本地properties 文件进行配置的,比 ...

  8. 携程 Apollo 配置中心传统 .NET 项目集成实践

    官方文档存在的问题 可能由于 Apollo 配置中心的客户端源码一直处于更新中,导致其相关文档有些跟不上节奏,部分文档写的不规范,很容易给做对接的新手朋友造成误导. 比如,我在参考如下两个文档使用传统 ...

  9. Spring Boot 2.0 整合携程Apollo配置中心

    原文:https://www.jianshu.com/p/23d695af7e80 Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境.不同集群的配置,配置修改后能够 ...

  10. Apollo配置中心介绍与使用指南

    转载于https://github.com/ctripcorp/apollo,by Ctrip, Inc. Apollo配置中心介绍 Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中 ...

随机推荐

  1. 【ssh】SSH连接远程主机的两种方式

    一.基于用户名与密码连接 指令 ssh username@server_ip 随后要求输入密码 加密流程 1️⃣ 在SSH连接建立过程中,客户端和服务器使用Diffie-Hellman密钥交换协议协商 ...

  2. 《Among Us》火爆全球,实时语音助力派对游戏开启第二春

    今年在全球"宅经济"的影响下,社交派对类游戏意外的迎来了爆发. 8月份,<糖豆人:终极淘汰赛>突然爆火,创造了首日150万玩家.首周Steam 200万销量.单周Twi ...

  3. 即构SDK8月迭代:新增下行网络测速、切换房间、预览首帧回调等多项功能

    即构SDK8月上新,网络探测模块新增下行网络测速.媒体播放器新增缓存到文件结尾的回调.新增切换房间功能.新增预览首帧回调等.本月SDK迭代新上线的功能非常丰富,详细内容请看下文. LiveRoom 新 ...

  4. hexo博客git报错

    一.意外的标记异常 1.异常内容: xxx:blog xxxx$ hexo g INFO Start processing FATAL Something's wrong. Maybe you can ...

  5. Android进阶-NDK技术

    一.介绍 1.什么是ndk技术? 在学习ndk技术前,我们需要先了解一下JNI(Java Native Interface)技术,JNI技术是一种实现Java代码和C/C++代码之间交互的技术,它提供 ...

  6. JSGRID loaddata显示超级多空行

    这个逼问题困扰了我两天了 作为一个主后端的程序员 初体验前端技术栈真的麻之又麻 以防万一 请先确认 是不是和我一个情况 如果是 请往下看 首先 我们需要念一段咒语 json是json string是s ...

  7. vue + canvas 实现涂鸦面板

    前言 专栏分享:vue2源码专栏,vue router源码专栏,玩具项目专栏,硬核 推荐 欢迎各位 ITer 关注点赞收藏 此篇文章用于记录柏成从零开发一个canvas涂鸦面板的历程,最终效果如下: ...

  8. 使用MkDocs搭建个人博客

    使用MkDocs搭建个人博客 接触编程已经好几年了,阅读了无数大佬的博客文章,但是从来没有自己写过.这其中最重要的原因当然是懒惰,觉得写博客太费时间了,对自己的帮助也不大.可是如今发现自己的记性越来越 ...

  9. 如何使用关键词搜索API接口获取到快手的商品

    如果您想使用关键词搜索API接口获取到快手的商品,可以通过以下步骤实现: 1. 首先注册账号.根据文档申请相应的接口权限. 2. 确定需要使用的API接口.对于商品搜索,您可以查看相关的API文档以获 ...

  10. LeetCode952三部曲之二:小幅度优化(137ms -> 122ms,超39% -> 超51%)

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本文是<LeetCode952三部曲& ...