Apollo基本使用

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基本的工作流程如下图:

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完整的架构图:

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文件夹下:

Apollo Config Service配置文件路径

数据库连接信息在中application-github.properties

application-github.properties

Portal的环境配置信息位于apollo-env.properties下,不同的环境需要配置不同的MetaService服务地址,对于自己不需要的环境可以删除。Config Service默认的是localhost:8080,与配置文件中的一致也就不需要修改了,该配置修改后需要重新启动Portal服务。

apollo-env.properties

把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注册。

Config Service与Admin Service向Meta Service注册

Portal 服务默认地址http://localhost:8070/signin,当你看到以下页面说明你的服务端已经可以搭建起来了。默认账号:apollo 密码:admin

Apollo Portal端登录页面

Apollo 有四个维度的Key-Value管理。分别是ApplicationNameSpaceClusterEnviroment注意:这里说的NameSpace(命名空间)本质上就是配置文件(文件类型:xml、json、yml、yaml、txt),文件属性类型分为:priavate(私有的),public(公有的),关联类型(继承类型,本质上属于私有类型,可用于覆盖公有类型)三种。
Apollo Portal端操作三个维度Key-Value的如下。
Application,在Apollo Portal端主页为项目列表,我们可以通过这个端创建项目,右上角管理员工具中可以对Application,Cluster,NameSpace进行删除。

Apollo Portal端主页

NameSpace,Cluster。进入项目详情,左上角是环境列表,环境的子节点为集群,左下方可以对集群及NameSpace进行添加。中间部分内容为NameSpace列表,列表项左上角则是当前NameSpace的类型,右侧则是对该NameSpace下配置进行操作的地方。

Apollo Portal端项目详情

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)

第一次写文章,如果有哪里写得不对,或者不好的请大家评论留言给我指出,谢谢!

你可能感兴趣的:(Apollo基本使用)