apollo配置中心的详解

  • Post author:
  • Post category:其他




1. apollo概念


springCloud Config区别



在这里插入图片描述


NameSpace

:Apollo在创建项目的时候,都会默认创建一个“application”的Namespace。顾名思义,“application”是给应用自身使用的,Spring Boot项目都有一个默认配置文件application.yml。在这里application.yml就等同于“application”的Namespace。


流转过程



在这里插入图片描述

配置文件有多种格式,例如:properties、xml、yml、yaml、json等。同样Namespace也具有这些格式。在Portal UI中可以看到“application”的Namespace上有一个“properties”标签,表明“application”是properties格式的



2. 配置server服务端

前提:下载Quick Start安装包,

git地址


1.

创建ApolloPortalDB 与 ApolloConfigDB数据库 验证数据库

select

Id

,

AppId

,

Name

from ApolloPortalDB.App;

在这里插入图片描述

select

NamespaceId

,

Key

,

Value

,

Comment

from ApolloConfigDB.Item;

在这里插入图片描述


2.

修改项目中

demo.sh

文件,配置自己的mysql地址


3.

端口检查 Quick Start脚本会在本地启动3个服务,分别使用8070, 8080, 8090端口,请确保这3个端口当前没有被使用,8080 是eurek注册中心,8070是项目启动后的后台管理页面地址


4.

windows 下git可视化页面到项目路径下执行命令

./demo.sh start

访问 http://localhost:8070即可,用户名apollo,密码admin

在这里插入图片描述



3. 配置属性

  1. 默认application 配置值

    在这里插入图片描述
  2. 创建不同的NameSpace

    在这里插入图片描述



4. 配置client客户端

流程图:

在这里插入图片描述

准备:引入依赖(1.3版本后才支持)

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


1. API方式获取



1.1

启动项目,访问localhost:8080/apollo/api 即可使用api 获取到apollo配置上的信息; 首先获取到NameSpace,在根据key获取到apollo 上key所对应的value。

 /**
         * 获取默认的apollo namespace
         */
        Config config1 = ConfigService.getAppConfig(); //config instance is singleton for each namespace and is never null
        String someKey1 = "name";
        String someDefaultValue1 = "name";
        String value1 = config1.getProperty(someKey1, someDefaultValue1);
        System.out.println("api获取到默认的apollo的值: "+value1);


        /**
         *获取公共的apollo namespace的值
         */
        String somePublicNamespace = "pwade1";
        Config config2 = ConfigService.getConfig(somePublicNamespace); //config instance is singleton for each namespace and is never null
        String someKey2 = "name1";
        String someDefaultValue2 = "name1";
        String value2 = config2.getProperty(someKey2, someDefaultValue2);
        System.out.println("api获取到公共的apollo的值: "+value2);

        /**
         * 获取yml格式的apollo namespace值
         */
        Config config3 = ConfigService.getConfig("pwade.yml");
        String someKey3 = "server.port";
        String someDefaultValue3 = "none";
        String value3 = config3.getProperty(someKey3, someDefaultValue3);
        System.out.println("api获取yml属性的apollo的值: "+value3);

        /**
         * 获取非 yml格式的apollo namespace值
         */
        String someNamespace = "test";
        ConfigFile configFile = ConfigService.getConfigFile("test", ConfigFileFormat.XML);
        String content = configFile.getContent();


        /**
         * 监听事件,监听apollo配置修改 修改不同的config(1、2、3)实现监听不同的事件
         *
         */
       config3.addChangeListener(new ConfigChangeListener() {
            @Override
            public void onChange(ConfigChangeEvent changeEvent) {
                System.out.println("Changes for namespace " + changeEvent.getNamespace());
                for (String key : changeEvent.changedKeys()) {
                    ConfigChange change = changeEvent.getChange(key);
                    System.out.println("***************api apollo配置监听默认事件触发***************");
                    System.out.println(String.format("apollo配置 change - key: %s, oldValue: %s, newValue: %s, changeType: %s", change.getPropertyName(), change.getOldValue(), change.getNewValue(), change.getChangeType()));

                }
            }
        });

    }


2. Spring Boot方式



2.1

启动项目,访问localhost:8080/apollo/boot 即可配置spring boot项目获取到apollo配置上的信息,使用

application.yml

server:
  port: 8761
#配置apollo属性w
app:
  id: pwade
apollo:
  meta: http://127.0.0.1:8080  #apollo地址
  bootstrap:
    namespaces: application,pwade1,pwade.yml
    enabled: true
    eagerLoad:
      enabled: true
logging:
  level:
    com:
      gf:
        controller: debug
@RestController
@RequestMapping("/apollo")
public class BootApolloController {
   @Value("${name}")
    private String name;

    @Value("${name1}")
    private String name1;

    @Value("${server.port:6666}")
    private String adress;

    @RequestMapping("/boot")
    public void apolloInfo(){
        System.out.println("spring boot获取到apollo的值默认: "+name+" 公共: "+name1+"yml私有: "+adress);

    }
}


3. 注解方式


3.1

启动项目,访问localhost:8080/apollo/annota 即可通过apollo注解方式获取到apollo配置上的信息

@RequestMapping("/apollo")
@RestController
public class ApolloAnnotationController {
    @ApolloConfig
    private Config config; //inject config for namespace application

    @ApolloConfig("pwade1")
    private Config anotherConfig; //inject config for namespace application

    @ApolloConfig("pwade.yml")
    private Config ymlConfig; //inject config for namespace application.yml



    @RequestMapping("/annota")
    public void apolloInfo(){
        System.out.println("注解获取到apollo的值默认: "+geteDfaultDNameSpace()+" 公共: "+getePublicNameSpace()+"yml私有:"+getYmlNameSpace());

    }

    @ApolloConfigChangeListener("application")
    private void someOnChange(ConfigChangeEvent changeEvent) {
        //update injected value of batch if it is changed in Apollo
        if (changeEvent.isChanged("name")) {
            String name = config.getProperty("name","name");
            System.out.println("注解pollo监测到默认信息已经修改"+name);
        }
    }

    @ApolloConfigChangeListener("pwade1")
    private void someOnPublicChange(ConfigChangeEvent changeEvent) {
        //update injected value of batch if it is changed in Apollo
        if (changeEvent.isChanged("name1")) {
            String name1 = anotherConfig.getProperty("name1","name1");
            System.out.println("注解pollo监测到公共信息已经修改"+name1);
        }
    }

    @ApolloConfigChangeListener("pwade.yml")
    private void someOnYmlChange(ConfigChangeEvent changeEvent) {
        //update injected value of batch if it is changed in Apollo
        if (changeEvent.isChanged("server.port")) {
            String name3 = ymlConfig.getProperty("server.port","server.port");
            System.out.println("注解pollo监测到公共信息已经修改"+name3);
        }
    }

    /**
     * 根据config来获取值
     * @return
     */
    public String geteDfaultDNameSpace () {
        return  config.getProperty("name", "none");
    }

    public String getePublicNameSpace () {
        return  anotherConfig.getProperty("name1", "none");
    }


    public String getYmlNameSpace() {
        return  ymlConfig.getProperty("server.port", "none");
    }


4. 配置变化事件(change)

@Configuration
public class LoggerConfig {
    private static final Logger logger = LoggerFactory.getLogger(LoggerConfig.class);


    @ApolloConfig
    private Config config;

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

    @PostConstruct
    private void refreshLoggingLevels() {
        Set<String> keyNames = config.getPropertyNames();
        for (String key : keyNames) {
                String strLevel = config.getProperty(key, "info");
            System.out.println("***************springboot apollo配置监听事件触发***************");
            logger.info("{}:{}", key, strLevel);
            System.out.println("***************springboot apollo配置监听事件结束***************");

        }
    }

结语:

在拉取配置中心数据时,获取不到yml 格式NameSpace的数据,最终版本由原来的1.0改成1.3的才可以,代码地址:

apollo项目地址



版权声明:本文为pengjwhx原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。