配置中心-Apollo

配置中心-Apollo

2019/10/01 Chenxinphp

配置服务主要有 携程Apollo、百度Disconf、阿里ACM,目前以Apollo用户量最大.适用场景,多用于微服务,与K8S结合好.html

携程Apollo
https://github.com/ctripcorp/apollo
Apollo - A reliable configuration management system.
Apollo(阿波罗)是携程框架部门研发的分布式配置中心,可以集中化管理应用不一样环境、不一样集群的配置,配置修改后可以实时推送到应用端,而且具有规范的权限、流程治理等特性,适用于微服务配置管理场景。服务端基于Spring Boot和Spring Cloud开发,打包后能够直接运行,不须要额外安装Tomcat等应用容器。
Java客户端不依赖任何框架,可以运行于全部Java运行时环境,同时对Spring/Spring Boot环境也有较好的支持。
.Net客户端不依赖任何框架,可以运行于全部.Net运行时环境。java

百度Disconf
https://github.com/knightliao/disconf
Disconf - Distributed Configuration Management Platform(分布式配置管理平台).
百度disconf是一套完整的基于zookeeper的分布式配置统一解决方案。一个分布式环境中,同类型的服务每每会部署不少实例。这些实例使用了一些配置,为了更好地维护这些配置就产生了配置管理服务。经过这个服务能够轻松地管理成千上百个服务实例的配置问题。专一于各类「分布式系统配置管理」的「通用组件」和「通用平台」, 提供统一的「配置管理服务」.
主要目标
部署极其简单:同一个上线包,无须改动配置,便可在 多个环境中(RD/QA/PRODUCTION) 上线.
部署动态化:更改配置,无需从新打包或重启,便可 实时生效.
统一管理:提供web平台,统一管理 多个环境(RD/QA/PRODUCTION)、多个产品 的全部配置.
核心目标:一个jar包,处处运行.node

阿里ACM
https://help.aliyun.com/product/59604.html?spm=a2c4g.11186623.6.540.29a137332X3Muy 阿里云文档(ACM文档)
应用配置管理 ACM 是一款在分布式架构环境中对应用配置进行集中管理和推送的产品。
利用 ACM,您能够在微服务、DevOps、大数据等场景下极大减轻配置管理的工做量,并加强配置管理的服务能力。
应用配置管理 ACM(Application Configuration Management)前身为淘宝内部配置中心 Diamond,现已做为 Nacos 的配置中心模块开源。
应用场景:在应用生命周期管理中,开发人员一般会将应用中须要变动的一些配置项或者元数据从代码中分离出来,放在单独的配置文件中管理,这些单独管理的内容就称为应用配置。这种分离应用配置的方法是管理应用变动的常见手段之一。发布应用后,运维人员或最终用户能够经过调整配置来适配环境,或调整应用程序的运行行为。
ACM 是面向分布式系统的配置中心。凭借配置变动、配置推送、历史版本管理、灰度发布、配置变动审计等配置管理工具,ACM 能帮助您集中管理全部应用环境中的配置,下降分布式系统中管理配置的成本,并下降因错误的配置变动带来可用性降低甚至发生故障的风险。python

比较
目前大多认为 Apollo优于Disconf优于ACM.mysql

Apollo

参考
https://github.com/ctripcorp/apollolinux

架构说明

参考: https://github.com/ctripcorp/apollo/wiki/Apollo配置中心介绍git

架构图: 略.
Apollo的整体设计,咱们能够从下往上看:github

Config Service提供配置的读取、推送等功能,服务对象是Apollo客户端
Admin Service提供配置的修改、发布等功能,服务对象是Apollo Portal(管理界面)
Config Service和Admin Service都是多实例、无状态部署,因此须要将本身注册到Eureka中并保持心跳
在Eureka之上咱们架了一层Meta Server用于封装Eureka的服务发现接口
Client经过域名访问Meta Server获取Config Service服务列表(IP+Port),然后直接经过IP+Port访问服务,同时在Client侧会作load balance、错误重试
Portal经过域名访问Meta Server获取Admin Service服务列表(IP+Port),然后直接经过IP+Port访问服务,同时在Portal侧会作load balance、错误重试
为了简化部署,咱们实际上会把Config Service、Eureka和Meta Server三个逻辑角色部署在同一个JVM进程中web

基本概念解析

参考:
https://github.com/ctripcorp/apollo/wiki/Apollo使用指南
https://github.com/ctripcorp/apollo/wiki/Apollo核心概念之"namespace"
https://github.com/ctripcorp/apollo/wiki/Apollo配置中心介绍

application (应用)
这个很好理解,就是实际使用配置的应用,Apollo客户端在运行时须要知道当前应用是谁,从而能够去获取对应的配置
每一个应用都须要有惟一的身份标识 -- appId,咱们认为应用身份是跟着代码走的,因此须要在代码中配置,具体信息请参见Java客户端使用指南。

environment (环境)
配置对应的环境,Apollo客户端在运行时须要知道当前应用处于哪一个环境,从而能够去获取应用的配置
咱们认为环境和代码无关,同一份代码部署在不一样的环境就应该可以获取到不一样环境的配置
因此环境默认是经过读取机器上的配置(server.properties中的env属性)指定的,不过为了开发方便,咱们也支持运行时经过System Property等指定,具体信息请参见Java客户端使用指南。

集群
经过添加集群,可使同一份程序在不一样的集群(如不一样的数据中心)使用不一样的配置
若是不一样集群使用同样的配置,则没有必要建立集群
Apollo默认会读取机器上/opt/settings/server.properties文件中的idc属性做为集群名字, 如SHAJQ(金桥数据中心)、SHAOY(欧阳数据中心)
在Portal的项目内,建立的集群名字须要和机器上server.properties中的idc属性一致.(这里指的应该是部署应用程序所在的机器吧?)

Namespace
一个应用下不一样配置的分组,能够简单地把namespace类比为文件,不一样类型的配置存放在不一样的文件中,如数据库配置文件,RPC配置文件,应用自身的配置文件等
应用能够直接读取到公共组件的配置namespace,如DAL,RPC等
应用也能够经过继承公共组件的配置namespace来对公共组件的配置作调整,如DAL的初始数据库链接数

灰度
A,B,C客户端机器.
配置项 timeout=20.
灰度为A机器保持默认主版本参数timeout=20,B,C机器为timeout=30.
运行一段时间,观察效果,再逐步将全部机器发布30.

安装与部署

参考
https://github.com/ctripcorp/apollo/wiki/分布式部署指南 分布式部署指南

机器配置说明(规划配置)
portal 192.168.143.130 portal+portalDB
dev 192.168.143.131 config+admin+configDB
pro 192.168.143.132 config+admin+configDB

JDK安装
cd /opt;
wget http://13.251.64.203:18081/jdk-8u181-linux-x64.tar.gz
tar xzvf jdk-8u181-linux-x64.tar.gz
mv /opt/jdk1.8.0_181 /usr/local/jvm

修改/etc/profile文件,添加:
cat >> /etc/profile << EOF
export JAVA_HOME=/usr/local/jvm
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
EOF

source /etc/profile
echo $PATH #确保/usr/local/jvm/bin排在首位
java -version

mysql安装
请参考mysql文档.建议安装 mysql-5.7.27版本.

DB设置.

CREATE USER 'apollo'@'localhost' IDENTIFIED BY 'sj...8sg';
CREATE USER 'apollo'@'%' IDENTIFIED BY 'sj...8sg';

# 只设置1台potal(130)
create database apolloportaldb;
GRANT ALL PRIVILEGES ON apolloportaldb.* TO 'apollo'@'%';
GRANT ALL PRIVILEGES ON apolloportaldb.* TO 'apollo'@localhost;

# 1台DEV 与 1台PRO 均设置(131,132)
create database apolloconfigdb;
GRANT ALL PRIVILEGES ON apolloconfigdb.* TO 'apollo'@'%';
GRANT ALL PRIVILEGES ON apolloconfigdb.* TO 'apollo'@localhost;

mysql的sql文件导入,请参考后面git克隆代码部分.

github克隆代码(目的主要为获取sql表数据,另外也能够自行编译Apollo)
在portal,config+admin机器/opt/目录分别执行
git clone https://github.com/ctripcorp/apollo.git

拉取的代码里,包含sql文件,以下
/opt/apollo-all-code-git/scripts/db/migration/

[root@localhost migration]# tree
.
├── configdb
│   └── V1.0.0__initialization.sql  #config的sql导入文件(供config和admin服务)
├── flyway-configdb.properties
├── flyway-portaldb.properties
└── portaldb
    └── V1.0.0__initialization.sql  #portal的sql导入文件(供portal服务)

将以上2个sql分别导入到1台portal-DB和 2台config-DB里.

采用直接下载打包好的文件解压
下载路径(从GitHub的md文档,即Apollo文档中获得)
https://github.com/ctripcorp/apollo/releases/
获取对应的portal.zip,admin.zip,config.zip文件,解压,能够放到/opt/目录.其余目录也能够.默认日志文件会被丢到/opt/目录(配置文件里默认指定,能够修改).

文件/数据结构与配置文件解析/启停

文件说明
以portal为例

[root@localhost apollo-portal]# pwd
/opt/apollo-portal

[root@localhost apollo-portal]# tree
.
├── apollo-portal-1.4.0.jar
├── apollo-portal-1.4.0-sources.jar
├── apollo-portal.conf  #参考下文
├── apollo-portal.jar
├── config #参考下文
│   ├── apollo-env.properties
│   ├── application-github.properties
│   └── app.properties
└── scripts
    ├── shutdown.sh
    └── startup.sh

配置文件
安装portal,config,admin能够直接下载安装包方式.或者下载源码自行编译方式(编译主要适用于二次开发),这里未作尝试,如须要的话,建议使用阿里的maven库比较快.

配置项目有一部分是放在DB的表里的.

1.配置文件

protal配置文件

[root@localhost apollo-portal]# pwd
/opt/apollo-portal

[root@localhost apollo-portal]# cat apollo-portal.conf  (默认,无需修改)
MODE=service
PID_FOLDER=.
LOG_FOLDER=/opt/logs/100003173/

[root@localhost apollo-portal]# cat config/apollo-env.properties (2个环境,默认是多个被注释的)指定Eureka的地址
dev.meta=http://192.168.143.131:8080
pro.meta=http://192.168.143.132:8080

[root@localhost apollo-portal]# cat config/application-github.properties  (Portal访问本身DB的配置)
# DataSource
spring.datasource.url = jdbc:mysql://127.0.0.1:10306/ApolloPortalDB?characterEncoding=utf8 #这里DB在本地,因此为127地址.
spring.datasource.username = apollo
spring.datasource.password = sj...8sg

[root@localhost apollo-portal]# cat config/app.properties 默认(appId信息,为portal进程信息,日志是按照此id分类存储的.config为100003171,admin为100003172)
appId=100003173
jdkVersion=1.8

config配置文件

[root@localhost apollo-config]# pwd
/opt/apollo/apollo-config
[root@localhost apollo-config]# cat apollo-configservice.conf 保持默认
MODE=service
PID_FOLDER=.
LOG_FOLDER=/opt/logs/100003171/

[root@localhost config]# cat config/application-github.properties 须要修改,指定本身configDB地址
# DataSource
spring.datasource.url = jdbc:mysql://127.0.0.1:10306/ApolloConfigDB?characterEncoding=utf8
spring.datasource.username = apollo
spring.datasource.password = sj...8sg

[root@localhost config]# cat config/app.properties 保持默认
appId=100003171
jdkVersion=1.8

admin配置文件
略,同config服务的配置.

2.调整服务端配置
Apollo自身的一些配置是放在数据库里面的,因此须要针对实际状况作一些调整。
如下配置除了支持在数据库中配置之外,也支持经过-D参数、application.properties等配置,且-D参数、application.properties等优先级高于数据库中的配置.
这里以修改DB表字段为例,来调整服务器配置.

2.1调整ApolloPortalDB配置(Portal)
配置项统一存储在ApolloPortalDB.ServerConfig表中,也能够经过管理员工具 - 系统参数页面进行配置,无特殊说明则修改完一分钟实时生效。
apollo.portal.envs字段(可支持的环境列表),默认值是dev,若是portal须要管理多个环境的话,以逗号分隔便可(大小写不敏感),如:
DEV,FAT,UAT,PRO (ApolloPortalDB.ServerConfig表字段,本实验设置为 dev,pro)

2.2调整ApolloConfigDB配置(config)
配置项统一存储在ApolloConfigDB.ServerConfig表中,须要注意每一个环境的ApolloConfigDB.ServerConfig都须要单独配置,修改完一分钟实时生效。
eureka.service.url字段(Eureka服务Url).
这里dev和pro分别有1台,因此只须要添加本机(默认已有,为http://localhost:8080/eureka/).pro也只有1台,也同样.

启停
启动顺序
config(8080) -> admin(8090) -> portal(8070)
启停脚本路径(相似)
/opt/apollo-portal/scripts/startup.sh
/opt/apollo-portal/scripts/shutdown.sh

页面与服务说明
登录Portal:
http://192.168.143.130:8070/
默认用户名 apollo,密码 admin

登录Eureka(优瑞卡)(无用户名密码,由config提供的服务):
http://192.168.143.131:8080/
http://192.168.143.132:8080/

访问admin,相似
http://192.168.143.131:8090/ 页面显示 "apollo-adminservice"字符
http://192.168.143.132:8090/

Portal操做说明,使用指南

参考 https://github.com/ctripcorp/apollo/wiki/Apollo使用指南

建立项目
建立用户
修改系统参数(会修改DB),好比增长部门名称.
对不一样环境,DEV,PRO分别新增配置,并发布,或回滚.
添加集群
添加NameSpace

客户端

请参考应用程序接入部分.
思考,客户端更新是否成功,如何判断?须要手动写Java程序给出接口吗?仍是说Portal有对应的监控项?(好像没有).-> 能够经过应用程序机器本地的缓存配置目录中查看.另外,客户端配置信息监控,能够在界面上方便地看到配置在被哪些实例(IP)使用

应用程序接入

参考 https://github.com/ctripcorp/apollo/wiki/Java客户端使用指南
支持 Java, .net, 其余语言(第三方提供的Go,Python等)

Java接入
1.pom.xml引用插件
pom.xml里apollo的引用

2.指定读取哪一个Eureka机器里的数据
配置DEV仍是PRO环境,有多种方式.建议服务器方式配置(开发机不多会变成生产).在开发机的 /opt/setting/server.properties,内容
apollo.meta=http://192.168.143.131:8080/ 若是是多个机器(高可用),后面跟","隔开.今后Eureka里读取应用程序(如test,或app-id-01)的配置信息.

3.指定读取哪一个应用程序配置
apollo内项目的appid为test.那么须要录入到自身Java程序的 src->main->resource->META-INF->app.properties里: app.id=test (从Eureka里读取应用程序test的配置信息)

4.Java代码调用和验证
写java代码来调用apollo的配置信息,并自定义页面,检查是否成功.

其余语言
请参考官方文档说明(目前有用户提供了对应的python,nodejs,php,go等方式),或者使用http的api方式,具体说明参考官网文档.

缓存配置文件
客户端获取配置文件后,会写一份缓存的物理文件,放在本地.
因此应用程序,好比java或.net须要具备此目录的读写权限.
这个目录也能够在启动应用程序的时候指定,如-Dapollo.cacheDir=/opt/data/some-cache-dir
本地配置目录默认位于:
Mac/Linux: /opt/data/{appId}/config-cache

虚拟化部署

Docker,K8S的部署方式,请参考官方文档说明->分布式部署>-Docker,k8s.

用户与受权

参考 https://github.com/ctripcorp/apollo/wiki/Portal-实现用户登陆功能 用户登陆(LDAP,SSO)
LDAP接入

备份与恢复

数据库+配置文件

高可用

当前3台,分别为1台protal,1台dev,1台pro.现将pro也改成dev,以便模拟dev环境的高可用(2台).即实现Eureka的互备.
注意:这里,目的是config和admin服务高可用,DB仍为单点.protal的DB在130,config和admin的DB在131.

修改
1.130机器protal的DB表serverconfig字段apollo.portal.envs
值dev,pro->dev

2.131机器config的DB标serverconfig字段eureka.service.url
值http://localhost.../->http://192.168.143.131:8080/eureka/,http://192.168.143.132:8080/eureka/

3.130机器portal的配置文件
cat /opt/apollo-portal/config/apollo-env.properties
dev.meta=http://192.168.143.131:8080
pro.meta=http://192.168.143.132:8080
修改成
dev.meta=http://192.168.143.131:8080,http://192.168.143.132:8080

4.131和132上config和admin配置文件修改,数据库所有指向131机器
cat /opt/apollo/apollo-config/config/application-github.properties
spring.datasource.url = jdbc:mysql://192.168.143.131:10306/ApolloConfigDB?characterEncoding=utf8
spring.datasource.username = apollo
spring.datasource.password = xxx

确认
启动服务后,就只剩DEV环境了.

安全

Protal访问后端的Eureka,并无任何认证过程.那么,谁均可以经过http api方式,往config里注入数据.安全隐患. 故此不能开放给外网.

相关文章
相关标签/搜索