zoukankan      html  css  js  c++  java
  • Spring Boot 整合 Apollo

    简介

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

    Apollo和Spring Cloud Config对比

    通过对比,可以看出,生成环境中 Apollo 相比 Spring Cloud Config 更具有优势一些。

    安装 Apollo 配置中心

    搭建教程

    参照 https://github.com/ctripcorp/apollo/wiki/Quick-Start 搭建 Apollo 配置中心,文档写的很清楚,这里就赘述了。

    查看样例配置

    搭建完成并启动后,访问 http://localhost:8070 ,界面如下。

    输入用户名 apollo,密码 admin 后登录后,点击SampleApp进入配置界面。

    与 Spring Boot 整合使用

    创建一个springboot项目,主要代码如下。

    pom.xml

    添加 Apollo 客户端的依赖,为了编码方便引入commons-lang3。

    1. <dependency>
    2. <groupId>com.ctrip.framework.apollo</groupId>
    3. <artifactId>apollo-client</artifactId>
    4. <version>1.3.0</version>
    5. </dependency>
    6. <!-- 为了编码方便,并非apollo 必须的依赖 -->
    7. <dependency>
    8. <groupId>org.apache.commons</groupId>
    9. <artifactId>commons-lang3</artifactId>
    10. <version>3.8.1</version>
    11. </dependency>
    12.  

    application.yml

    1. server:
    2. port: 8761
    3. app:
    4. id: springboot-apollo
    5. apollo:
    6. meta: http://127.0.0.1:8080
    7. bootstrap:
    8. enabled: true
    9. eagerLoad:
    10. enabled: true
    11. logging:
    12. level:
    13. com:
    14. gf:
    15. controller: debug
    16.  

    配置说明:

    • app.id :AppId是应用的身份信息,是配置中心获取配置的一个重要信息。
    • apollo.bootstrap.enabled :在应用启动阶段,向Spring容器注入被托管的application.properties文件的配置信息。
    • apollo.bootstrap.eagerLoad.enabled :将Apollo配置加载提到初始化日志系统之前。
    • logging.level.com.gf.controller :调整 controller 包的 log 级别,为了后面演示在配置中心动态配置日志级别。

    HelloController

    1. @RestController
    2. public class HelloController {
    3. private static Logger logger = LoggerFactory.getLogger( HelloController.class );
    4. @Value( "${server.port}" )
    5. String port;
    6. @GetMapping("hi")
    7. public String hi(String name) {
    8. logger.debug( "debug log..." );
    9. logger.info( "info log..." );
    10. logger.warn( "warn log..." );
    11. return "hi " + name + " ,i am from port:" + port;
    12. }
    13. }
    14.  

    启动类

    1. @SpringBootApplication
    2. @EnableApolloConfig
    3. public class SpringbootApolloApplication {
    4. public static void main(String[] args) {
    5. SpringApplication.run( SpringbootApolloApplication.class, args );
    6. }
    7. }
    8.  

    启动项目。现在需要去配置中心做些关于这个springboot客户端的一些配置。

    配置中心的配置

    创建项目

    第一步:访问 http://localhost:8070 登录后,选择创建项目。

    第二步:填写配置信息。

    配置说明:

    • 部门 :选择应用所在的部门。(想自定义部门,参照官方文档,这里就选择样例)
    • 应用AppId :用来标识应用身份的唯一id,格式为string,需要和客户端。application.properties中配置的app.id对应。
    • 应用名称 :应用名,仅用于界面展示。
    • 应用负责人 :选择的人默认会成为该项目的管理员,具备项目权限管理、集群创建、Namespace创建等权限。

    提交配置后会出现如下项目配置的管理页面。

    添加配置项

    第一步:点击 “新增配置”,配置需要管理的 application.properties 中的属性。

    点击提交,之后按照同样的方法,新增需要动态管理的 application.properties 中的属性。

    提交后,跳转到配置的管理界面:

    发布配置

    配置只有在发布后才会真的被应用使用到,所以在编辑完配置后,需要发布配置。点击“发布按钮”。

    填写发布相关信息,点击发布 。

    测试

    在配置中心,修改 server.port 的值为 8762 并发布。

    Postman 访问之前写个测试接口 http://127.0.0.1:8761/hi?name=zhangsan ,返回如下。

    说明 客户端 获取到了 配置中心修改后的 server.port 的值 。

    注意:

    • 服务的端口依然还是 8761,这是因为 apollo 修改配置,不会像Spring Cloud Config 那样去重启应用。
    • 重启应用后,客户端会加载使用 配置中心中配置的属性的值,例如我们重启我们的应用,服务端口会变成8762。

    监听配置的变化

    需求

    日志模块是每个项目中必须的,用来记录程序运行中的相关信息。一般在开发环境下使用DEBUG级别的日志输出,为了方便查看问题,而在线上一般都使用INFO或者ERROR级别的日志,主要记录业务操作或者错误的日志。那么问题来了,当线上环境出现问题希望输出DEBUG日志信息辅助排查的时候怎么办呢?修改配置文件,重新打包然后上传重启线上环境,以前确实是这么做的。

    虽然上面我们已经把日志的配置部署到Apollo配置中心,但在配置中心修改日志等级,依然需要重启应用才生效,下面我们就通过监听配置的变化,来达到热更新的效果。

    1. @Configuration
    2. public class LoggerConfig {
    3. private static final Logger logger = LoggerFactory.getLogger(LoggerConfig.class);
    4. private static final String LOGGER_TAG = "logging.level.";
    5. @Autowired
    6. private LoggingSystem loggingSystem;
    7. @ApolloConfig
    8. private Config config;
    9. @ApolloConfigChangeListener
    10. private void configChangeListter(ConfigChangeEvent changeEvent) {
    11. refreshLoggingLevels();
    12. }
    13. @PostConstruct
    14. private void refreshLoggingLevels() {
    15. Set<String> keyNames = config.getPropertyNames();
    16. for (String key : keyNames) {
    17. if (StringUtils.containsIgnoreCase(key, LOGGER_TAG)) {
    18. String strLevel = config.getProperty(key, "info");
    19. LogLevel level = LogLevel.valueOf(strLevel.toUpperCase());
    20. loggingSystem.setLogLevel(key.replace(LOGGER_TAG, ""), level);
    21. logger.info("{}:{}", key, strLevel);
    22. }
    23. }
    24. }
    25. }
    26.  

    关键点讲解:

    • @ApolloConfig 注解 :将Apollo服务端的中的配置注入这个类中。
    • @ApolloConfigChangeListener 注解 :监听配置中心配置的更新事件,若该事件发生,则调用refreshLoggingLevels方法,处理该事件。
    • ConfigChangeEvent参数 :可以获取被修改配置项的key集合,以及被修改配置项的新值、旧值和修改类型等信息。

    application.yml 中配置的日志级别是 debug ,访问 http://127.0.0.1:8761/hi?name=zhangsan ,控制台打印如下。

    1. 2019-03-05 18:29:22.673 DEBUG 4264 --- [nio-8762-exec-1] com.gf.controller.HelloController : debug log...
    2. 2019-03-05 18:29:22.673 INFO 4264 --- [nio-8762-exec-1] com.gf.controller.HelloController : info log...
    3. 2019-03-05 18:29:22.673 WARN 4264 --- [nio-8762-exec-1] com.gf.controller.HelloController : warn log...
    4.  

    现在在配置中心修改日志级别为 warn。

    再次访问 http://127.0.0.1:8761/hi?name=zhangsan ,控制台打印如下。

    1. 2019-03-05 19:07:19.469 WARN 4264 --- [nio-8762-exec-3] com.gf.controller.HelloController : warn log...
    2.  

    说明日志级别的配置,已经支持热更新了。关于apollo 的更多应用 ,可以参照github的文档。

    源码

    https://github.com/gf-huanchupk/SpringBootLearning/tree/master/springboot-apollo

  • 相关阅读:
    SDRAM(3):刷新和仲裁
    SDRAM(2):初始化
    SDRAM(1):基本介绍
    计数器(3):避免多计少计
    协议——SPI
    matlab数字图像处理 入门基础
    gVim编辑器——基本设置、常用命令、代码片段
    Pomelo的Router
    Pomelo聊天室框架
    Pomelo术语解释
  • 原文地址:https://www.cnblogs.com/kebibuluan/p/11510353.html
Copyright © 2011-2022 走看看