简介:java系列技术分享(持续更新中…)
初衷:一起学习、一起进步、坚持不懈
如果文章内容有误与您的想法不一致,欢迎大家在评论区指正
希望这篇文章对你有所帮助,欢迎点赞 收藏 ⭐留言更多文章请点击
官方文档
:https://github.com/apolloconfig/apollo
Apollo(阿波罗)2016年5月 是 携程开源的配置管理中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。
目前市面上用的比较多的配置中心有:
Disconf
Spring Cloud Config
Apollo
Nacos
配置中心核心概念的对比
由于Disconf不再维护,下面对比一下Spring Cloud Config、Apollo和Nacos。
Nacos | Nacos | Spring Cloud Config | |
---|---|---|---|
灰度发布 | 不支持 | 支持IP级别的灰度发布 | 第三方框架支持 |
权限管理 | 不支持 | 基本完善 | 第三方平台支持 |
版本管理&回滚 | 支持 | 之前回滚上一个版本,properties提供跨版本的回滚 | 第三方平台支持 |
配置实时推送(动态刷新) | 支持,但是敏感加密后的动态刷新出现无法解密 | 基本完善 | 第三方框架支持 |
敏感加密 | 引入Jasypt | 引入Jasypt | 原生支持 |
多环境 | 支持 | 支持 | 支持 |
高可用 | 支持 | 支持 | 支持 |
社区支持 | 一般 | 活跃 | 一般 |
Spring Cloud Config
作为官方提供的配置中心,适合学习和刚开始使用分布式框架的项目使用
Nacos
作为阿里2018年开源的产品,有阿里背书,且服务发现和配置集与一体。但是从目前的发展来看,阿里开发重心在于服务发现端,配置中心相关功能开发相对滞后,适合中小型企业使用
Apollo
是携程2016年开源的配置中心,经历了5年的迭代,现在已经是一个很完善的产品,能满足大型互联网的大多数需要
总的来看,Apollo和Nacos相对于Spring Cloud Config的生态支持更广,在配置管理流程上做的更好。Apollo相对于Nacos在配置管理做的更加全面,Nacos则使用起来相对比较简洁,在对性能要求比较高的大规模场景更适合。
但对于一个开源项目的选型,项目上的人力投入(迭代进度、文档的完整性)、社区的活跃度(issue的数量和解决速度、Contributor数量、社群的交流频次等),这些因素也比较关键,考虑到Nacos开源时间不长和社区活跃度,所以从目前来看Apollo应该是最合适的配置中心选型。
在Apollo配置中心修改配置
应用程序通过Apollo客户端从配置中心拉取配置信息
用户通过Apollo配置中心修改或发布配置后,会有两种机制来保证应用程序来获取最新配置:
apollo目录
下Apollo服务端共需要两个数据库: ApolloPortalDB
和 ApolloConfigDB
确保端口未被占用
Apollo默认会启动3个服务,分别使用8070(apollo‐portal
), 8080(apollo-configservice
), 8090(apollo‐adminservice
)端口,请确保这3个端口当前没有被使用
windows环境下
在apollo目录中
创建runApollo.bat
文件,快速启动三个服务(修改数据库连接地址,数据库以及密码
)
echo
set url="localhost:3306"
set username="root"
set password="123456"
start "configService" java -Xms256m -Xmx256m -Dapollo_profile=github -Dspring.datasource.url=jdbc:mysql://%url%/ApolloConfigDB?characterEncoding=utf8 -Dspring.datasource.username=%username% -Dspring.datasource.password=%password% -Dlogging.file=.\logs\apollo-configservice.log -jar .\apollo-configservice-1.3.0.jar
start "adminService" java -Xms256m -Xmx256m -Dapollo_profile=github -Dspring.datasource.url=jdbc:mysql://%url%/ApolloConfigDB?characterEncoding=utf8 -Dspring.datasource.username=%username% -Dspring.datasource.password=%password% -Dlogging.file=.\logs\apollo-adminservice.log -jar .\apollo-adminservice-1.3.0.jar
start "ApolloPortal" java -Xms256m -Xmx256m -Dapollo_profile=github,auth -Ddev_meta=http://localhost:8080/ -Dserver.port=8070 -Dspring.datasource.url=jdbc:mysql://%url%/ApolloPortalDB?characterEncoding=utf8 -Dspring.datasource.username=%username% -Dspring.datasource.password=%password% -Dlogging.file=.\logs\apollo-portal.log -jar .\apollo-portal-1.3.0.jar
Linux环境下
在apollo目录中
创建runApollo.sh
文件,快速启动三个服务(修改数据库连接地址,数据库以及密码
)
#!/bin/sh
url="localhost:3306"
username="root"
password="123456"
java -Xms256m -Xmx256m -Dapollo_profile=github -Dspring.datasource.url=jdbc:mysql://${url}/ApolloConfigDB?characterEncoding=utf8 -Dspring.datasource.username=${username} -Dspring.datasource.password=${password} -Dlogging.file=./logs/apollo-configservice.log -Dserver.port=8080 -jar apollo-configservice-1.3.0.jar &
java -Xms256m -Xmx256m -Dapollo_profile=github -Dspring.datasource.url=jdbc:mysql://${url}/ApolloConfigDB?characterEncoding=utf8 -Dspring.datasource.username=${username} -Dspring.datasource.password=${password} -Dlogging.file=./logs/apollo-adminservice.log -Dserver.port=8090 -jar apollo-adminservice-1.3.0.jar &
java -Xms256m -Xmx256m -Dapollo_profile=github,auth -Ddev_meta=http://localhost:8080/ -Dserver.port=8070 -Dspring.datasource.url=jdbc:mysql://%url%/ApolloPortalDB?characterEncoding=utf8 -Dspring.datasource.username=%username% -Dspring.datasource.password=%password% -jar apollo-portal-1.3.0.jar &
启动成功后,访问管理页面
apollo/admin
<dependency>
<groupId>com.ctrip.framework.apollogroupId>
<artifactId>apollo-clientartifactId>
<version>1.1.0version>
dependency>
app:
id: apollo-config # app.id是必须配置的
apollo:
meta: http://localhost:8080 # Apollo Meta Server 地址(它的注册中心地址,eureka地址)
bootstrap:
enabled: true #是否开启 Apollo 配置预加载功能。默认为 false。
eagerLoad:
enable: true #是否开启 Apollo 支持日志级别的加载时机。默认为 false。
# 指定 namespace
namespaces: application #使用的 Apollo 的命名空间,默认为 application,多个用逗号隔开
@Component
@Data
public class Setting {
@Value("${setting.upload-addr}")
private String uploadAddr;
@Value("${setting.path}")
private String path;
}
@RestController
public class TestController {
@Autowired
private Setting setting;
@GetMapping("/setting")
public Map getSetting(){
Map map = new HashMap<>();
map.put("uploadAddr",setting.getUploadAddr());
map.put("path",setting.getPath());
System.err.println(map);
return map;
}
}
启动类添加@EnableApolloConfig
注解
@SpringBootApplication
@EnableApolloConfig
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}
读取、推送
等功能,服务对象是Apollo客户端修改、发布
等功能,服务对象是Apollo Portal(管理界面)Config Service
为应用提供配置获取、实时更新等功能
;Apollo Portal
管理端通过Admin Service提供配置新增、修改、发布等功能
application (应用)
environment (环境)
cluster (集群)
namespace (命名空间)
查询organizations
编辑后保存,退出重新登录,则发现部门添加成功
测试读取
public class GetConfigTest {
public static void main(String[] args) {
// Config config = ConfigService.getAppConfig(); // 读取默认的namespace的配置信息
Config config = ConfigService.getConfig("spring-test");//读取指定namespace下的配置信息
String someKey = "date";
String value = config.getProperty(someKey, null);
System.out.println("读取的配置信息为: " + value);
}
}
添加虚拟机参数
-Dapp.id=apollo-config -Denv=DEV -Ddev_meta=http://localhost:8080
读取成功