目录:

1、为什么需要配置中心
2、配置中心组件对比选型
3、集成Apollo
4、Apollo原理

为什么需要配置中心

假如我们的系统要去调用另一个系统的接口,于是我们在配置文件里加了如下一行配置。

guiji.company.url = http://118.118.118.18/sendMoney

突然有一天,调用的这个系统地址变了。那么这个时候我们就需要去调整我们配置文件里面的这个地址了,而且调整了之后需要重启才能够生效。
在白天的时候流量比较大,不能进行重启。所以只能等到凌晨1、2点的时候,把这个配置修改,进行重启。
还有就是,要是部署了多台机器,还需要到每一台机器上把配置文件给修改了,相当的麻烦,而且还容易遗漏。

使用配置中心就能解决这些问题,配置文件修改之后项目不需要进行重启,配置就能生效。而且配置统一进行管理,就算部署了多台机器,也只需要修改一次。

配置中心组件对比选型

目前比较主流的配置中心组件有:
Spring Cloud Config: Spring Cloud 生态组件,可以和Spring Cloud体系无缝整合。
Apollo: 携程开源的配置管理中心,具备规范的权限、流程治理等功能。
Nacos: 阿里开源的配置中心,也可以做注册中心。

其实这三个配置中心组件在功能上基本都能满足我们的使用需求。
Apollo和Nacos提供了一个操作界面,我们可以直接在界面上进行操作去修改配置,配置变更了之后,能把变更的配置实时推送到客户端。
Spring Cloud Config依赖于git\svn来去对配置进行管理,修改配置需要到git/svn上进行修改。而且Spring Cloud Config原生不支持配置的实时推送,需要依赖Git的WebHook、Spring Cloud Bus和客户端/bus/refresh端点。修改过程如下:
1、基于Git的WebHook,配置变更触发server端refresh
2、Server端接收到请求并发送给Spring Cloud Bus
3、Spring Cloud Bus接到消息并通知给客户端
4、客户端接收到通知,请求Server端获取最新配置
这整个过程比较复杂。

Nacos相对于Apollo来说,更轻量,读写性能比Apollo好。但是功能没有Apollo完善,像灰度发布和权限管理这块Nacos是不支持的。在生产环境做分布式部署的话,Apollo部署组件较多,运维成本较高。Nacos就简单多了,只需要部署NacosServer和mysql就可以了。

最终如何选择还是需要根据项目需求和结合实际资源来去决定。

如果你项目用的是Spring Cloud这套架构体系,那么推荐使用Spring Cloud Config,毕竟他们能无缝整合。可能使用起来不是那么方便,很多功能都需要基于git。但是开发整合起来更简单,能节省较多时间。Spring Cloud Config最大的缺点就是性能比较低。三节点读QPS也才20多,写只有5。要是对性能要求比较高那才需要去考虑Nacos或者Apollo。

如果项目使用Spring Cloud Alibaba这套架构体系,那么就推荐使用Nacos,因为Spring Cloud Alibaba中Nacos作为注册中心必须要存在,那么就无需再去整合其它东西进来了,配置中心就直接也使用Nacos。Nacos整体相对简洁,使用起来更方便,功能也比较完善。只是不支持灰度发布和权限管理。

如果你项目对性能有要求,而且需要支持灰度发布和权限管理的功能。或是你就是想用用Apollo,反正手下的人也比较闲。不在乎多一点的人力投入,那么用Apollo也是完全OK。

集成Apollo

我就是属于想用用Apollo,不在乎多花点时间的这种类型。所以接下来就把Apollo集成到项目里面来。

创建数据库

创建ApolloPortalDB和ApolloConfigDB两个数据库。创建脚本下面地址获取:
ApolloPortalDB:https://github.com/ctripcorp/apollo/blob/master/scripts/sql/apolloportaldb.sql ApolloConfigDB:https://github.com/ctripcorp/apollo/blob/master/scripts/sql/apolloconfigdb.sql 直接执行就可以了。

安装Apollo Config Service

1、获取镜像

docker pull apolloconfig/apollo-configservice

2、运行镜像

docker run -p 8080:8080 \
    -e SPRING_DATASOURCE_URL="jdbc:mysql://192.168.1.5:3306/ApolloConfigDB?characterEncoding=utf8" \
    -e SPRING_DATASOURCE_USERNAME=root -e SPRING_DATASOURCE_PASSWORD=123456 \
    -d -v /tmp/logs:/opt/logs --name apollo-configservice apolloconfig/apollo-configservice
安装Apollo Admin Service

1、获取镜像

docker pull apolloconfig/apollo-adminservice

2、运行镜像

docker run -p 8090:8090 \
    -e SPRING_DATASOURCE_URL="jdbc:mysql://192.168.1.5:3306/ApolloConfigDB?characterEncoding=utf8" \
    -e SPRING_DATASOURCE_USERNAME=root -e SPRING_DATASOURCE_PASSWORD=123456 \
    -d -v /tmp/logs:/opt/logs --name apollo-adminservice apolloconfig/apollo-adminservice
安装 Apollo Portal

1、获取镜像

docker pull apolloconfig/apollo-portal

2、运行镜像

docker run -p 8070:8070 \
    -e SPRING_DATASOURCE_URL="jdbc:mysql://192.168.1.5:3306/ApolloPortalDB?characterEncoding=utf8&serverTimezone=Asia/Shanghai" \
    -e SPRING_DATASOURCE_USERNAME=root -e SPRING_DATASOURCE_PASSWORD=123456 \
    -e APOLLO_PORTAL_ENVS=dev \
    -e DEV_META=http://192.168.1.5:8080 \
    -d -v /tmp/logs:/opt/logs --name apollo-portal apolloconfig/apollo-portal

Apollo Portal安装完成后,我们登录http://192.168.1.5:8070/就可以看到Apollo Portal的界面了。用户名/密码:apollo/admin。

好用的微服务配置中心 微服务配置中心原理_客户端

客户端

1、添加依赖
在项目dubboclient中添加依赖

<dependency>
   <groupId>com.ctrip.framework.apollo</groupId>
   <artifactId>apollo-client</artifactId>
   <version>1.7.0</version>
</dependency>

2、在配置文件中添加如下配置

app.id = dubboclient-apollo
apollo.meta = http://192.168.1.5:8080
apollo.cacheDir= D:/apollo/localcache

apollo.bootstrap.enabled = true
apollo.bootstrap.namespaces=application

3、在Apollo Portal界面中创建一个项目

AppId 要和上面配置文件中 app.id 的值一致。

好用的微服务配置中心 微服务配置中心原理_好用的微服务配置中心_02


4、添加配置项目创建好了就可以进入到项目中,添加配置,发布配置了。

好用的微服务配置中心 微服务配置中心原理_Cloud_03


好用的微服务配置中心 微服务配置中心原理_客户端_04


5、测试配置获取

在 dubboclient中添加一个配置类 ApolloConfig。用于获取刚刚发布的test.apollo配置信息。

@Configuration
@EnableApolloConfig
public class ApolloConfig {

    @Value("${test.apollo}")
    private String apollo;

    public String getApollo() {
        return apollo;
    }

    public void setApollo(String apollo) {
        this.apollo = apollo;
    }
}

好用的微服务配置中心 微服务配置中心原理_好用的微服务配置中心_05


在controller中提供一个地址,用于获取apollo的值。

好用的微服务配置中心 微服务配置中心原理_Cloud_06


在地址栏输入http://localhost:8081/dubbo/apollo就能看到页面上返回了 success。在Apollo Portal界面中修改test.apollo的值为 fail后,点击发布。再次访问http://localhost:8081/dubbo/apollo,看到界面上返回的就是fail了。

好用的微服务配置中心 微服务配置中心原理_好用的微服务配置中心_07


到此Apollo就已经集成完毕,这只是比较简单的用法,还有其他使用方法可以参照官网进行使用。https://github.com/ctripcorp/apollo/wiki/Java客户端使用指南

4、Apollo原理

在整合Apollo过程中我们部署了Config Service、Admin Service和Apollo Portal。最后在我们的项目里引入了一个Apollo的jar包,这个称之为Apollo Client。下图为Apollo的架构图:

好用的微服务配置中心 微服务配置中心原理_客户端_08


上图中是这四个服务之间的调用关系。

Apollo Client:也就是我们自己的服务,在给我们应用集成Apollo 的时候,我们的应用dubboclient引入了apollo-clien的jar包,那么dubboclient就可以理解为是Apollo Client这个角色。Apollo Client主要功能就是去Config Service获取配置,把dubboclient里的配置更新到最新的。

Apollo Portal:就是配置管理界面,在这里我们可以对配置进行增删改查,对配置进行增删改查的功能都是Admin Service提供的,所以操作界面的时候,Apollo Portal都会去调用Admin Service提供的相关接口。

Config Service:服务于Apollo Client,提供配置获取接口,提供配置推送接口。

Admin Service:服务于Apollo Portal,提供配置管理接口,提供配置修改发布接口。当Apollo Portal调用了Admin Service对配置进行修改了后,Admin Service需要同步给Config Service,这样Apollo Client去Config Service拿配置的时候才能够拿到最新的。

其实除了上面的四个模块外,还存在Eureka和Meta Server两个模块,只是这两个模块是和Config Service一块部署的,在同一个JVM进程中。引入Eureka和Meta Server两个模块后,整个架构图就变成了这样的:

好用的微服务配置中心 微服务配置中心原理_好用的微服务配置中心_09


Eureka主要是提供一个服务注册发现的功能。

Eureka原生仅支持Java客户端,但是携程有很多遗留的.Net应用。所以引入了Meta Server这个模块,它其实是一个Eureka的Proxy,将Eureka的服务发现接口以更简单明确的HTTP接口的形式暴露出来,方便Client/Protal通过简单的HTTPClient就可以查询到Config/AdminService的地址列表。

变成上面的架构之后,Config Service,Admin Service启动的时候都会到Eureka上面进行服务注册。
Apollo Client和Apollo Portal去调用Config Service和Admin Service的时候,是先去调用Meta Server获取到Config Service和Admin Service的地址列表,然后在选择一个地址进行调用。