基本概念

使用场景

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

核心功能

  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:\opt\data{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. 启动程序,解决编译错误;

Apollo的基本概念和集成实战的更多相关文章

  1. ASP.NET Core & Docker & Jenkins 零基础持续集成实战

    原文:ASP.NET Core & Docker & Jenkins 零基础持续集成实战 一.本系列教程说明 源代码管理工具:Gogs 持续集成工具:Jenkins 容器:Docker ...

  2. Docker + Jenkins + Gitlab + Pytest + Allure 接口自动化测试之持续集成实战终极教程

    实战教程篇 前言 这边就不教大家怎么用 pytest 写项目了哦,下面有系列文章能帮助你快速入门 Pytest + Allure 这一篇教程主要是教如何从 0 到 1 搭建自动化测试的持续集成环境 后 ...

  3. K8S(16)集成实战-使用spinnaker进行自动化部署

    K8s集成实战-使用spinnaker进行自动化部署 1 spinnaker概述和选型 1.1 概述 1.1.1 主要功能 Spinnaker是一个开源的多云持续交付平台,提供快速.可靠.稳定的软件变 ...

  4. 第一部分 代码组织概念,集成开发环境(IDE)

    代码组织概念 主要是代码文件,项目和解决方案. 解决方案(.sln)包含多个项目(.csproj),一个项目又包含多个文件(.cs). 集成开发环境(IDE): 由编辑.编译.调试,以及用户图形界面, ...

  5. webvnc利器-noVNC集成实战

    我们在做一个虚拟机管理平台,底层虚拟化使用KVM,我们希望在网页上操作虚拟机. 一开始用applet嵌在网页内实现webvnc,不过由于applet的在浏览器上运行安全性限制,我们需要一个新的方案.此 ...

  6. iOS 之 HTTPS集成实战应用

    临时想起来忘记把项目中用到的https集成整理收藏起来,以备后续不时之需.新手一般了解如下步骤即可: 1. HTTP 和 HTTPS 基本知识和学习 http://www.cnblogs.com/xi ...

  7. Spring Boot日志集成实战

    Spring Boot日志框架 Spring Boot支持Java Util Logging,Log4j2,Lockback作为日志框架,如果你使用starters启动器,Spring Boot将使用 ...

  8. 腾讯x5webview集成实战

    应用中许多网页由于优化的不够理想,出现加载慢,加载时间长等,而且因为碎片化导致兼容性问题,有一些网页有视频内容,产品还提出各种小窗需求,搞得心力憔悴.找到公开的有crosswalk和x5webview ...

  9. Jenkins持续集成实战总结

    原文:https://my.oschina.net/CandyDesire/blog/341331#comment-list 持续集成 什么是持续集成 随着软件开发复杂度的不断提高,团队开发成员间如何 ...

随机推荐

  1. 特殊权限SUID

    特殊权限SUID SUID : 运行某程序时,相应进程的属主是程序文件自身的属主,而不是启动者: chmod u+s File chmod u-s File 如果 FileB本身原来就有执行权限,则S ...

  2. python(二) jupyter 快捷键

    jupyter notebook 中的快捷键介绍 当你熟练使用notebooks的基本功能后,掌握他的快捷键是十分必要的,这样可以大大提高你的工作效率.下面是一些比较常用的快捷键: 编辑模式:点击单元 ...

  3. Ubuntu系统修改资源为阿里云镜像

    一般都会推荐使用国内的镜像源,比如163或者阿里云的镜像服务器将下列文本添加到/etc/apt/sources.list文件里 deb http://mirrors.aliyun.com/ubuntu ...

  4. [译]Vulkan教程(23)暂存buffer

    [译]Vulkan教程(23)暂存buffer Staging buffer 暂存buffer Introduction 入门 The vertex buffer we have right now ...

  5. python图片爬虫 - 批量下载unsplash图片

    前言 unslpash绝对是找图的绝佳场所, 但是进网站等待图片加载真的令人捉急, 仿佛是一场拼RP的战争 然后就开始思考用爬虫帮我批量下载, 等下载完再挑选, 操作了一下不算很麻烦, 顺便也给大家提 ...

  6. Exe4j 打包: this executable was created with an evaluation version of exe4j

    异常 this executable was created with an evaluation version of exe4j   异常.png 问题原因 当前打包使用exe4j未授权 解决方法 ...

  7. docker tomcat8 mysql8部署常见错误

    出现docker: out of memory bug ,内存溢出 解决方法: free -mh 应该看一下内存 内存优化/买内存 出现java.util.zip.ZipException: erro ...

  8. 前端JS实现一键导入excel表格

    前面的文章中已经讲过关于js表格的导出,此文章主要说到的是excel文件如何导入到网页中,并在网页端显示. 代码部分: <!DOCTYPE html> <html> <h ...

  9. SAP depreciation key config

    正常折旧 Configure 1.分配总帐科目 spro进入后台配置 –> Financial Accounting(New) –> Asset Accounting –> Depr ...

  10. 解决element-ui的表格设置固定栏后,边框线消失的bug

    如上图所示,边框线消失了,解决方法如下 添加css代码,如果是修改全局,则到全局样式文件添加 .el-table__row{ td:not(.is-hidden):last-child{ right: ...