APP下载

Spring Boot 2.0 整合携程Apollo配置中心

消息来源:baojiabao.com 作者: 发布时间:2024-05-05

报价宝综合消息Spring Boot 2.0 整合携程Apollo配置中心

作者:AaronSimon

来源:https://blog.csdn.net/AaronSimon/article/details/83657612

Apollo(阿波罗)是携程框架部门研发的分散式配置中心,能够集中化管理应用不同环境、不同丛集的配置,配置修改后能够实时推送到应用端,并且具备规范的许可权、流程治理等特性,适用于微服务配置管理场景。

服务端基于Spring Boot和Spring Cloud开发,打包后可以直接执行,不需要额外安装Tomcat等应用容器。

Java客户端不依赖任何框架,能够运行于所有Java执行时环境,同时对Spring/Spring Boot环境也有较好的支援。

.Net客户端不依赖任何框架,能够运行于所有.Net执行时环境。

如果想要深入了解,可以到github上参见Apollo配置中心,官网的介绍很详细。本章主要讲述Spring Boot 2.0 整合Apollo配置中心。

一、Apollo配置中心服务端(来源于官网)

本文的重点在于Apollo在客户端的使用,所以Apollo服务端使用的是官网提供的 Quick Start(针对本地测试使用),后续文章会专门讲述Apollo服务端在分散式环境下的部署。

1.1 准备工作

JavaApollo服务端要求Java 1.8+,客户端要求Java 1.7+,笔者本地使用的是Java 1.8。MySQLApollo的表结构对timestamp使用了多个default宣告,所以需要5.6.5以上版本。笔者本地使用的是8.0.13版本下载 Quick Start官网为我们准备了 Quick Start 安装包。大家只需要下载到本地,就可以直接使用,免去了编译、打包过程。大家可以到github下载,也可以通过百度云盘下载

1.2 安装步骤

1.2.1 建立数据库

Apollo服务端共需要两个数据库:ApolloPortalDB和ApolloConfigDB,官网把数据库、表的建立和样例资料都分别准备了sql档案(在下载的 Quick Start 安装包的sql目录下),只需要汇入数据库即可。

1.2.1.1 建立ApolloPortalDB

通过各种Mysql客户端(Navicat,DataGrip等)汇入sql/apolloportaldb.sql即可

下面以MySQL原生客户端为例:

source /your_local_path/sql/apolloportaldb.sql

汇入成功后,可以通过执行以下sql语句来验证:

select `Id`, `AppId`, `Name` from ApolloPortalDB.App;

1.2.1.2 建立ApolloConfigDB

通过各种Mysql客户端(Navicat,DataGrip等)汇入sql/apolloconfigdb.sql即可

下面以MySQL原生客户端为例:

source /your_local_path/sql/apolloconfigdb.sql

汇入成功后,可以通过执行以下sql语句来验证:

select `NamespaceId`, `Key`, `Value`, `Comment` from ApolloConfigDB.Item;

1.2.2 配置数据库连线资讯

Apollo服务端需要知道如何连线到你前面建立的数据库,所以需要编辑demo.sh,修改ApolloPortalDB和ApolloConfigDB相关的数据库连线串资讯。

1.3 启动Apollo配置中心

1.3.1 确保埠未被占用

Quick Start指令码会在本地启动3个服务,分别使用8070, 8080, 8090埠,请确保这3个埠当前没有被使用。例如,在Linux/Mac下,可以通过如下命令检查:

lsof -i:8080

在windows下,可以通过如下命令检查:

netstat -aon|findstr "8080"

1.3.2 执行启动指令码

在Quick Start目录下执行如下命令:

./demo.sh start

当看到如下输出后,就说明启动成功了!

1.3.3 异常排查

如果启动遇到了异常,可以分别检视service和portal目录下的log档案排查问题。

注: 在启动apollo-configservice的过程中会在日志中输出eureka注册失败的资讯,如com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused。需要注意的是,这个是预期的情况,因为apollo-configservice需要向Meta Server(它自己)注册服务,但是因为在启动过程中,自己还没起来,所以会报这个错。后面会进行重试的动作,所以等自己服务起来后就会注册正常了。

1.4 使用Apollo配置中心

1.4.1 检视样例配置

浏览器访问http://localhost:8070

Quick Start集成了Spring Security简单认证,更多资讯可以参考Portal 实现使用者登入功能输入使用者名称apollo,密码admin登入

配置中心中包含一个预设的专案SampleApp点选SampleApp进入配置界面,可以看到当前有一个配置timeout=100

如果提示系统出错,请重试或联络系统负责人,请稍后几秒钟重试一下,因为通过Eureka注册的服务有一个重新整理的延时。1.4.2 新增专案配置

我们的客户端使用apollo需要新增相关的专案配置。

点选新建专案

点选提交,建立完成

应用ID:这个ID是应用的唯一标识应用名称:应用的名称,会展示在配置中心的首页上

新增配置资讯点选新增配置,填写配置资讯

点选提交,此时配置还未生效。

释出配置点击发布,配置立刻生效

回滚如果配置做了修改之后,发现配置更改错误,这个时候可以使用回滚功能,回到上一个配置

二、Apollo配置中心客户端

我们客户端基于Spring Boot 2.0搭建,开发工具是InteIIij IDEA。新建一个专案,专案名称为apollo-client

2.1 客户端搭建

新增Apollo客户端依赖

com.ctrip.framework.apollo

apollo-client

1.1.1

新增配置资讯

# 应用ID(在Apollo服务端新增专案新增的应用ID)

app.id=testclient

# apollo-configservice地址

apollo.meta=http://127.0.0.1:8080开启Apollo客户端

在专案的启动类上新增@EnableApolloConfig注解新增一个测试界面

@RequestMapping("/index")

public String hello(){

return "hello man";

}

启动服务测试

在Apollo配置中心中,我们对该专案有一条配置server.port = 9000,启动服务,访问http://localhost:9000/index,返回hello man。证明,客户端是从服务端获取的配置。

2.2 客户端用法

在上一节,我们简单的搭建了客户端,成功的使用服务端配置。Apollo为我们提供的使用方式有很多种,下面只介绍Spring Boot 2.0环境下的使用方式。

2.2.1 Spring Placeholder的使用

Spring应用通常会使用Placeholder来注入配置,使用的格式形如${someKey:someDefaultValue},如${timeout:100}。冒号前面的是key,冒号后面的是预设值(建议在实际使用时尽量给出预设值,以免由于key没有定义导致执行时错误)。Apollo从v0.10.0开始的版本支援placeholder在执行时自动更新。如果需要关闭placeholder在执行时自动更新功能,可以通过以下两种方式关闭:

通过设定System Property apollo.autoUpdateInjectedSpringProperties,如启动时传入-Dapollo.autoUpdateInjectedSpringProperties=false通过设定META-INF/app.properties中的apollo.autoUpdateInjectedSpringProperties=false2.2.1.1 Java Config使用方式

新建配置类JavaConfigBean如下:

新增访问端点

测试浏览器访问http://127.0.0.1:8080/index1,正确返回配置的值2.2.1.2 ConfigurationProperties使用方式

Spring Boot提供了@ConfigurationProperties把配置注入到bean物件中。Apollo也支援这种方式,下面的例子会把redis.cache.expireSeconds和redis.cache.commandTimeout分别注入到SampleRedisConfig的expireSeconds和commandTimeout字段中。

新增配置类SampleRedisConfig如下:

新增访问端点

//2. ConfigurationProperties使用方式

@Autowired

SampleRedisConfig sampleRedisConfig;

@RequestMapping("/index2")

public String hello2(){

return sampleRedisConfig.getCommandTimeout()+"--"+sampleRedisConfig.getExpireSeconds();

}

测试浏览器访问http://127.0.0.1:8080/index2,正确返回配置的值注: @ConfigurationProperties如果需要在Apollo配置变化时自动更新注入的值,需要配合使用EnvironmentChangeEvent或RefreshScope。这个我会在后续文章中详细描述。

2.2.2 Spring Annotation支援

Apollo同时还增加了几个新的Annotation来简化在Spring环境中的使用。

@ApolloConfig用来自动注入Config物件@ApolloConfigChangeListener用来自动注册[email protected]用来把配置的json字串自动注入为物件2.2.2.1 @ApolloConfig的使用

新增访问端点

测试浏览器访问http://127.0.0.1:8080/index3,正确打印配置的值

redis.cache.commandTimeout=3000

redis.cache.expireSeconds=20

server.port=800

timeout=200

@ApolloConfigChangeListener的使用

新增以下程式码

@ApolloConfigChangeListener

private void someOnChange(ConfigChangeEvent changeEvent) {

//update injected value of batch if it is changed in Apollo

if (changeEvent.isChanged("timeout")) {

System.out.println(config.getIntProperty("timeout", 0));

}

}

测试在Apollo服务端修改timeout配置的值为300,释出后,控制台打印300

2.2.2.3 @ApolloJsonValue的使用

新增User如下:

服务端新增配置jsonBeanProperty=[ { "username": "john", "password": "1234" }, { "username": "simon", "password": "222132" } ]

客户端获取配置

//4. @ApolloJsonValue使用

@ApolloJsonValue("${jsonBeanProperty:[]}")

private List anotherJsonBeans;

@RequestMapping("/index4")

public void hello4(){

anotherJsonBeans.forEach(item -> {

System.err.println(item.getUsername()+"--"+item.getPassword());

});

}

测试浏览器访问http://127.0.0.1:8080/index4,正确打印配置的值

源代码下载

https://github.com/simondongji/SpringCloudProject/tree/master/apollo

2019-12-04 08:56:00

相关文章