Apollo(阿波罗)分布式配置中心

🍓 简介:java系列技术分享(👉持续更新中…🔥)
🍓 初衷:一起学习、一起进步、坚持不懈
🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏
🍓 希望这篇文章对你有所帮助,欢迎点赞 👍 收藏 ⭐留言 📝

🍓 更多文章请点击
在这里插入图片描述在这里插入图片描述

文章目录

  • 一、Apollo简介
    • 1.1 Nacos、Nacos、Spring Cloud Config 对此
    • 1.2 Apollo特性
    • 1.3 执行流程
  • 二、Apollo安装
    • 2.1 下载安装包
    • 2.2 创建数据库
    • 2.3 启动Apollo
  • 三、使用步骤
    • 3.1 发布配置
    • 3.2 应用读取配置
      • 3.2.1 引入依赖
      • 3.2.2 添加配置
      • 3.2.3 测试
  • 四、Apollo工作原理
    • 4.1 整体架构
    • 4.2 分步执行流程
    • 4.3 核心概念
  • 五、项目管理
    • 5.1 部门管理
    • 5.2 添加用户
    • 5.3 删除项目
    • 5.4 添加命名空间

在这里插入图片描述

一、Apollo简介

官方文档:https://github.com/apolloconfig/apollo

Apollo(阿波罗)2016年5月 是 携程开源的配置管理中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。

目前市面上用的比较多的配置中心有:

  1. Disconf
    2014年7月百度开源的配置管理中心,同样具备配置的管理能力,不过目前已经不维护了,最近的一次提交是两年前了。
  2. Spring Cloud Config
    2014年9月开源,Spring Cloud 生态组件,可以和Spring Cloud体系无缝整合。
  3. Apollo
    2016年5月,携程开源的配置管理中心,具备规范的权限、流程治理等特性。
  4. Nacos
    2018年6月,阿里开源的配置中心,也可以做DNS和RPC的服务发现。

配置中心核心概念的对比
由于Disconf不再维护,下面对比一下Spring Cloud Config、Apollo和Nacos。

1.1 Nacos、Nacos、Spring Cloud Config 对此

NacosNacosSpring Cloud Config
灰度发布不支持支持IP级别的灰度发布第三方框架支持
权限管理不支持基本完善第三方平台支持
版本管理&回滚支持之前回滚上一个版本,properties提供跨版本的回滚第三方平台支持
配置实时推送(动态刷新)支持,但是敏感加密后的动态刷新出现无法解密基本完善第三方框架支持
敏感加密引入Jasypt引入Jasypt原生支持
多环境支持支持支持
高可用支持支持支持
社区支持一般活跃一般

Spring Cloud Config作为官方提供的配置中心,适合学习和刚开始使用分布式框架的项目使用

Nacos作为阿里2018年开源的产品,有阿里背书,且服务发现和配置集与一体。但是从目前的发展来看,阿里开发重心在于服务发现端,配置中心相关功能开发相对滞后,适合中小型企业使用

Apollo是携程2016年开源的配置中心,经历了5年的迭代,现在已经是一个很完善的产品,能满足大型互联网的大多数需要

总的来看,Apollo和Nacos相对于Spring Cloud Config的生态支持更广,在配置管理流程上做的更好。Apollo相对于Nacos在配置管理做的更加全面,Nacos则使用起来相对比较简洁,在对性能要求比较高的大规模场景更适合。
但对于一个开源项目的选型,项目上的人力投入(迭代进度、文档的完整性)、社区的活跃度(issue的数量和解决速度、Contributor数量、社群的交流频次等),这些因素也比较关键,考虑到Nacos开源时间不长和社区活跃度,所以从目前来看Apollo应该是最合适的配置中心选型。

1.2 Apollo特性

  1. 统一管理不同环境、不同集群的配置
  2. 配置修改实时生效(热发布)
  3. 版本发布管理
  4. 灰度发布
  5. 权限管理、发布审核、操作审计
  6. 客户端配置信息监控
  7. 提供Java和.Net原生客户端
  8. 提供开放平台API

1.3 执行流程

在这里插入图片描述
操作流程如下:

  1. 在Apollo配置中心修改配置

  2. 应用程序通过Apollo客户端从配置中心拉取配置信息

    用户通过Apollo配置中心修改或发布配置后,会有两种机制来保证应用程序来获取最新配置:

    • 一种是Apollo配置中心会向客户端推送最新的配置;
    • 另外一种是Apollo客户端会定时从Apollo配置中心拉取最新的配置,通过以上两种
      机制共同来保证应用程序能及时获取到配置。

二、Apollo安装

2.1 下载安装包

  1. 访问Apollo的官方主页https://github.com/apolloconfig/apollo/tags获取安装包,(本次使用1.3版本)
    在这里插入图片描述2. 下载对应的安装包https://github.com/apolloconfig/apollo/releases/tag/v1.3.0
    在这里插入图片描述
    3, . 解压安装包后将apollo-configservice-1.3.0.jar, apollo-adminservice-1.3.0.jar, apollo-portal-1.3.0.jar放置于
    apollo目录

2.2 创建数据库

Apollo服务端共需要两个数据库: ApolloPortalDBApolloConfigDB

  1. 创建ApolloPortalDB,sql脚本下载地址:
    https://github.com/apolloconfig/apollo/blob/v1.3.0/scripts/db/migration/portaldb/V1.0.0__initialization.sql
  2. . 创建ApolloConfigDB,sql脚本下载地址:
    https://github.com/apolloconfig/apollo/blob/v1.3.0/scripts/db/migration/configdb/V1.0.0__initialization.sql
    在这里插入图片描述

2.3 启动Apollo

  1. 确保端口未被占用
    Apollo默认会启动3个服务,分别使用8070(apollo‐portal), 8080(apollo-configservice), 8090(apollo‐adminservice)端口,请确保这3个端口当前没有被使用

  2. windows环境下
    apollo目录中创建runApollo.bat文件,快速启动三个服务(修改数据库连接地址,数据库以及密码

    echoset url="localhost:3306"
    set username="root"
    set password="123456"start "configService" java -Xms256m -Xmx256m -Dapollo_profile=github -Dspring.datasource.url=jdbc:mysql://%url%/ApolloConfigDB?characterEncoding=utf8 -Dspring.datasource.username=%username% -Dspring.datasource.password=%password% -Dlogging.file=.\logs\apollo-configservice.log -jar .\apollo-configservice-1.3.0.jar
    start "adminService" java -Xms256m -Xmx256m -Dapollo_profile=github -Dspring.datasource.url=jdbc:mysql://%url%/ApolloConfigDB?characterEncoding=utf8 -Dspring.datasource.username=%username% -Dspring.datasource.password=%password% -Dlogging.file=.\logs\apollo-adminservice.log -jar .\apollo-adminservice-1.3.0.jar
    start "ApolloPortal" java -Xms256m -Xmx256m -Dapollo_profile=github,auth -Ddev_meta=http://localhost:8080/ -Dserver.port=8070 -Dspring.datasource.url=jdbc:mysql://%url%/ApolloPortalDB?characterEncoding=utf8 -Dspring.datasource.username=%username% -Dspring.datasource.password=%password% -Dlogging.file=.\logs\apollo-portal.log -jar .\apollo-portal-1.3.0.jar
    
  3. Linux环境下

    apollo目录中创建runApollo.sh文件,快速启动三个服务(修改数据库连接地址,数据库以及密码

    #!/bin/shurl="localhost:3306"
    username="root"
    password="123456"java -Xms256m -Xmx256m -Dapollo_profile=github -Dspring.datasource.url=jdbc:mysql://${url}/ApolloConfigDB?characterEncoding=utf8 -Dspring.datasource.username=${username} -Dspring.datasource.password=${password} -Dlogging.file=./logs/apollo-configservice.log -Dserver.port=8080 -jar apollo-configservice-1.3.0.jar &
    java -Xms256m -Xmx256m -Dapollo_profile=github -Dspring.datasource.url=jdbc:mysql://${url}/ApolloConfigDB?characterEncoding=utf8 -Dspring.datasource.username=${username} -Dspring.datasource.password=${password} -Dlogging.file=./logs/apollo-adminservice.log -Dserver.port=8090 -jar apollo-adminservice-1.3.0.jar & 
    java -Xms256m -Xmx256m -Dapollo_profile=github,auth -Ddev_meta=http://localhost:8080/ -Dserver.port=8070 -Dspring.datasource.url=jdbc:mysql://%url%/ApolloPortalDB?characterEncoding=utf8 -Dspring.datasource.username=%username% -Dspring.datasource.password=%password% -jar apollo-portal-1.3.0.jar &

启动成功后,访问管理页面

  • http://localhost:8070/
  • 账号/密码:apollo/admin

在这里插入图片描述
在这里插入图片描述

三、使用步骤

3.1 发布配置

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

3.2 应用读取配置

3.2.1 引入依赖

<!--Apollo依赖--><dependency><groupId>com.ctrip.framework.apollo</groupId><artifactId>apollo-client</artifactId><version>1.1.0</version></dependency>

3.2.2 添加配置

app:id: apollo-config   # app.id是必须配置的
apollo:meta: http://localhost:8080 # Apollo Meta Server 地址(它的注册中心地址,eureka地址)bootstrap:enabled: true   #是否开启 Apollo 配置预加载功能。默认为 false。eagerLoad:enable: true  #是否开启 Apollo 支持日志级别的加载时机。默认为 false。# 指定 namespacenamespaces: application  #使用的 Apollo 的命名空间,默认为 application,多个用逗号隔开

3.2.3 测试

Apollo添加配置
在这里插入图片描述
项目读取

@Component
@Data
public class Setting {@Value("${setting.upload-addr}")private String uploadAddr;@Value("${setting.path}")private String path;
}
@RestController
public class TestController {@Autowiredprivate Setting setting;@GetMapping("/setting")public Map getSetting(){Map map = new HashMap<>();map.put("uploadAddr",setting.getUploadAddr());map.put("path",setting.getPath());System.err.println(map);return map;}
}

启动类添加@EnableApolloConfig注解

@SpringBootApplication
@EnableApolloConfig
public class ConsumerApplication {public static void main(String[] args) {SpringApplication.run(ConsumerApplication.class, args);}
}

成功读取
在这里插入图片描述

四、Apollo工作原理

4.1 整体架构

在这里插入图片描述上图简要描述了 Apollo 的总体设计,从下往上看:

  • Config Service 提供配置的读取、推送等功能,服务对象是Apollo客户端
  • Admin Service 提供配置的修改、发布等功能,服务对象是Apollo Portal(管理界面)
  • Eureka提供服务注册和发现,为了简单起见,目前Eureka在部署时和Config Service是在一个JVM进程中的
  • Config Service 和 Admin Service 都是多实例、无状态部署,所以需要将自己注册到 Eureka 中并保持心跳
  • 在 Eureka 之上我们架了一层 Meta Server 用于封装 Eureka 的服务发现接口
  • Client 通过域名访问Meta Server获取Config Service服务列表(IP+Port),而后直接通过IP+Port 访问服务,同时在 Client 侧会做 load balance、错误重试
  • Portal 通过域名访问 Meta Server 获取Admin Service服务列表(IP+Port),而后直接通过IP+Port访问服务,同时在Portal侧会做load balance、错误重试
  • 为了简化部署,我们实际上会把Config Service、Eureka和Meta Server三个逻辑角色部署在同一个JVM进程中

4.2 分步执行流程

  1. Apollo启动后,Config/Admin Service会自动注册到Eureka服务注册中心,并定期发送保活心跳。
  2. Apollo Client和Portal管理端通过配置的Meta Server的域名地址经由Software Load Balancer(软件负载均衡器)进行负载均衡后分配到某一个Meta Server
  3. Meta Server从Eureka获取Config Service和Admin Service的服务信息,相当于是一个Eureka Client
  4. Meta Server获取Config Service和Admin Service(IP+Port)失败后会进行重试
  5. 获取到正确的Config Service和Admin Service的服务信息后,Apollo Client通过Config Service为应用提供配置获取、实时更新等功能;Apollo Portal管理端通过Admin Service提供配置新增、修改、发布等功能

4.3 核心概念

  1. application (应用)
    这个很好理解,就是实际使用配置的应用,Apollo客户端在运行时需要知道当前应用是谁,从而 可以去获取对应的配置
    关键字:appId
  2. environment (环境)
    配置对应的环境,Apollo客户端在运行时需要知道当前应用处于哪个环境,从而可以去获取应用的配置
    关键字:env
  3. cluster (集群)
    一个应用下不同实例的分组,比如典型的可以按照数据中心分,把上海机房的应用实例分为一个集群,把北
    京机房的应用实例分为另一个集群。
    关键字:cluster
  4. namespace (命名空间)
    一个应用下不同配置的分组,可以简单地把namespace类比为文件,不同类型的配置存放在不同的文件中,如数据库配置文件,RPC配置文件,应用自身的配置文件等
    关键字:namespaces

在这里插入图片描述

五、项目管理

5.1 部门管理

在这里插入图片描述
查询organizations
在这里插入图片描述编辑后保存,退出重新登录,则发现部门添加成功

在这里插入图片描述

5.2 添加用户

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

5.3 删除项目

在这里插入图片描述

在这里插入图片描述

5.4 添加命名空间

在这里插入图片描述

在这里插入图片描述添加配置
在这里插入图片描述

测试读取

public class GetConfigTest {public static void main(String[] args) {
//        Config config = ConfigService.getAppConfig();  // 读取默认的namespace的配置信息Config config = ConfigService.getConfig("spring-test");//读取指定namespace下的配置信息String someKey = "date";String value = config.getProperty(someKey, null);System.out.println("读取的配置信息为: " + value);}}

添加虚拟机参数

-Dapp.id=apollo-config -Denv=DEV -Ddev_meta=http://localhost:8080
在这里插入图片描述
读取成功
在这里插入图片描述

在这里插入图片描述在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CSS Vue/RN 背景使用opacity,文字在背景上显示

Vue <div class"training_project_tip"> <div class"tip">展示的文字</div> </div> .training_project_tip { font-size: 12px; font-weight: 400; text-align: left; color: #ffffff; margin-top: 8px; position: relative; dis…

如何将前后端分离项目部署到本地的Docker Desktop容器运行并且访问

文章目录 前言 完成了客户的一个前后端分离项目&#xff0c;要求部署到客户电脑上去展示&#xff0c;那肯定不能直接把代码弄上去跑呀~~~&#xff0c;于是我就想把他们都打包部署到本地的docker容器里面&#xff0c;方便运行和访问&#xff0c;so&#xff0c;以下内容就详细介…

LeetCode09——回文数

LeetCode09 自己写的解,转化为字符串再反转&#xff0c;比较笨。 import java.util.Scanner; public class Result01 {public static void main(String[] args) {System.out.println("请输入整数&#xff0c;我来帮您判断是否是回文数。");Scanner scanner new Sc…

Linux之解除ssh远程登录限制

背景&#xff1a;复制了一个虚拟机&#xff0c;将root密码重置为123456后&#xff0c;使用xshell通过ssh登录竟然失败&#xff0c;检查了很多次&#xff0c;确定root账号密码正确&#xff0c;以下是记录的排查过程。 1、查看ssh登录日志 Ubuntu&#xff1a;/var/log/auth.log…

2023年中国门把手产量、销量及市场规模分析[图]

门把手行业是指专门从事门把手的设计、制造、销售和安装等相关业务的行业。门把手是门窗装饰硬件的一种&#xff0c;用于开启和关闭门窗&#xff0c;同时也具有装饰和美化门窗的作用。 门把手行业分类 资料来源&#xff1a;共研产业咨询&#xff08;共研网&#xff09; 随着消…

R/d2及S/C4估计总体标准差,比较其CPK及规格限概率的差异

R/d2 和 S/C4 是用于估计总体标准差的无偏估计方法&#xff0c;通常用于控制图中。这些估计方法的主要目的是通过样本数据来估计总体标准差&#xff0c;以便监测过程的稳定性和变异性&#xff0c;而不需要收集整个总体的数据。 具体来说&#xff1a; R图中的 R/d2 和 S图中的…

【数据结构】二叉树--OJ练习题

目录 1 单值二叉树 2 相同的树 3 另一颗树的子树 4 二叉树的前序遍历 5 二叉树的最大深度 6 对称二叉树 7 二叉树遍历 1 单值二叉树 965. 单值二叉树 - 力扣&#xff08;LeetCode&#xff09; bool isUnivalTree(struct TreeNode* root) {if (root NULL){return true;}…

【linux】重定向+缓冲区

重定向缓冲区 1.重定向1.1重定向本质1.2重定向接口1.3重定向分类1.3.1>输出重定向1.3.2>>追加重定向1.3.3<输入重定向 2.理解 >&#xff0c; >>&#xff0c; <3.如何理解linux下一切皆文件4.缓冲区4.1理解缓冲区问题4.1.1为什么要有缓冲区4.1.2缓冲区刷…

【yolov5】改进系列——特征图可视化

文章目录 前言一、特征图可视化二、可视化指定层三、合并通道可视化总结 前言 对于特征图可视化感兴趣可以参考我的另一篇记录&#xff1a;六行代码实现&#xff1a;特征图提取与特征图可视化&#xff0c;可以实现分类网络的特征图可视化 最近忙论文&#xff0c;想在yolov5上…

Java系列 | 如何讲自己的JAR包上传至阿里云maven私有仓库【云效制品仓库】

什么是云效 云效是云原生时代一站式 BizDevOps 平台&#xff0c;产研数字化同行者&#xff0c;支持公共云、专有云和混合云多种部署形态&#xff0c;通过云原生新技术和研发新模式&#xff0c;助力创新创业和数字化转型企业快速实现产研数字化&#xff0c;打造“双敏”组织&…

Python数据挖掘入门进阶与实用案例:自动售货机销售数据分析与应用

文章目录 写在前面01 案例背景02 分析目标03 分析过程04 数据预处理1. 清洗数据2.属性选择3.属性规约 05 销售数据可视化分析1.销售额和自动售货机数量的关系2.订单数量和自动售货机数量的关系3.畅销和滞销商品4.自动售货机的销售情况5.订单支付方式占比6.各消费时段的订单用户…

uni-app 瀑布流布局的实现

方式一&#xff1a;使用纯 CSS 实现 使用 flex 布局方式 <!-- 瀑布流布局 --> <template><view class"container"><viewclass"cont-box":style"{ --layout-width: 100 / flowData.column - flowData.columnSpace % }"v-f…

CatBoost算法模型实现贷款违约预测

前言 此篇文章为整个Boost(提升方法)集成算法模型的终章&#xff0c;前几篇文章依次结合详细项目案例讲解了AdaBoost、GBDT、XGBoost、LighGBM共四个常用的集成算法模型&#xff0c;每一篇文章都包含实战项目以及可运行代码。仅通过看一遍文章不去实践是很难掌握集成算法模型的…

【API篇】三、转换算子API(上)

文章目录 0、demo数据1、基本转换算子&#xff1a;映射map2、基本转换算子&#xff1a;过滤filter3、基本转换算子&#xff1a;扁平映射flatMap4、聚合算子&#xff1a;按键分区keyBy5、聚合算子&#xff1a;简单聚合sum/min/max/minBy/maxBy6、聚合算子&#xff1a;归约聚合re…

maven 新建模块 导入后 按Ctrl 点不进新建模块pom定义

新建的ruoyi-common-mybatisplus 模块,导入一直不正常 画出的模块一直导入不进来 这是提示信息 这是正常的提示信息 加上 <version>3.6.3</version> 后,才一切正常

C++入门之引用与内联函数

一、引用 1、初步理解 引用在语法上的理解就是起别名&#xff0c;用法就是在类型后面加&&#xff0c;例子&#xff1a;int a 1; int& b a; 上例所示&#xff0c;执行后&#xff0c;b就是a的别名&#xff0c;它们代表同一块空间&#xff0c;a的改变会影响b&#xff0…

进阶JAVA篇-如何理解作为参数使用的匿名内部类与 Arrays 类的常用API(九)

目录 目录 API 1.0 Arrays 类的说明 1.1 Arrays 类中的 toString() 静态方法 1.2 Arrays 类中的 copyOfRange(int[] original, int from, int to) 静态方法 1.3 Arrays 类中的 copyOf(int[] original, int newLength) 静态方法 1.4 Arrays 类中的 setAll(do…

深入了解桶排序:原理、性能分析与 Java 实现

桶排序&#xff08;Bucket Sort&#xff09;是一种排序算法&#xff0c;通常用于将一组数据分割成有限数量的桶&#xff08;或容器&#xff09;&#xff0c;然后对每个桶中的数据进行排序&#xff0c;最后将这些桶按顺序合并以得到排好序的数据集。 桶排序原理 确定桶的数量&am…

Unity中用序列化和反序列化来保存游戏进度

[System.Serializable]标记类 序列化 [System.Serializable]是一个C#语言中的属性&#xff0c;用于标记类&#xff0c;表示该类的实例可以被序列化和反序列化。序列化是指将对象转换为字节流的过程&#xff0c;以便可以将其保存到文件、数据库或通过网络传输。反序列化则是将字…

C++桶排序算法的应用:存在重复元素 III

题目 给你一个整数数组 nums 和两个整数 indexDiff 和 valueDiff 。 找出满足下述条件的下标对 (i, j)&#xff1a; i ! j, abs(i - j) < indexDiff abs(nums[i] - nums[j]) < valueDiff 如果存在&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例…