Apollo的基本概念和集成实战
基本概念
使用场景
是一个分布式的配置中心。适用于微服务;
核心功能
- 集中管理不同环境,不同集群的配置;
- 配置修改后可以实时推送到应用端;
- 具备规范的权限,流程治理特性;
开发技术
- 服务端使用springboot,springcloud开发,打包后可以直接运行,无需安装额外的tomcat;
- java客户端不依赖任何框架,对Spring,SpringBoot的客户端也有额外支持
- .net客户端不依赖任何框架
概念
| 缩写 | 全称 | 说明 |
|---|---|---|
| FAT | 功能测试环境 | |
| UAT | 集成测试环境 | |
| PRO | 生产环境 | |
| DEV | 开发环境 |
详细功能
- 统一管理不同环境,不同集群,不同命名空间的配置;
- 同一份代码可以部署在不同的集群,可以有不同的配置,比如zk地址
- 通过命名空间可以方便的支持不同应用共享同一份配置,同时还允许应用对共享的配置进行覆盖;
- 配置修改实时生效 (用户在后台修改完配置发布后,客户端可以在1s内收到最新的配置并通知应用程序)
- 版本发布概念, (所有的配置发布都有版本概念,可以方便的支持配置的回滚)
- 灰度发布(配置发布后,支队部分应用实例生效,等观察一段时间后在推送给所有的应用)
- 权限管理,发布审核,操作审计
- 客户端配置信息监控(方便的看到配置被哪些实例使用)
- 支持多种语言,java和.net ,通过http接口使用也是支持的;
- 提供开放平台api给到其它系统修改和发布操作;
- 部署简单
后台使用
后台操作
- 创建项目
- 分配管理员,(管理项目的权限分配,创建集群,创建namespace)
- 分配配置的修改和发布权限
- 添加配置项 ,修改配置项
- 发布配置,回滚配置;
- 读取配置是在应用端使用; 具体见客户端接入文档;
公共组件的操作
公共组件: 提供给应用使用的其它组织的客户端代码,比如cat的客户端;本质上也是应用的一部分;
区别 : 通常情况下,公共组件的使用的配置由原始开发团队维护,但是实际的应用在运行时,环境不一样,所以我们也允许应用在实际使用的时候能够覆盖公共组件的部分配置;
需要自己创建自己唯一的namespace ;
公共组件的操作
- 创建项目
- 分配项目管理员权限
- 创建namespace
- 添加配置项,发布;
- 公共配置的读取
- 应用关联公共组件并覆盖公共组件的配置项
集群独立配置
- 添加集群,默认集群;
- 多个appId使用同一份配置
- 同公共组件,关联namespace,写入公共配置,或者覆盖公共配置
灰度发布
操作
- 创建灰度
- 灰度配置
- 灰度规则的新增,修改
- 灰度发布
- 全量发布,放弃灰度
- 发布历史
客户端接入
要求:jdk1.7+ , guava15.0+
客户端配置参数
- app.id (systemProperty > System Environment > springboot application.properties > META-INF/app.properties) 对应项目的id
- apollo.meta 访问地址 (SystemProperty > SpringBoot > SystemEnvironment>/opt/settings/server.properties > app.properties)
- 本地缓存路径 /opt/data/{appId}/config-cache/ key: apollo.cacheDir
- 环境配置 key : env
- 集群配置 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字符串自动注入为对象
配置的迁移
配置的迁移
- apollo中创建对应的项目;
- 在应用中创建好META-INF/app.properties,并配置好;
- 原来的配置文件,转换为properties,贴到apollo后台;
- 删除本地的配置;
本地开发
- 修改 /opt/settins/server.properties
设置env = Local - 准备本地配置文件 位置:
Mac/Linux: /opt/data/{appId}/config-cache
Windows: C:\opt\data{appId}\config-cache - 修改本地配置不会检测到实时变化,需要重启应用;
现有项目改造步骤
- 去掉disconf的依赖,找到对应的xml,去掉申明的配置bean;
- 搜索对应的@Disf,如果在类上,直接去掉,如果在方法或者字段上,替换为@Value注解;
- 增加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"/>
- 因为之前的依赖类路径下存在mysql.properties ; 而apollo没有生成那么多的文件;
- 在apollo后台,从disconf后台中把项目都有的配置放到application.properties下;
- 新建私有命名空间 log4j2.xml,把日志配置copy,放到里面发布;
- 如有跟公共配置相同的key,需要重写的,则关联公共命名空间重写;
- 启动程序,解决编译错误;
Apollo的基本概念和集成实战的更多相关文章
- ASP.NET Core & Docker & Jenkins 零基础持续集成实战
原文:ASP.NET Core & Docker & Jenkins 零基础持续集成实战 一.本系列教程说明 源代码管理工具:Gogs 持续集成工具:Jenkins 容器:Docker ...
- Docker + Jenkins + Gitlab + Pytest + Allure 接口自动化测试之持续集成实战终极教程
实战教程篇 前言 这边就不教大家怎么用 pytest 写项目了哦,下面有系列文章能帮助你快速入门 Pytest + Allure 这一篇教程主要是教如何从 0 到 1 搭建自动化测试的持续集成环境 后 ...
- K8S(16)集成实战-使用spinnaker进行自动化部署
K8s集成实战-使用spinnaker进行自动化部署 1 spinnaker概述和选型 1.1 概述 1.1.1 主要功能 Spinnaker是一个开源的多云持续交付平台,提供快速.可靠.稳定的软件变 ...
- 第一部分 代码组织概念,集成开发环境(IDE)
代码组织概念 主要是代码文件,项目和解决方案. 解决方案(.sln)包含多个项目(.csproj),一个项目又包含多个文件(.cs). 集成开发环境(IDE): 由编辑.编译.调试,以及用户图形界面, ...
- webvnc利器-noVNC集成实战
我们在做一个虚拟机管理平台,底层虚拟化使用KVM,我们希望在网页上操作虚拟机. 一开始用applet嵌在网页内实现webvnc,不过由于applet的在浏览器上运行安全性限制,我们需要一个新的方案.此 ...
- iOS 之 HTTPS集成实战应用
临时想起来忘记把项目中用到的https集成整理收藏起来,以备后续不时之需.新手一般了解如下步骤即可: 1. HTTP 和 HTTPS 基本知识和学习 http://www.cnblogs.com/xi ...
- Spring Boot日志集成实战
Spring Boot日志框架 Spring Boot支持Java Util Logging,Log4j2,Lockback作为日志框架,如果你使用starters启动器,Spring Boot将使用 ...
- 腾讯x5webview集成实战
应用中许多网页由于优化的不够理想,出现加载慢,加载时间长等,而且因为碎片化导致兼容性问题,有一些网页有视频内容,产品还提出各种小窗需求,搞得心力憔悴.找到公开的有crosswalk和x5webview ...
- Jenkins持续集成实战总结
原文:https://my.oschina.net/CandyDesire/blog/341331#comment-list 持续集成 什么是持续集成 随着软件开发复杂度的不断提高,团队开发成员间如何 ...
随机推荐
- Weather with you主题说明
使用前请确保拥有js权限!!! 源代码: css: /*广告去死*/ #ad_t2 { display: none !important; } #i-amphtml-fill-content { di ...
- Download Shuttle Pro mac文件下载器使用指南
Download Shuttle Pro是适用于macOS的最强大的下载管理器和加速器.它将文件下载分为多个部分,与使用Web浏览器相比,可以提高整体下载速度.使用我们的Pro版本,您可以访问我们的新 ...
- HttpClient发起Http/Https请求工具类
<dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpcl ...
- 剑指Offer-42.和为S的两个数字(C++/Java)
题目: 输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的. 输出描述: 对应每个测试案例,输出两个数,小的先输出. 分析: ...
- 关于Excel做表小知识记录
关于Excel做表小知识记录 最近使用Excel做了一系列的报表,觉得这是个很神奇的东西哈哈哈,以前我可是一想到Excel就开始头疼的人... 能用代码或者SQL语句解决的问题绝不会愿意留在Exce ...
- linux命令-压缩与打包
在 Linux 中可以识别的常见压缩格式有十几种,比如".zip"" .gz"" .bz2" ".tar" " ...
- Python 爬虫从入门到进阶之路(一)
通用爬虫和聚焦爬虫 根据使用场景,网络爬虫可分为 通用爬虫 和 聚焦爬虫 两种. 通用爬虫 通用网络爬虫 是 捜索引擎抓取系统(Baidu.Google.Yahoo等)的重要组成部分.主要目的是将互联 ...
- 什么是EAC模型
在20世纪70年代末,一个心理学学生理查德•班德勒和一个语言学学生约翰•格林德提出了一个EAC模型,即眼睛解读线索.这个模型对不同的感官和思维方式之间进行一些有效的研究, 对于大部分的人来说,左边往往 ...
- seaborn总结
Seaborn 数据可视化基础 介绍 Matplotlib 是支持 Python 语言的开源绘图库,因为其支持丰富的绘图类型.简单的绘图方式以及完善的接口文档,深受 Python 工程师.科研学者.数 ...
- Wappalyzer(chrome网站分析插件)
Wappalyzer是一款功能强大的.且非常实用的chrome网站技术分析插件,通过该插件能够分析目标网站所采用的平台构架. 网站环境.服务器配置环境.JavaScript框架.编程语言等参数,使用时 ...