Apollo之原理和使用讲解

文章目录

  • 1 Apollo
    • 1.1 简介
      • 1.1.1 背景
      • 1.1.2 简介
      • 1.1.3 特点
    • 1.2 基础模型
    • 1.3 Apollo 四个维度
      • 1.3.1 application
      • 1.3.2 environment
      • 1.3.3 cluster
      • 1.3.4 namespace
    • 1.4 本地缓存
    • 1.5 客户端设计
      • 1.5.1 客服端拉取原理
      • 1.5.2 配置更新推送实现
    • 1.6 总体设计
    • 1.7 可用性考虑
  • 2 操作使用
    • 2.1 配置Apollo
      • 2.1.1 登录 Apollo
      • 2.1.2 修改与增加部门数据
      • 2.1.3 创建一个项目
      • 2.1.4 创建一个配置参数
    • 2.2 创建客户端测试项目
      • 2.2.1 pom.xml
      • 2.2.2 配置文件添加参数
      • 2.2.3 创建测试 Controller 类
      • 2.2.4 JVM 启动参数添加启动参数

1 Apollo

1.1 简介

由于 Apollo 概念比较多,刚开始使用比较复杂,最好先过一遍概念再动手实践尝试使用。

1.1.1 背景

随着程序功能的日益复杂,程序的配置日益增多,各种功能的开关、参数的配置、服务器的地址……对程序配置的期望值也越来越高,配置修改后实时生效,灰度发布,分环境、分集群管理配置,完善的权限、审核机制…… 在这样的大环境下,传统的通过配置文件、数据库等方式已经越来越无法满足开发人员对配置管理的需求。因此 Apollo 配置中心应运而生!

1.1.2 简介

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

1.1.3 特点

特点:

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

1.2 基础模型

如下即是 Apollo 的基础模型:

  • 用户在配置中心对配置进行修改并发布
  • 配置中心通知Apollo客户端有配置更新
  • Apollo客户端从配置中心拉取最新的配置、更新本地配置并通知到应用

在这里插入图片描述

1.3 Apollo 四个维度

Apollo支持4个维度管理Key-Value格式的配置:

  • application (应用)
  • environment (环境)
  • cluster (集群)
  • namespace (命名空间)

1.3.1 application

Apollo 客户端在运行时需要知道当前应用是谁,从而可以根据不同的应用来获取对应应用的配置。
每个应用都需要有唯一的身份标识,可以在代码中配置 app.id 参数来标识当前应用,Apollo 会根据此指来辨别当前应用。

1.3.2 environment

在实际开发中,我们的应用经常要部署在不同的环境中,一般情况下分为开发、测试、生产等等不同环境,不同环境中的配置也是不同的,在 Apollo 中默认提供了四种环境:

  • FAT(Feature Acceptance Test):功能测试环境
  • UAT(User Acceptance Test):集成测试环境
  • DEV(Develop):开发环境
  • PRO(Produce):生产环境

在程序中如果想指定使用哪个环境,可以配置变量 env 的值为对应环境名称即可。

1.3.3 cluster

一个应用下不同实例的分组,比如典型的可以按照数据中心分,把上海机房的应用实例分为一个集群,把北京机房的应用实例分为另一个集群。
对不同的集群,同一个配置可以有不一样的值,比如说上面所指的两个北京、上海两个机房设置两个集群,两个集群中都有 mysql 配置参数,其中参数中配置的地址是不一样的。

1.3.4 namespace

一个应用中不同配置的分组,可以简单地把 namespace 类比为不同的配置文件,不同类型的配置存放在不同的文件中,如数据库配置文件,RPC 配置文件,应用自身的配置文件等。

熟悉 SpringBoot 的都知道,SpringBoot 项目都有一个默认配置文件 application.yml,如果还想用多个配置,可以创建多个配置文件来存放不同的配置信息,通过指定 spring.profiles.active 参数指定应用不同的配置文件。这里的 namespace 概念与其类似,将不同的配置放到不同的配置 namespace 中。

Namespace 分为两种权限,分别为:

  • public(公共的): public权限的 Namespace,能被任何应用获取。
  • private(私有的): 只能被所属的应用获取到。一个应用尝试获取其它应用 private 的 NamespaceApollo 会报 404 异常。

Namespace 分为三种类型,分别为:

  • 私有类型: 私有类型的 Namespace 具有 private 权限。例如 application Namespace 为私有类型。
  • 公共类型: 公共类型的 Namespace 具有 public 权限。公共类型的N amespace 相当于游离于应用之外的配置,且通过 Namespace 的名称去标识公共 Namespace,所以公共的 Namespace 的名称必须全局唯一。
  • 关联类型(继承类型): 关联类型又可称为继承类型,关联类型具有 private 权限。关联类型的 Namespace 继承于公共类型的 Namespace,将里面的配置全部继承,并且可以用于覆盖公共 Namespace 的某些配置。

1.4 本地缓存

Apollo 客户端会把从服务端获取到的配置在本地文件系统缓存一份,用于在遇到服务不可用,或网络不通的时候,依然能从本地恢复配置,不影响应用正常运行。

本地缓存路径默认位于以下路径,所以请确保/opt/data或C:\opt\data\目录存在,且应用有读写权限。

  • Mac/Linux: /opt/data/{appId}/config-cache
  • Windows: C:\opt\data{appId}\config-cache

本地配置文件会以下面的文件名格式放置于本地缓存路径下:{appId}+{cluster}+{namespace}.properties

1.5 客户端设计

1.5.1 客服端拉取原理

图片
上图简要描述了Apollo客户端的实现原理

  • 客户端和服务端保持了一个长连接,从而能第一时间获得配置更新的推送。
  • 客户端还会定时从 Apollo 配置中心服务端拉取应用的最新配置。
    • 这是一个 fallback 机制,为了防止推送机制失效导致配置不更新
    • 客户端定时拉取会上报本地版本,所以一般情况下,对于定时拉取的操作,服务端都会返回 304 - Not Modified
    • 定时频率默认为每 5 分钟拉取一次,客户端也可以通过在运行时指定 apollo.refreshInterval 来覆盖,单位为分钟。
  • 客户端从 Apollo 配置中心服务端获取到应用的最新配置后,会保存在内存中。
  • 客户端会把从服务端获取到的配置在本地文件系统缓存一份,在遇到服务不可用,或网络不通的时候,依然能从本地恢复配置。
  • 应用程序从 Apollo 客户端获取最新的配置、订阅配置更新通知。

1.5.2 配置更新推送实现

前面提到了 Apollo 客户端和服务端保持了一个长连接,从而能第一时间获得配置更新的推送。长连接实际上我们是通过 Http Long Polling 实现的,具体而言:

  • 客户端发起一个 Http 请求到服务端
  • 服务端会保持住这个连接 60 秒
    • 如果在 60 秒内有客户端关心的配置变化,被保持住的客户端请求会立即返回,并告知客户端有配置变化的 namespace 信息,客户端会据此拉取对应 namespace 的最新配置
    • 如果在 60 秒内没有客户端关心的配置变化,那么会返回 Http 状态码 304 给客户端
  • 客户端在收到服务端请求后会立即重新发起连接,回到第一步
  • 考虑到会有数万客户端向服务端发起长连,在服务端我们使用了 async servlet(Spring DeferredResult) 来服务 Http Long Polling 请求。

1.6 总体设计

图片
上图简要描述了Apollo的总体设计,我们可以从下往上看:

  • Config Service 提供配置的读取、推送等功能,服务对象是 Apollo 客户端
  • Admin Service 提供配置的修改、发布等功能,服务对象是 Apollo Portal(管理界面)
  • Config ServiceAdmin 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 ServiceEurekaMeta Server 三个逻辑角色部署在同一个 JVM 进程中

1.7 可用性考虑

配置中心作为基础服务,可用性要求非常高,下面的表格描述了不同场景下Apollo的可用性:

场景影响降级原因
某台 config service 下线无影响Config service无状态,客户端重连其它config service
所有 config service 下线客户端无法读取最新配置,Portal无影响客户端重启时,可以读取本地缓存配置文件
某台 admin service 下线无影响Admin service无状态,Portal重连其它 admin service
所有 admin service 下线客户端无影响,portal无法更新配置
某台 portal 下线无影响Portal域名通过slb绑定多台服务器,重试后指向可用的服务器
全部 portal 下线客户端无影响,portal无法更新配置
某个数据中心下线无影响多数据中心部署,数据完全同步,Meta Server/Portal 域名通过 slb 自动切换到其它存活的数据中心

2 操作使用

创建一个 Apollo 的客户端项目,引用 Apollo 来实现配置动态更新,不过在此之前我们需要提前进入 Apollo Portal 界面,在里面提前创建一个项目并在其配置一个参数,方便后续客户端引入该配置参数,测试是否能动态变化。

2.1 配置Apollo

2.1.1 登录 Apollo

默认用户名:apollo
密 码:admin

2.1.2 修改与增加部门数据

在登录后创建项目时,选择部门默认只能选择 Apollo 自带的 测试部门1与测试部门2两个选项。
图片
开始这真让人迷糊,原来 Apoloo 没有修改或新增部门信息的管理节目,只能通过修改数据库,来新增或者修改数据,这里打开 Portal 对月的数据库中的表 ApolloPortalDB 修改 keyorganizationsvalue 的 json 数据,改成自己对于的部门信息。
在这里插入图片描述

2.1.3 创建一个项目

修改完数据库部门信息后,重新登录 Apollo Portal,然后创建项目,这时候选择部门可以看到已经变成我们自己修改后的部门信息了,选择我们自定义部门,然后设置应用 ID 为 apollo-test,应用名为 apollo-demo
图片

创建完成后进入配置管理界面
图片

2.1.4 创建一个配置参数

创建一个配置参数,方便后续 Apollo 客户端项目引入该参数,进行动态配置测试。
图片
设置 key 为 test value 为 123456 然后设置一个备注,保存。
图片
创建完成后可以看到配置管理节目新增了一条配置
图片
接下来我们将此配置通过发布按钮,进行发布。
在这里插入图片描述

2.2 创建客户端测试项目

这里创建一个 SpringBoot 项目,引入 Apollo 客户端来来实现与 Apollo 配置中心服务端交互。

2.2.1 pom.xml

 <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>2.1.8.RELEASE</version>
  </parent>


    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.ctrip.framework.apollo</groupId>
            <artifactId>apollo-client</artifactId>
            <version>1.4.0</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

2.2.2 配置文件添加参数

application.yml 配置文件中添加下面参数,这里简单介绍下 Apollo 参数作用:

  • apollo.metaApollo 配置中心地址。
  • apollo.cluster: 指定使用某个集群下的配置。
  • apollo.bootstrap.enabled: 是否开启 Apollo。
  • apollo.bootstrap.namespaces : 指定使用哪个 Namespace 的配置,默认 application。
  • apollo.cacheDir=/opt/data/some-cache-dir: 为了防止配置中心无法连接等问题,Apollo 会自动将配置本地缓存一份。
  • apollo.autoUpdateInjectedSpringPropertiesSpring应用通常会使用 Placeholder 来注入配置,如${someKey:someDefaultValue},冒号前面的是 key,冒号后面的是默认值。如果想关闭 placeholder 在运行时自动更新功能,可以设置为 false。
  • apollo.bootstrap.eagerLoad.enabled : 将 Apollo 加载提到初始化日志系统之前,如果设置为 false,那么将打印出 Apollo 的日志信息,但是由于打印 Apollo 日志信息需要日志先启动,启动后无法对日志配置进行修改,所以 Apollo 不能管理应用的日志配置,如果设置为 true,那么 Apollo 可以管理日志的配置,但是不能打印出 Apollo 的日志信息。
#应用配置
server:
  port: 8080
spring:
  application:
    name: apollo-demo

#Apollo 配置
app:
  id: apollo-test                            #应用ID
apollo:
  cacheDir: /opt/data/                       #配置本地配置缓存目录
  cluster: default                           #指定使用哪个集群的配置
  meta: http://192.168.2.11:30002            #DEV环境配置中心地址
  autoUpdateInjectedSpringProperties: true   #是否开启 Spring 参数自动更新
  bootstrap:                                
    enabled: true                            #是否开启 Apollo
    namespaces: application                  #设置 Namespace
    eagerLoad:
      enabled: false                         #将 Apollo 加载提到初始化日志系统之前

2.2.3 创建测试 Controller 类

写一个 Controller 类来输出 test 变量的值,使用了 Spring 的 @Value 注解,用于读取配置文件中的变量的值,这里来测试该值,项目启动后读取到的变量的值是设置在 application 配置文件中的默认值,还是远程 Apollo 中的值,如果是 Apollo 中配置的值,那么再测试在 Apollo 配置中心中改变该变量的值后,这里是否会产生变化。

@RestController
public class TestController {

    @Value("${test:默认值}")
    private String test;

    @GetMapping("/test")
    public String test(){
        return "test的值为:" + test;
    }
}

SpringBoot 项目启动类

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}

2.2.4 JVM 启动参数添加启动参数

如果 Apollo 是部署在 Kubernetes 环境中的,JVM 参数中必须添加两个变量:

  • env: 应用使用 Apollo 哪个环境,例如设置为 DEV 就是指定使用开发环境,如果设置为 PRO 就是制定使用生产环境。
  • apollo.configService: 指定配置中心的地址,跳过 meta 的配置,在测试时指定 meta 地址无效果。如果 Apollo 是部署在 Kubernetes 中,则必须设置该参数为配置中心地址,如果 Apollo 不是在 Kubernetes 环境中,可以不设置此参数,只设置 meta 参数即可。一般情况下,configServicemeta 值一致。
    如果是在 Idea 中启动,可以配置启动参数,加上:
    -Dapollo.configService=http://192.168.2.11:30002 -Denv=DEV
    如果是 java 命令启动程序,需要 JVM 加上
    java -Dapollo.configService=http://192.168.2.11:30002 -Denv=DEV -jar apollo-demo.jar

注意:上面 env 指定的环境,要和 apollo.meta 指定 Config 地址的环境一致,例如 -Denv=DEV 即使用开发环境,那么apollo.meta=http://xxx.xxx.xxx:8080 这个url 的 Config 也是开发环境下的配置中心服务,而不能是 PRO 或者其它环境下的配置中心。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

海外媒体宣发:新闻媒体发稿引爆社交媒体的7个诀窍-华媒舍

社交媒体的崛起已经改变了新闻媒体的传播方式。从Facebook到Twitter&#xff0c;从Instagram到LinkedIn&#xff0c;社交媒体平台为新闻媒体提供了一个巨大且潜力无限的受众群体。要在这个竞争激烈的环境中引爆社交媒体&#xff0c;需要一些技巧和诀窍。在本篇文章中&#xff0…

【CSS】保持元素宽高比

保持元素的宽高比&#xff0c;在视频或图片展示类页面是一个重要功能。 本文介绍其常规的实现方法。 实现效果 当浏览器视口发生变化时&#xff0c;元素的尺寸随之变化&#xff0c;且宽高比不变。 代码实现 我们用最简单的元素结构来演示&#xff0c;实现宽高比为4&#xf…

WorkPlus卓越的即时通讯工具,助力企业提升工作效率

在当今快节奏的商业环境中&#xff0c;高效沟通和协作是企业成功的关键。而即时通讯作为实现高效沟通的利器&#xff0c;成为了现代企业不可或缺的一部分。作为一款领先的即时通讯工具&#xff0c;WorkPlus以其卓越的性能和独特的功能&#xff0c;助力企业打造高效沟通和协作的…

初始化数组

一、静态初始化格式&#xff1a; 数据类型[ ] 数组名 new 数据类型[ ]{元素1&#xff0c;元素2&#xff0c;元素3......} 等号后面的new 数据类型可以省略 注意&#xff1a;什么类型的数组只能存放什么类型的数据 直接打印a或b会显示其地址 数组的元素个数&#xff1a;arr…

Android Studio 如何设置中文

Android Studio 是一个为 Adndroid 平台开发程序的集成开发环境&#xff08;IDE&#xff09;。 如何安装中文插件 在 Jetbrains 家族的插件市场上&#xff0c;是能够搜到语言包插件的&#xff0c;正常情况下安装之后只需要重启即可享受中文界面&#xff0c;可AndroidStudio 中…

SOLID 原则

单一功能原则 单一功能原则&#xff08;Single responsibility principle&#xff09;规定每个类都应该有一个单一的功能&#xff0c;并且该功能应该由这个类完全封装起来。所有它的&#xff08;这个类的&#xff09;服务都应该严密的和该功能平行&#xff08;功能平行&#x…

ospf-gre隧道小练习

全网可达,R5路由表没有其他路由器的路由条目 注:每个路由器都添加了自己的环回,如R1就是1.1.1.1 R1可以分别ping通与R2,R3,R4之间的隧道 R1路由表上有所有路由器环回的路由条目 R5路由表上没有其他路由器的路由条目 实现代码: 首先将各个接口IP配好 边上3个路由器:[R6][R7][R…

Linux-命名管道

文章目录 前言一、命名管道接口函数介绍二、使用步骤 前言 上章内容&#xff0c;我们介绍与使用了管道。上章内容所讲的&#xff0c;是通过pipe接口函数让操作系统给我们申请匿名管道进行进程间通信。 并且这种进程间通信一般只适用于父子进程之间&#xff0c;那么对于两个没有…

mysql原理--redo日志1

1.redo日志是个啥 我们知道 InnoDB 存储引擎是以页为单位来管理存储空间的&#xff0c;我们进行的增删改查操作其实本质上都是在访问页面&#xff08;包括读页面、写页面、创建新页面等操作&#xff09;。我们前边唠叨 Buffer Pool 的时候说过&#xff0c;在真正访问页面之前&a…

RH850P1X芯片学习笔记-Flash Memory

文章目录 FeaturesClock Supply Block DiagramFlash SizeMemory ConfigurationRegistersRegister Base AddressList of RegistersRegister Reset Condition 与Flash Memory相关的操作模式Functional OverviewOption BytesOPBT0 — Option Byte 0OPBT1 — Option Byte 1OPBT2 —…

WEB 3D技术 three.js 点光源

本文的话 我们来设置一下点光源 点光源其实最直观的就是可以做萤火虫 也可以做星光 点点的效果 我们可以直接在官网中搜索 Pointlight 大家可以在官网这里看一下 其实 SpotLight 聚关灯中的属性 Pointlight 点光源也有的 我们先编写代码如下 import ./style.css import * a…

盘点一个AI解答疑难代码的问题

点击上方“Python爬虫与数据挖掘”&#xff0c;进行关注 回复“书籍”即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 湖水无端浸白云&#xff0c;故人书断孤鸿没。 大家好&#xff0c;我是皮皮。 一、前言 前几天在Python白银交流群【上海新年人】问了一个Pandas代码解读…

Linux前后端项目部署

目录 1.jdk&tomcat安装 配置并且测试jdk安装 修改tomcat 配置文件 登入tomcat 发布 安装mysql 导入sql数据 发布项目war包 redis安装 nginx安装 配置nginx域名映射 部署前端项目 centos 7的服务安装 安装jdk 安装tomcat 安装Mysql 安装redis 安装nginx 前后…

linux安装minio

目录 1、服务器创建minio文件 2、进入minio下的bin下 3、授予服务端和客户端文件可执行权限 4、设置用户名和密码 5、启动minio服务 6、查看minio版本 ​7、访问minio控制台 1、服务器创建minio文件 # 创建minio应用程序目录 mkdir -p /opt/minio/bin # 创建minio数据目…

虹软人脸识别白屏

1.修改jdk为1.8 2.编译版本ndk修改 ndk {abiFilters armeabi-v7a, arm64-v8a} 3.local.properties增加ndk路径 ndk.dirH\:\\Android\\SDK\\ndk\\21.1.6352462 4.最重要的一步:检查依赖库是否存在前一定要先检查有么有读取本地文件权限,下面的代码即使是放到点击事件的回调…

码农的周末日常---一月的第二周

上周总结 开发任务按规划完成 参加新版本的需求分析会议&#xff0c;基本了解新功能的实现 开始阅读一本新书《Head first Java》 2024/01/13 天气晴 温度适宜 蓝蓝的天&#xff0c;暖暖的阳光&#xff0c;不晒鞋可惜了&#xff0c;赶紧掏出我那正宗莆田和anta晒…

python爬虫小练习——爬取豆瓣电影top250

爬取豆瓣电影top250 需求分析 将爬取的数据导入到表格中&#xff0c;方便人为查看。 实现方法 三大功能 1&#xff0c;下载所有网页内容。 2&#xff0c;处理网页中的内容提取自己想要的数据 3&#xff0c;导入到表格中 分析网站结构需要提取的内容 代码 import requests…

Black Hole Alliance发展蓝图:从数字化到生态建设

Black Hole Alliance 以WEB3.0生态产业为核心&#xff0c;以强大的技术及社区为依托&#xff0c;确立了 " 区块链 生态产业 AI与Web3融合​ " 的底层架构&#xff0c;将区块链技术与全球生态产业有机融合&#xff0c;以价值交换网络为切入点及立足点&#xff0c;链…

NLP论文阅读记录 - 2021 | WOS 抽象文本摘要:使用词义消歧和语义内容泛化增强序列到序列模型

文章目录 前言0、论文摘要一、Introduction二.前提三.本文方法3.1 总结为两阶段学习3.1.1 基础系统 3.2 重构文本摘要 四 实验效果4.1数据集4.2 对比模型4.3实施细节4.4评估指标4.5 实验结果4.6 细粒度分析 五 总结思考 前言 Abstractive Text Summarization: Enhancing Sequen…

Spring boot - Task Execution and Scheduling @Async

SpringBoot的任务执行器 Spring Boot通过auto-configuration机制自动创建了任务执行器Task Execution&#xff0c;因此在SpringBoot项目中&#xff0c;你不需要任何配置、也不需要自己创建Task Execution就可以直接使用它。 Spring Boot通过auto-configuration机制创建的任务…