分布式配置中心Apollo

news2024/11/13 8:41:38

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

服务端基于Spring Boot和Spring Cloud开发,打包后可以直接运行,不需要额外安装Tomcat等应用容器。

Java客户端不依赖任何框架,能够运行于所有Java运行时环境,同时对Spring/Spring Boot环境也有较好的支持。

.Net客户端不依赖任何框架,能够运行于所有.Net运行时环境。

如果想要深入了解,可以到github上参见Apollo配置中心,官网的介绍很详细。本章主要讲述Spring Boot 2.0 整合Apollo配置中心。

一、Apollo配置中心服务端(来源于官网)

本文的重点在于Apollo在客户端的使用,所以Apollo服务端使用的是官网提供的 Quick Start(针对本地测试使用),后续文章会专门讲述Apollo服务端在分布式环境下的部署。

1.1 准备工作

  1. Java
    Apollo服务端要求Java 1.8+,客户端要求Java 1.7+,笔者本地使用的是Java 1.8。

  2. MySQL
    Apollo的表结构对timestamp使用了多个default声明,所以需要5.6.5以上版本。笔者本地使用的是8.0.13版本

  3. 下载 Quick Start
    官网为我们准备了 Quick Start 安装包。大家只需要下载到本地,就可以直接使用,免去了编译、打包过程。大家可以到github下载,也可以通过百度云盘下载

1.2 安装步骤

1.2.1 创建数据库

Apollo服务端共需要两个数据库:ApolloPortalDB和ApolloConfigDB,官网把数据库、表的创建和样例数据都分别准备了sql文件(在下载的 Quick Start 安装包的sql目录下),只需要导入数据库即可。

1.2.1.1 创建ApolloPortalDB

通过各种Mysql客户端(Navicat,DataGrip等)导入sql/apolloportaldb.sql即可
下面以MySQL原生客户端为例:

source /your_local_path/sql/apolloportaldb.sql

导入成功后,可以通过执行以下sql语句来验证:

select `Id`, `AppId`, `Name` from ApolloPortalDB.App;

IdAppIdName
1SampleAppSample App

1.2.1.2 创建ApolloConfigDB

通过各种Mysql客户端(Navicat,DataGrip等)导入sql/apolloconfigdb.sql即可
下面以MySQL原生客户端为例:

source /your_local_path/sql/apolloconfigdb.sql

导入成功后,可以通过执行以下sql语句来验证:

select `NamespaceId`, `Key`, `Value`, `Comment` from ApolloConfigDB.Item;

NamespaceIdKeyValueComment
1timeout100sample

1.2.2 配置数据库连接信息

Apollo服务端需要知道如何连接到你前面创建的数据库,所以需要编辑demo.sh,修改ApolloPortalDB和ApolloConfigDB相关的数据库连接串信息。

#apollo config db info
apollo_config_db_url=jdbc:mysql://localhost:3306/ApolloConfigDB?characterEncoding=utf8
apollo_config_db_username=用户名
apollo_config_db_password=密码(如果没有密码,留空即可)

# apollo portal db info
apollo_portal_db_url=jdbc:mysql://localhost:3306/ApolloPortalDB?characterEncoding=utf8
apollo_portal_db_username=用户名
apollo_portal_db_password=密码(如果没有密码,留空即可)

 

1.3 启动Apollo配置中心

1.3.1 确保端口未被占用

Quick Start脚本会在本地启动3个服务,分别使用8070, 8080, 8090端口,请确保这3个端口当前没有被使用。例如,在Linux/Mac下,可以通过如下命令检查:

lsof -i:8080

在windows下,可以通过如下命令检查:

netstat -aon|findstr "8080"

1.3.2 执行启动脚本

在Quick Start目录下执行如下命令:

./demo.sh start

当看到如下输出后,就说明启动成功了!

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

1.3.3 异常排查

如果启动遇到了异常,可以分别查看service和portal目录下的log文件排查问题。

注: 在启动apollo-configservice的过程中会在日志中输出eureka注册失败的信息,如com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused。需要注意的是,这个是预期的情况,因为apollo-configservice需要向Meta Server(它自己)注册服务,但是因为在启动过程中,自己还没起来,所以会报这个错。后面会进行重试的动作,所以等自己服务起来后就会注册正常了。

1.4 使用Apollo配置中心

1.4.1 查看样例配置

  1. 浏览器访问http://localhost:8070


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

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


    配置中心中包含一个默认的项目SampleApp

  3. 点击SampleApp进入配置界面,可以看到当前有一个配置timeout=100


    如果提示系统出错,请重试或联系系统负责人,请稍后几秒钟重试一下,因为通过Eureka注册的服务有一个刷新的延时。

1.4.2 新增项目配置

我们的客户端使用apollo需要新增相关的项目配置。

点击新建项目

点击提交,创建完成

    • 应用ID:这个ID是应用的唯一标识

    • 应用名称:应用的名称,会展示在配置中心的首页上

  1. 新增配置信息
    点击新增配置,填写配置信息

    点击提交,此时配置还未生效。

  2. 发布配置
    点击发布,配置立刻生效

  3. 回滚
    如果配置做了修改之后,发现配置更改错误,这个时候可以使用回滚功能,回到上一个配置

二、Apollo配置中心客户端

我们客户端基于Spring Boot 2.0搭建,开发工具是InteIIij IDEA。新建一个项目,项目名称为apollo-client

2.1 客户端搭建

添加Apollo客户端依赖

 

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

添加配置信息

# 应用ID(在Apollo服务端新增项目添加的应用ID)
app.id=testclient
# apollo-configservice地址
apollo.meta=http://127.0.0.1:8080开启Apollo客户端

在项目的启动类上添加@EnableApolloConfig注解

新增一个测试接口

@RequestMapping("/index")
public String hello(){
return "hello man";
}

 

启动服务测试
在Apollo配置中心中,我们对该项目有一条配置server.port = 9000,启动服务,访问http://localhost:9000/index,返回hello man。证明,客户端是从服务端获取的配置。

2.2 客户端用法

在上一节,我们简单的搭建了客户端,成功的使用服务端配置。Apollo为我们提供的使用方式有很多种,下面只介绍Spring Boot 2.0环境下的使用方式。

2.2.1 Spring Placeholder的使用

Spring应用通常会使用Placeholder来注入配置,使用的格式形如${someKey:someDefaultValue},如${timeout:100}。冒号前面的是key,冒号后面的是默认值(建议在实际使用时尽量给出默认值,以免由于key没有定义导致运行时错误)。Apollo从v0.10.0开始的版本支持placeholder在运行时自动更新。如果需要关闭placeholder在运行时自动更新功能,可以通过以下两种方式关闭:

  1. 通过设置System Property apollo.autoUpdateInjectedSpringProperties,如启动时传入-Dapollo.autoUpdateInjectedSpringProperties=false

  2. 通过设置META-INF/app.properties中的apollo.autoUpdateInjectedSpringProperties=false

2.2.1.1 Java Config使用方式

  1. 新建配置类JavaConfigBean如下:

     

    /**
    * Java Config方式
    *
    * @author simon
    * @create 2018-11-02 15:00
    **/
    @Configuration
    public class JavaConfigBean {
    @Value("${timeout:20}")
    private int timeout;
    
    public int getTimeout() {
    return timeout;
    }
    }
  2. 新增访问端点

      
    //1.Java Config方式
    @Autowired
    JavaConfigBean javaConfigBean;
    
    @RequestMapping("/index1")
    public String hello1(){
    return javaConfigBean.getTimeout()+"";
    }
  3. 测试
    浏览器访问http://127.0.0.1:8080/index1,正确返回配置的值

2.2.1.2 ConfigurationProperties使用方式

Spring Boot提供了@ConfigurationProperties把配置注入到bean对象中。Apollo也支持这种方式,下面的例子会把redis.cache.expireSecondsredis.cache.commandTimeout分别注入到SampleRedisConfigexpireSecondscommandTimeout字段中。

  1. 新增配置类SampleRedisConfig如下:

     

    /**
    * ConfigurationProperties使用方式
    *
    * @author simon
    * @create 2018-11-02 9:30
    **/
    @Configuration
    @ConfigurationProperties(prefix = "redis.cache")
    public class SampleRedisConfig {
    private int expireSeconds;
    private int commandTimeout;
    
    public void setExpireSeconds(int expireSeconds) {
    this.expireSeconds = expireSeconds;
    }
    
    public void setCommandTimeout(int commandTimeout) {
    this.commandTimeout = commandTimeout;
    }
    
    public int getExpireSeconds() {
    return expireSeconds;
    }
    
    public int getCommandTimeout() {
    return commandTimeout;
    }
    }
  2. 新增访问端点

     
    //2. ConfigurationProperties使用方式
    @Autowired
    SampleRedisConfig sampleRedisConfig;
    
    @RequestMapping("/index2")
    public String hello2(){
    return sampleRedisConfig.getCommandTimeout()+"--"+sampleRedisConfig.getExpireSeconds();
    }
  3. 测试
    浏览器访问http://127.0.0.1:8080/index2,正确返回配置的值

注: @ConfigurationProperties如果需要在Apollo配置变化时自动更新注入的值,需要配合使用EnvironmentChangeEventRefreshScope。这个我会在后续文章中详细描述。

2.2.2 Spring Annotation支持

Apollo同时还增加了几个新的Annotation来简化在Spring环境中的使用。

  • @ApolloConfig用来自动注入Config对象

  • @ApolloConfigChangeListener用来自动注册ConfigChangeListener

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

2.2.2.1 @ApolloConfig的使用

  1. 新增访问端点

     

    // 3. @ApolloConfig使用
    @ApolloConfig
    private Config config;
    
    @RequestMapping("/index3")
    public String hello3(){
    Set <String> propertyNames = config.getPropertyNames();
    propertyNames.forEach(key -> {
    System.err.println(key+"="+config.getIntProperty(key,0));
    });
    return propertyNames.toString();
    }
  2. 测试
    浏览器访问http://127.0.0.1:8080/index3,正确打印配置的值

     

    redis.cache.commandTimeout=3000
    redis.cache.expireSeconds=20
    server.port=800
    timeout=200

@ApolloConfigChangeListener的使用

  1. 新增以下代码

     

    @ApolloConfigChangeListener
    private void someOnChange(ConfigChangeEvent changeEvent) {
    //update injected value of batch if it is changed in Apollo
    if (changeEvent.isChanged("timeout")) {
    System.out.println(config.getIntProperty("timeout", 0));
    }
    }
  2. 测试
    在Apollo服务端修改timeout配置的值为300,发布后,控制台打印300

2.2.2.3 @ApolloJsonValue的使用

  1. 新增User如下:

     
     
     
    /**
    * 用户
    *
    * @author simon
    * @create 2018-11-02 16:41
    **/
    public class User {
    private String username;
    private String password;
    
    public String getUsername() {
    return username;
    }
    
    public void setUsername(String username) {
    this.username = username;
    }
    
    public String getPassword() {
    return password;
    }
    
    public void setPassword(String password) {
    this.password = password;
    }
    }
  2. 服务端新增配置
     

    jsonBeanProperty=[ { "username": "john", "password": "1234" }, { "username": "simon", "password": "222132" } ]
  3. 客户端获取配置

     
    //4. @ApolloJsonValue使用
    @ApolloJsonValue("${jsonBeanProperty:[]}")
    private List<User> anotherJsonBeans;
    
    @RequestMapping("/index4")
    public void hello4(){
    anotherJsonBeans.forEach(item -> {
    System.err.println(item.getUsername()+"--"+item.getPassword());
    });
    }
  4. 测试
    浏览器访问http://127.0.0.1:8080/index4,正确打印配置的值

源码下载

  https://github.com/simondongji/SpringCloudProject/tree/master/apollo

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/64871.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Python百日进阶-数据分析】Day326 - plotly.express.scatter_geo():地理散点图

文章目录一、scatter_geo语法二、参数三、返回类型四、实例4.1 常规地理散点图4.2自定义地理散点图4.3GeoPandas 的基本示例一、scatter_geo语法 plotly.express.scatter_geo(data_frame None ,lat None ,lon None ,locations None ,locationmode None ,geojson None , …

MuziDB数据库-0.项目描述

前言 该项目写完也有一段时间了&#xff0c;为了避免以后忘记该项目的一些实现的原理&#xff0c;所以写下这篇博客来记录一下该项目的设计等 项目整体 MuziDB分为前端与后端&#xff0c;前后端交互通过socket进行交互&#xff0c;前端的作用就是读取用户输入并发送到后端进…

mybatis开发要点-insert主键ID获取和多参数传递

1.2、代码示例 二、查询如何传入多个参数 1、使用map传递参数&#xff1b; 2、使用注解传递参数&#xff1b; 3、使用Java Bean的方式传递参数&#xff1b; 一、插入数据主键ID获取 一般我们在做业务开发时&#xff0c;经常会遇到插入一条数据并使用到插入数据的ID情况。如…

网络安全事件应急演练方案

文章目录1 总则1.1 应急演练定义1.2 应急演练目的1.3 应急演练原则1.4 应急演练分类1.4.1 按组织形式划分1.4.2 按内容划分1.4.3 按目的与作用划分1.4.4 按组织范围划分1.5 应急演练规划2 应急演练组织机构2.1 组织单位2.1.1 领导小组2.1.2 策划小组2.1.3 保障小组2.1.4 评估小…

jvm参数造成http请求Read time out

问题描述 线上部署的代码&#xff0c;部署在测试环境突然抛出接口请求Read time out的异常。查看线上日志&#xff0c;接口请求正常。重新启动&#xff0c;部署测试环境代码都没有效果&#xff0c;接口还是必现Read time out。 原因分析&#xff1a; 1. 排查网络原因 直接在…

内核开发-同步场景与概念

进程上下文执行环境还有中断上下文执行环境&#xff0c;并且中断上下文优先级比较高&#xff0c;可以随时打断进程的执行&#xff0c;因此情况更加复杂。内核当中提供了不同的同步机制。比如说信号量&#xff0c;自旋锁&#xff0c;rcu&#xff0c;原子变量等等。他们各自都有自…

《计算机视觉技术与应用》-----第六章 直方图

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 例如&#xff1a;第一章 Python 机器学习入门之pandas的使用 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目…

软件过程模型

软件过程软件过程:获得高质量软件的一系列任务框架瀑布模型:特点:顺序,依赖,推迟实现,质量保证优点:规范方法,规定文档,阶段质量验证缺点:开发初期困难,需求验证困难,难以维护快速原型优点:满足需求,线性过程缺点:设计困难,原型理解不同,不利于创新增量模型:优点:短时间可完成部…

[附源码]Python计算机毕业设计SSM健身房管理系统设计(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

[附源码]Python计算机毕业设计Django体育馆场地预约管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

VSCode 配置C语言环境 全程记录 ,配置成功

目录 1.vscode介绍&#xff1a; 1.1 卸载干净VSCode 1.2安装VSCode 1.2.1 下载安装 1.2.2 vscode 小插件安装 2. 配置vscode 编译器 2.1 下载编译器资源文件&#xff1a; 2.2 配置环境变量 2.3 vscode项目文件配置 1. 首先新建一个.c文件&#xff0c;命名为英文哦 2. 然后…

含有DBCO和马来酰亚胺基团Mal-PEG2-DBCO,2698339-31-8,DBCO-PEG2-Maleimide

中英文别名&#xff1a; CAS号&#xff1a;2698339-31-8 | 英文名&#xff1a;DBCO-PEG2-Maleimide&#xff0c;Mal-PEG2-DBCO |中文名&#xff1a;二苯并环辛炔-二聚乙二醇-马来酰亚胺物理参数&#xff1a; CASNumber&#xff1a;2698339-31-8 Molecular formula&#xff1a;C…

工业和信息化部公布45个国家先进制造业集群名单

近日&#xff0c;工业和信息化部正式公布45个国家先进制造业集群的名单。 45个国家级集群2021年主导产业产值达19万亿元&#xff0c;布局建设了18家国家制造业创新中心&#xff0c;占全部国家级创新中心数量的70%&#xff0c;拥有国家级技术创新载体1700余家&#xff0c;培育创…

【苹果相册推iMessage】软件安装Websocket可以在浏览器顶用于支持两个通讯并使用它

推荐内容IMESSGAE相关 作者推荐内容iMessage苹果推软件 *** 点击即可查看作者要求内容信息作者推荐内容1.家庭推内容 *** 点击即可查看作者要求内容信息作者推荐内容2.相册推 *** 点击即可查看作者要求内容信息作者推荐内容3.日历推 *** 点击即可查看作者要求内容信息作者推荐…

Python3,9行代码,对比两个Excel数据差异,并把差异结果重新保存。

Excel数据差异对比1、引言2、代码实战3、总结1、引言 小屌丝&#xff1a;鱼哥&#xff0c;还记得上次写的把数据库的查询结果写入到excel这个脚本不。 小鱼&#xff1a;嗯… 可以说不记得吗 小屌丝&#xff1a;我猜你就记得。 小鱼&#xff1a;你…说…啥&#xff1f;&#xf…

画布的使用方式

一、’注册—登录—主页’作业中的技术点&#xff1a; 1、前端&#xff1a; ​ &#xff08;1&#xff09;input file标签的样式处理 ​ &#xff08;2&#xff09;文件类型的设置&#xff1a;accept属性来指定 ​ &#xff08;3&#xff09;input file选择的图片立即显示出…

搭建K8s集群

前言&#xff1a;本次将通过kubeadm部署1个master节点&#xff0c;2个worker节点K8s集群&#xff0c;本次集群使用的容器运行工具为docker(题外话&#xff1a;K8s的容器运行工具也可以用docker、containerd、cio等等&#xff0c;其中containerd是一个轻量级、工业级的容器运行工…

aws eks 使用paker构建自定义ami

资料 如何创建用于 Amazon EKS 的自定义 Amazon Linux AMI&#xff1f; 构建预置容器镜像的EKS自定义AMI解决方案 https://github.com/awslabs/amazon-eks-ami https://github.com/awslabs/amazon-eks-ami/blob/master/doc/USER_GUIDE.md https://developer.hashicorp.com/…

[Cortex-M3]-3-分散加载文件解析(.sct)

目录 1 分散加载文件.sct 2 如何生成.sct文件 3 *(InRoot$$Sections) 说明 4 如何修改分散加载文件 5 已经初始化变量的初值&#xff0c;存储位置 6 RW ZI和RO如何执行 1 分散加载文件.sct MDK的分散加载主要是通过.sct文件实现的&#xff0c;链接器根据.sct…

黄菊华老师,Python毕业设计毕设辅导教程(2):Python开发准备,Window 平台安装 Python

Python3 开发准备 Python3 可应用于多平台包括 Windows、Linux 和 Mac OS X。 Unix (Solaris, Linux, FreeBSD, AIX, HP/UX, SunOS, IRIX, 等等。)Win 9x/NT/2000Macintosh (Intel, PPC, 68K)OS/2DOS (多个DOS版本)PalmOSNokia 移动手机Windows CEAcorn/RISC OSBeOSAmigaVMS/…