1.Apollo简介
Apollo 是由携程开发的,开源的分布式配置中心。Apollo支持不同环境,不同集群下的配置实时修改更新,同时也提供了版本管理,权限等功能。
2.Apollo的工作流程
在展示工作流程之前先说一下Apollo各个模块的作用。
Portal:展示配置列表数据,提供修改配置页面等。
Apollo Portal Db:主要存放Portal端用户信息,用户权限配置等。Role(角色表),Permission (权限表),应用程序接入当前Apollo配置中心相关的表。
Admin Service:为Portal端提供配置修改,发布功能接口等。
Config Service:为Client(应用程序)提供配置获取,配置推送接口等
Config Db:配置信息存放,区分应用程序部署等。Audit(日志审计表),Cluster(集群表),NameSpace(命名空间),Item(配置项目)等。
Apollo基本的工作流程如下图:
1.1~4步骤,用户登录至Portal端,Portal通过自身数据库(Apollo Portal DB)获取该用户所拥有的权限,向用户展示配置列表。
2.5~7步骤,用户通过Portal修改及发布配置信息,Portal调用Admin Service 修改及发布的接口把配置信息的信息保存至数据库(Apollo Config DB),同时,Admin Service也会向Config Service 推送更新消息。
3.8~10步骤,Config Service 通过Admin Service端的实时消息推送(或者数据库定期拉取)获取到配置更新通知,Config Service也会向订阅了信息的Client(应用程序)发送配置更新信息,然后Client通过Config Service提供的配置拉取接口获取最新配置信息。
为了方便大家理解上述步骤中省去了Eureka及Meta Service中间模块。但其实,Admin Service及Config Service已经集成了该中间模块。这两个模块作用分别是:
Eureka主要作用就是为Admin Service及Config Service提供注册平台,实现Apollo的高可用。
Meta Service则是对Eureka功能的封装。
则Apollo的基本流程应该是Portal端及Client端需要通过Meta Service分别查找Admin Service 及 Config Service。在Portal端及Client端与Meta Service交互之间,我们还可以再增加一层NginxLB(也称Software Load Balancer)实现负载均衡。
下面是Apollo完整的架构图:
3.Apollo基本使用
3.1. Apollo服务器搭建
我们先从Apollo github官网下载已编译好的安装包或者可以自行下载源码进行编译,github地址:https://github.com/ctripcorp/apollo/releases。我们需要下载三个压缩包:Admin Service、Config Service、Portal。
同时还需要下载数据库。Admin Service与Config Service共用一个数据库apolloconfigdb.sql。Portal单独使用一个数据库apolloportaldb.sql。下载数据库后我们直接导入sql即可。导入完sql之后我们还需要修改这三个服务的配置文件信息。
Admin Service、Config Service、Portal 配置文件的目录都在压缩包的config文件夹下:
数据库连接信息在中application-github.properties
Portal的环境配置信息位于apollo-env.properties下,不同的环境需要配置不同的MetaService服务地址,对于自己不需要的环境可以删除。Config Service默认的是localhost:8080,与配置文件中的一致也就不需要修改了,该配置修改后需要重新启动Portal服务。
把Admin Service,Config Service及Portal对应路径下的数据库路径配置好之后就启动服务了。
在我们刚启动Admin Service或者Config Service会有报错 Caused by: java.net.ConnectException: Connection refused: connect
但是,当我们把Config Service启动运行一段时间后,可以发现控制台中输出了两个服务进行了注册,且报错信息也随之消失。因为在默认情况下,Meta Service和Config Service是部署在同一个JVM进程(也就是同一个jar中,Config service的地址就是Meta Service的地址),Confi Service启动的时候,Meta Service还没完全启动,Config Service及Admin Service服务也就无法向Meta Server注册。
Portal 服务默认地址http://localhost:8070/signin,当你看到以下页面说明你的服务端已经可以搭建起来了。默认账号:apollo 密码:admin
Apollo 有四个维度的Key-Value管理。分别是Application,NameSpace,Cluster,Enviroment。注意:这里说的NameSpace(命名空间)本质上就是配置文件(文件类型:xml、json、yml、yaml、txt),文件属性类型分为:priavate(私有的),public(公有的),关联类型(继承类型,本质上属于私有类型,可用于覆盖公有类型)三种。
Apollo Portal端操作三个维度Key-Value的如下。
Application,在Apollo Portal端主页为项目列表,我们可以通过这个端创建项目,右上角管理员工具中可以对Application,Cluster,NameSpace进行删除。
NameSpace,Cluster。进入项目详情,左上角是环境列表,环境的子节点为集群,左下方可以对集群及NameSpace进行添加。中间部分内容为NameSpace列表,列表项左上角则是当前NameSpace的类型,右侧则是对该NameSpace下配置进行操作的地方。
Enviroment则需要到apollo-env.properties配置(修改后需要重启),且每个环境需要提供配套的数据库支持。
3.2.应用程序引入Apollo
Apollo配置中心支持:Api接入(自编码方式),Spring整合,Spring方式与Api方式整合。
现在主要介绍的是Api的接入方式
1.pom.xml添加Apollo客户端依赖
com.ctrip.framework.apollo
apollo-client
1.5.1
2.application.properties配置Apollo服务器信息
app.id=apollo-client
#注入命名空间
#apollo.bootstrap.namespaces = application,FX.apollo,application.yml 注入多个命名空间
apollo.bootstrap.namespaces = application
#meta服务路径(默认情况下,metaService路径与configService服务路径一样)
apollo.meta=http://localhost:8080/
#自定义缓存路径
apollo.cacheDir=E:\\project\\apollo\\apollo-client
#程序端口
server.port=9090
3.Apollo配置监听类ApolloApiConnect.java
import com.ctrip.framework.apollo.Config;
import com.ctrip.framework.apollo.ConfigChangeListener;
import com.ctrip.framework.apollo.ConfigService;
import com.ctrip.framework.apollo.model.ConfigChange;
import com.ctrip.framework.apollo.model.ConfigChangeEvent;
import java.util.HashSet;
import java.util.Set;
public class ApolloApiConnect {
public void getApolliConfig(){
// 获取名为namespacetest的命名空间
// Config config=ConfigService.getConfig("namespacetest");
// 获取名为namespacetest的命名空间(带配置文件格式)
// Config config=ConfigService.getConfigFile("namespacetest", ConfigFileFormat.Properties);
// 默认获取名为application命名空间配置
Config config=ConfigService.getAppConfig();
Set var1=new HashSet<>();
Set var2=new HashSet<>();
// 添加application命名空间配置修改监听
config.addChangeListener(new ConfigChangeListener() {
@Override
public void onChange(ConfigChangeEvent configChangeEvent) {
// 获取命名空间名称
String nameSpace=configChangeEvent.getNamespace();
String strChangeKey="testKey";
// 判断testKey是否有改变
if(configChangeEvent.isChanged(strChangeKey)){
// 获取键值
ConfigChange testKeyChange=configChangeEvent.getChange("testKey");
// 更新前
String newValue= testKeyChange.getNewValue();
// 更新后
String oldValue=testKeyChange.getOldValue();
}
}
}, var1, var2);
// 配置集合
Set propertyNames =config.getPropertyNames();
// 获取配置文件是从远程加载,本地缓存加载或者加载失败
config.getSourceType().getDescription();
// 获取类型为boolean的
// config.getBooleanProperty()
// config还提供了其他获取类型配置的方法
}
}
启动类ApolloClientApplication.java
@SpringBootApplication
public class ApolloClientApplication {
public static void main(String[] args) {
// 设置获取配置环境
System.setProperty("env","DEV");
SpringApplication.run(ApolloClientApplication.class, args);
new ApolloApiConnect().getApolliConfig();
}
}
到此为止,应用程序中已经可以正常监听Apollo配置信息。
启动找不到环境问题(Environment is set to null)
第一次写文章,如果有哪里写得不对,或者不好的请大家评论留言给我指出,谢谢!