Apollo配置中心入门

Apollo(协程阿波罗):

https://github.com/ctripcorp/apollo

https://gitee.com/nobodyiam/apollo

简介

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

Apollo和Spring Cloud Config对比

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

演示环境

Apollo Docker部署

文档:https://github.com/ctripcorp/apollo/wiki/Apollo-Quick-Start-Docker%E9%83%A8%E7%BD%B2

下载Docker Quick Start配置文件

确保docker-quick-start文件夹已经在本地存在,如果本地已经clone过Apollo的代码,则可以跳过此步骤。

启动Apollo配置中心

在docker-quick-start目录下执行docker-compose up,第一次执行会触发下载镜像等操作,需要耐心等待一些时间。

搜索所有apollo-quick-start开头的日志,看到以下日志说明启动成功:

apollo-quick-start    | ==== starting service ====
apollo-quick-start    | Service logging file is ./service/apollo-service.log
apollo-quick-start    | Started [45]
apollo-quick-start    | Waiting for config service startup.......
apollo-quick-start    | Config service started. You may visit http://localhost:8080 for service status now!
apollo-quick-start    | Waiting for admin service startup......
apollo-quick-start    | Admin service started
apollo-quick-start    | ==== starting portal ====
apollo-quick-start    | Portal logging file is ./portal/apollo-portal.log
apollo-quick-start    | Started [254]
apollo-quick-start    | Waiting for portal startup.......
apollo-quick-start    | Portal started. You can visit http://localhost:8070 now!

注1:数据库的端口映射为13306,所以如果希望在宿主机上访问数据库,可以通过localhost:13306,用户名是root,密码留空。

注2:如要查看更多服务的日志,可以通过docker exec -it apollo-quick-start bash登录, 然后到/apollo-quick-start/service/apollo-quick-start/portal下查看日志信息。

使用Apollo配置中心

使用相关步骤可以参考Quick Start - 四、使用Apollo配置中心

使用样例项目

打开http://localhost:8070
Quick Start集成了Spring Security简单认证,更多信息可以参考Portal 实现用户登录功能

登录

输入用户名apollo,密码admin后登录

点击SampleApp进入配置界面,可以看到当前有一个配置timeout=100 配置界面
如果提示系统出错,请重试或联系系统负责人,请稍后几秒钟重试一下,因为通过Eureka注册的服务有一个刷新的延时。

运行客户端程序

docker exec -i apollo-quick-start /apollo-quick-start/demo.sh client

我们准备了一个简单的Demo客户端来演示从Apollo配置中心获取配置。

程序很简单,就是用户输入一个key的名字,程序会输出这个key对应的值。

如果没找到这个key,则输出undefined。

输入timeout,会看到如下信息:

> timeout
> [SimpleApolloConfigDemo] Loading key : timeout with value: 100

SpringBoot 整合 apollo

文章首发于微信公众号《程序员果果》
地址:https://www.jianshu.com/p/3c21c18afdc1

安装 Apollo 配置中心

搭建教程

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

查看样例配置

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

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

与 Spring Boot 整合使用

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

pom.xml

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

<dependency>
    <groupId>com.ctrip.framework.apollo</groupId>
    <artifactId>apollo-client</artifactId>
    <version>1.3.0</version>
</dependency>
<!-- 为了编码方便,并非apollo 必须的依赖 -->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.8.1</version>
</dependency>

application.yml

server:
  port: 8761

app:
  id: springboot-apollo
apollo:
  meta: http://127.0.0.1:8080
  bootstrap:
    enabled: true
    eagerLoad:
      enabled: true

logging:
  level:
    com:
      gf:
        controller: debug

 

配置说明:

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

HelloController

@RestController
public class HelloController {

    private static Logger logger = LoggerFactory.getLogger( HelloController.class );

    @Value( "${server.port}" )
    String port;

    @GetMapping("hi")
    public String hi(String name) {

        logger.debug( "debug log..." );
        logger.info( "info log..." );
        logger.warn( "warn log..." );

        return "hi " + name + " ,i am from port:" + port;
    }

}

启动类

@SpringBootApplication
@EnableApolloConfig
public class SpringbootApolloApplication {

    public static void main(String[] args) {
        SpringApplication.run( SpringbootApolloApplication.class, args );
    }


}

启动项目。现在需要去配置中心做些关于这个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配置中心,但在配置中心修改日志等级,依然需要重启应用才生效,下面我们就通过监听配置的变化,来达到热更新的效果。

@Configuration
public class LoggerConfig {

    private static final Logger logger = LoggerFactory.getLogger(LoggerConfig.class);
    private static final String LOGGER_TAG = "logging.level.";

    @Autowired
    private LoggingSystem loggingSystem;

    @ApolloConfig
    private Config config;

    @ApolloConfigChangeListener
    private void configChangeListter(ConfigChangeEvent changeEvent) {
        refreshLoggingLevels();
    }

    @PostConstruct
    private void refreshLoggingLevels() {
        Set<String> keyNames = config.getPropertyNames();
        for (String key : keyNames) {
            if (StringUtils.containsIgnoreCase(key, LOGGER_TAG)) {
                String strLevel = config.getProperty(key, "info");
                LogLevel level = LogLevel.valueOf(strLevel.toUpperCase());
                loggingSystem.setLogLevel(key.replace(LOGGER_TAG, ""), level);
                logger.info("{}:{}", key, strLevel);
            }
        }
    }


}

关键点讲解:

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

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

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

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

 

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

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

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

源码下载 : https://github.com/gf-huanchupk/SpringBootLearning/tree/master/springboot-apollo

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
posted @ 2019-12-06 09:19  逐梦客!  阅读(371)  评论(0)    收藏  举报