当前位置: 首页 > news >正文

Apollo 配置中心的部署与使用经验

前言

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.7container_name: apollo_db_5_7restart: alwaysenvironment:TZ: Asia/ShanghaiMYSQL_ROOT_PASSWORD: 'devops666'ports:- "13306:3306"volumes:- ./initsql:/docker-entrypoint-initdb.d- ./data:/var/lib/mysqlnetworks:- devopsnetwork# Apollo 服务发现注册中心apollo-configservice:container_name: apollo_configservice_2_1image: apolloconfig/apollo-configservice:2.1.0restart: alwaysdepends_on:- apollo-dbenvironment: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: falsevolumes:- ./logs:/opt/logsports:- "8080:8080"networks:- devopsnetwork#核心接口服务apollo-adminservice:container_name: apollo_adminservice_2_1image: apolloconfig/apollo-adminservice:2.1.0restart: alwaysenvironment: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-dbports:- "8090:8090"volumes:- ./logs/:/opt/logs      networks:- devopsnetworkapollo-portal:image: apolloconfig/apollo-portal:2.1.0container_name: apollo_portal_2_1restart: alwaysenvironment: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 admindepends_on:- apollo-dbports:- "8070:8070"volumes:- ./logs/:/opt/logs         networks:- devopsnetworknetworks: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 地址
  • 官方文档
  • 模块介绍
  • Docker 方式部署 Quick Start
  • 分布式部署
  • 部署架构
  • 性能测试
  • .NET SDK: apollo.net
  • 默认初始化脚本
  • 跳过服务发现
  • 配置说明

后语

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

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

相关文章:

Apollo 配置中心的部署与使用经验

前言 Apollo&#xff08;阿波罗&#xff09;是携程开源的分布式配置管理中心。 本文主要介绍其基于 Docker-Compose 的部署安装和一些使用的经验 特点 成熟&#xff0c;稳定支持管理多环境/多集群/多命名空间的配置配置修改发布实时&#xff08;1s&#xff09;通知到应用程序支…...

Perl中的设计模式革新:命令模式的实现与应用

Perl中的设计模式革新&#xff1a;命令模式的实现与应用 在面向对象编程中&#xff0c;设计模式是解决特定问题的成熟模板。命令模式作为行为设计模式之一&#xff0c;它将请求封装为对象&#xff0c;从而允许用户根据不同的请求对客户进行参数化。本文将深入探讨如何在Perl中…...

Java8-求两个集合取交集

在Java8中&#xff0c;求两个集合的交集可以使用不同的三种方式&#xff1a;传统的循环遍历、使用Stream API的filter操作和使用Stream API的Collection操作。 方法一&#xff1a;传统的循环遍历 首先&#xff0c;我们创建两个集合list1和list2&#xff0c;并给它们添加一些元…...

爬虫学习4:爬取王者荣耀技能信息

爬虫&#xff1a;爬取王者荣耀技能信息&#xff08;代码和代码流程&#xff09; 代码 # 王者荣耀英雄信息获取 import time from selenium import webdriver from selenium.webdriver.common.by import By if __name__ __main__:fp open("./honorKing.txt", "…...

在Ubuntu 14.04上安装和使用Memcache的方法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 简介 随着您的网站的增长和流量的增加&#xff0c;最快显示压力的组件之一是后端数据库。如果您的数据库没有分布式和配置来处理高负载…...

PCDN技术如何降低运营成本?

PCDN技术通过以下几种方式降低运营商的运营成本: 1.利用用户设备作为缓存节点: PCDN技术将用户设备纳入内容分发网络&#xff0c;利用这些设备的闲置带宽和存储资源来缓存和分发内容。这种方式不需要运营商投入大量的高成本服务器和带宽资源&#xff0c;从而降低了硬件和带宽…...

服务器数据恢复—V7000存储硬盘故障脱机的数据恢复案例

服务器存储数据恢复环境&#xff1a; 某品牌P740小型机AIXSybaseV7000磁盘阵列柜&#xff0c;磁盘阵列柜中有12块SAS机械硬盘&#xff08;其中包括一块热备盘&#xff09;。 服务器存储故障&#xff1a; 磁盘阵列柜中有一块磁盘出现故障&#xff0c;运维人员用新硬盘替换掉故障…...

BSV区块链在人工智能时代的数字化转型中的角色

​​发表时间&#xff1a;2024年6月13日 企业数字化转型已有约30年的历史&#xff0c;而人工智能&#xff08;以下简称AI&#xff09;将这种转型提升到了一个全新的高度。这并不难理解&#xff0c;因为AI终于使企业能够发挥其潜力&#xff0c;实现更宏大的目标。然而&#xff0…...

android audio 相机按键音:(二)加载与修改

相机按键音资源&#xff0c;加载文件路径&#xff1a; frameworks/av/services/camera/libcameraservice/CameraService.cpp 按键音&#xff0c;加载函数&#xff1a; void CameraService::loadSoundLocked(sound_kind kind) { ATRACE_CALL(); LOG1("Cam…...

Linux grep技巧 提取log中的json数据

目录 一. 前提1.1 数据准备1.2 需求1.3 分析 二. 数据提取2.1 提取所有的json数据2.2 提取子项目的全部json数据2.3 提取指定项目的json数据 一. 前提 1.1 数据准备 545-1 2024/07/20 18:20:21 [ERROR] MPX001 eventControlleraupay transactionIdA545 {"event":&q…...

HDShredder 7 企业版案例分享: 依照国际权威标准,安全清除企业数据

HDShredder 7 企业版用户案例 天津鸿萌科贸发展有限公司是德国 Miray 公司 HDShredder 数据清除软件的授权代理商。近日&#xff0c;上海某网络科技有限公司采购 HDShredder 7 企业版x4&#xff0c;为公司数据存储资产的安全清除工作流程配备高效的执行工具。HDShredder 7 企业…...

centos系统使用mysqldump数据备份与恢复

文章目录 使用mysqldump备份数据库一、数据库备份1. 基础备份2. 额外选项(一般组合使用) 二、数据库恢复 使用mysqldump备份数据库 一、数据库备份 1. 基础备份 #备份单个数据库 mysqldump -u 用户名 -p 数据库名 > 备份文件.sql#备份多个数据库 mysqldump -u 用户名 -p …...

【element ui】input输入控件绑定粘贴事件,从 Excel 复制的数据粘贴到输入框(el-input)时自动转换为逗号分隔的数据

目录 1、需求2、实现思路:3、控件绑定粘贴事件事件修饰符说明: 4、代码实现&#x1f680;写在最后 1、需求 在 Vue 2 和 Element UI 中&#xff0c;要实现从 Excel 复制空格分隔的数据&#xff0c;并在粘贴到输入框&#xff08;el-input&#xff09;时自动转换为逗号分隔的数据…...

Chapter18 基于物理的渲染——Shader入门精要学习

Chapter18 基于物理的渲染 一、PBS理论和数学基础1.光是什么微表面模型 2.渲染方程3.精确光源4.双向反射分布函数 BRDF5.漫反射项&#xff08;Lambert 模型&#xff09;Lambertian BRDF为&#xff1a;Disney BRDF中漫反射项 6.高光反射项微面元理论BRDF的高光反射项①菲涅尔反射…...

DolphinScheduler学习

1.查看文档 点击访问&#xff1a;https://dolphinscheduler.apache.org/zh-cn/docs 我们可以看到相关的文档简介里有 介绍 DolphinScheduler是Apache DolphinScheduler 是一个分布式易扩展的可视化DAG工作流任务调度开源系统。适用于企业级场景&#xff0c;提供了一个可视化…...

我用Tauri开发的待办效率工具开源了!

开源仓库地址 gitee Git仓库地址:https://gitee.com/zhanhongzhu/zhanhongzhu.git 应用地址 windows应用地址下载 https://kestrel-task.cn 具体内容 也可以看&#x1f389;使用Taurivitekoa2mysql开发了一款待办效率应用 这篇文章。 &#x1f4bb;技术栈 Tauri: Tauri…...

【黑科技】:Laravel 项目性能提升 20 倍

令人激动的黑科技&#xff1a;Laravel 项目性能提升 20 倍 这个项目能够在无需修改任何代码且无需第三方扩展的前提下&#xff0c;将你的 Laravel 项目性能提高 20 倍。它仅依赖于 PHP 原生的 pcntl、posix、fiber 和 sockets。 项目灵感 起因是看到官方发布的 PHP 8.1 更新…...

User Allocation In MEC: A DRL Approach 论文笔记

论文&#xff1a;ICWS 2021 移动边缘计算中的用户分配&#xff1a;一种深度强化学习方法 代码地址&#xff1a;使用强化学习在移动边缘计算环境中进行用户分配 目录 Ⅰ.Introduction II. MOTIVATION-A.验证假设的观察结果 II. MOTIVATION-A Motivating Example 数据驱动…...

leetcode 69. x 的平方根

可以使用二分查找法或牛顿迭代法来实现 LeetCode 问题 69. x 的平方根。下面是使用二分查找法和牛顿迭代法的 C 实现。 二分查找法 #include <iostream>class Solution { public:int mySqrt(int x) {if (x 0) return 0;int left 1, right x, ans 0;while (left <…...

基于词级ngram的词袋模型对twitter数据进行情感分析

按照阿光的项目做出了学习笔记&#xff0c;pytorch深度学习实战项目100例 基于词级ngram的词袋模型对twitter数据进行情感分析 什么是 N 符&#xff1f; N 格是指给定文本或语音样本中 n 个项目的连续序列。这些项目可以是音素、音节、字母、单词或碱基对&#xff0c;具体取…...

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log&#xff0c;共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题&#xff0c;不能使用ELK只能使用…...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日&#xff0c;中天合创屋面分布式光伏发电项目顺利并网发电&#xff0c;该项目位于内蒙古自治区鄂尔多斯市乌审旗&#xff0c;项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站&#xff0c;总装机容量为9.96MWp。 项目投运后&#xff0c;每年可节约标煤3670…...

跨链模式:多链互操作架构与性能扩展方案

跨链模式&#xff1a;多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈&#xff1a;模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展&#xff08;H2Cross架构&#xff09;&#xff1a; 适配层&#xf…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中&#xff0c;高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司&#xff0c;近期做出了一个重大技术决策&#xff1a;弃用长期使用的 Nginx&#xff0c;转而采用其内部开发…...

【AI学习】三、AI算法中的向量

在人工智能&#xff08;AI&#xff09;算法中&#xff0c;向量&#xff08;Vector&#xff09;是一种将现实世界中的数据&#xff08;如图像、文本、音频等&#xff09;转化为计算机可处理的数值型特征表示的工具。它是连接人类认知&#xff08;如语义、视觉特征&#xff09;与…...