zoukankan      html  css  js  c++  java
  • Apollo的基本概念和集成实战

    基本概念

    使用场景

    是一个分布式的配置中心。适用于微服务;
    

    核心功能

    1. 集中管理不同环境,不同集群的配置;
    2. 配置修改后可以实时推送到应用端;
    3. 具备规范的权限,流程治理特性;

    开发技术

    • 服务端使用springboot,springcloud开发,打包后可以直接运行,无需安装额外的tomcat;
    • java客户端不依赖任何框架,对Spring,SpringBoot的客户端也有额外支持
    • .net客户端不依赖任何框架

    概念

    缩写 全称 说明
    FAT 功能测试环境
    UAT 集成测试环境
    PRO 生产环境
    DEV 开发环境

    详细功能

    1. 统一管理不同环境,不同集群,不同命名空间的配置;
    2. 同一份代码可以部署在不同的集群,可以有不同的配置,比如zk地址
    3. 通过命名空间可以方便的支持不同应用共享同一份配置,同时还允许应用对共享的配置进行覆盖;
    4. 配置修改实时生效 (用户在后台修改完配置发布后,客户端可以在1s内收到最新的配置并通知应用程序)
    5. 版本发布概念, (所有的配置发布都有版本概念,可以方便的支持配置的回滚)
    6. 灰度发布(配置发布后,支队部分应用实例生效,等观察一段时间后在推送给所有的应用)
    7. 权限管理,发布审核,操作审计
    8. 客户端配置信息监控(方便的看到配置被哪些实例使用)
    9. 支持多种语言,java和.net ,通过http接口使用也是支持的;
    10. 提供开放平台api给到其它系统修改和发布操作;
    11. 部署简单

    后台使用

    后台界面操作

    客户端接入文档

    后台操作

    1. 创建项目
    2. 分配管理员,(管理项目的权限分配,创建集群,创建namespace)
    3. 分配配置的修改和发布权限
    4. 添加配置项 ,修改配置项
    5. 发布配置,回滚配置;
    6. 读取配置是在应用端使用; 具体见客户端接入文档;

    公共组件的操作

    公共组件: 提供给应用使用的其它组织的客户端代码,比如cat的客户端;本质上也是应用的一部分;
    区别 : 通常情况下,公共组件的使用的配置由原始开发团队维护,但是实际的应用在运行时,环境不一样,所以我们也允许应用在实际使用的时候能够覆盖公共组件的部分配置;
    需要自己创建自己唯一的namespace ;

    公共组件的操作

    1. 创建项目
    2. 分配项目管理员权限
    3. 创建namespace
    4. 添加配置项,发布;
    5. 公共配置的读取
    6. 应用关联公共组件并覆盖公共组件的配置项

    集群独立配置

    1. 添加集群,默认集群;
    2. 多个appId使用同一份配置
    3. 同公共组件,关联namespace,写入公共配置,或者覆盖公共配置

    灰度发布
    操作

    1. 创建灰度
    2. 灰度配置
    3. 灰度规则的新增,修改
    4. 灰度发布
    5. 全量发布,放弃灰度
    6. 发布历史

    客户端接入

    要求:jdk1.7+ , guava15.0+

    客户端配置参数

    1. app.id (systemProperty > System Environment > springboot application.properties > META-INF/app.properties) 对应项目的id
    2. apollo.meta 访问地址 (SystemProperty > SpringBoot > SystemEnvironment>/opt/settings/server.properties > app.properties)
    3. 本地缓存路径 /opt/data/{appId}/config-cache/ key: apollo.cacheDir
    4. 环境配置 key : env
    5. 集群配置 key: apollo.cluster

    客户端依赖

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

    接入方式对比

    接入方式 特点
    api 灵活,功能完备
    spring placeholder方式
    springboot @ConfigurationProperties

    API接入

    获取application namespace配置

    Config config = ConfigService.getAppConfig(); 
    //config instance is singleton for each namespace and is never null
    String value = config.getProperty(someKey, someDefaultValue);
    

    获取公共namespace

    String somePublicNamespace = "CAT";
    Config config = ConfigService.getConfig(somePublicNamespace); 
    //config instance is singleton for each namespace and is never null
    String value = config.getProperty(someKey, someDefaultValue);
    

    获取非properties格式的namespace配置

    Config config = ConfigService.getConfig("application.yml");
    String value = config.getProperty(someKey, someDefaultValue);
    

    xml格式文件获取

    String someNamespace = "test";
    ConfigFile configFile = ConfigService.getConfigFile("test", ConfigFileFormat.XML);
    String content = configFile.getContent();
    

    事件监听

    Config config = ConfigService.getAppConfig(); 
    //config instance is singleton for each namespace and is never null
    config.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(String.format("Found change - key: %s, oldValue: %s, newValue: %s, changeType: %s", change.getPropertyName(), change.getOldValue(), change.getNewValue(), change.getChangeType()));
            }
        }
    });
    

    spring方式接入

    基于xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:apollo="http://www.ctrip.com/schema/apollo"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.ctrip.com/schema/apollo http://www.ctrip.com/schema/apollo.xsd">
        <apollo:config order="2"/>
        <!-- 这个是最复杂的配置形式,指示Apollo注入FX.apollo和application.yml namespace的配置到Spring环境中,并且顺序在application前面 -->
        <apollo:config namespaces="FX.apollo,application.yml" order="1"/>
        <bean class="com.ctrip.framework.apollo.spring.TestXmlBean">
            <property name="timeout" value="${timeout:100}"/>
    

    基于javaconfig

    //这个是最复杂的配置形式,指示Apollo注入FX.apollo和application.yml namespace的配置到Spring环境中,并且顺序在application前面
    @Configuration
    @EnableApolloConfig(order = 2)
    public class SomeAppConfig {
      @Bean
      public TestJavaConfigBean javaConfigBean() {
        return new TestJavaConfigBean();
      }
    }
    @Configuration
    @EnableApolloConfig(value = {"FX.apollo", "application.yml"}, order = 1)
    public class AnotherAppConfig {}
    

    springboot方式接入

    直接配置属性

    #加载应用对应的application namespace的配置
     apollo.bootstrap.enabled = true
     #加载其它namespace 的配置
     apollo.bootstrap.namespaces = application,FX.apollo,application.yml
     #在日志系统启动之前加载阿波罗
     apollo.bootstrap.eagerLoad.enabled=true
    

    其它说明

    一些公共的注解

    新增的spring注解

    • @ApolloConfig
      用来自动注入Config对象
    • @ApolloConfigChangeListener
      用来自动注册ConfigChangeListener
    • @ApolloJsonValue
      用来把配置的json字符串自动注入为对象

    配置的迁移

    配置的迁移

    1. apollo中创建对应的项目;
    2. 在应用中创建好META-INF/app.properties,并配置好;
    3. 原来的配置文件,转换为properties,贴到apollo后台;
    4. 删除本地的配置;

    本地开发

    1. 修改 /opt/settins/server.properties
      设置env = Local
    2. 准备本地配置文件 位置:
      Mac/Linux: /opt/data/{appId}/config-cache
      Windows: C:optdata{appId}config-cache
    3. 修改本地配置不会检测到实时变化,需要重启应用;

    现有项目改造步骤

    1. 去掉disconf的依赖,找到对应的xml,去掉申明的配置bean;
    2. 搜索对应的@Disf,如果在类上,直接去掉,如果在方法或者字段上,替换为@Value注解;
    3. 增加apollo的xml配置;
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
           xmlns:apollo="http://www.ctrip.com/schema/apollo"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
    						http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
                            http://www.springframework.org/schema/context
                            http://www.springframework.org/schema/context/spring-context-4.0.xsd
                            http://code.alibabatech.com/schema/dubbo
                            http://files.sports.lifesense.com/xsd/dubbo.xsd
                            http://www.ctrip.com/schema/apollo
                            http://www.ctrip.com/schema/apollo.xsd">
    
        <apollo:config order="1"/>
        <apollo:config order="2" namespaces="lx-doctor.redis,lx-doctor.global,lx-doctor.filesystem,lx-doctor.kafka,lx-doctor.dubbo,log4j2.xml"/>
    
    1. 因为之前的依赖类路径下存在mysql.properties ; 而apollo没有生成那么多的文件;
    2. 在apollo后台,从disconf后台中把项目都有的配置放到application.properties下;
    3. 新建私有命名空间 log4j2.xml,把日志配置copy,放到里面发布;
    4. 如有跟公共配置相同的key,需要重写的,则关联公共命名空间重写;
    5. 启动程序,解决编译错误;
  • 相关阅读:
    js模态框实现原理
    静态库、动态库------深入理解计算机系统
    链接器如何解析多重定义的全局符号(强弱符号)------深入理解计算机系统
    linux------深入理解linux内核
    libcurl坑
    《将博客搬至CSDN》
    openssl 编译
    vs2015+opencv3.3.1+ c++实现 静态背景下多运动目标提取,检测
    QT 相关书籍
    qml 知识积累
  • 原文地址:https://www.cnblogs.com/snidget/p/11363929.html
Copyright © 2011-2022 走看看