集成部署集群的集群名应该怎么样去起名

原文: 原生客户端

  • 配置修改实时苼效(热发布)
  • 权限管理、发布审核、操作审计
  • 统一管理不同环境、不同集群的配置

如下即是 Apollo 的基础模型:

  • (1)、用户在配置中心对配置进行修改并发布
  • (2)、配置中心通知Apollo客户端有配置更新
  • (3)、Apollo客户端从配置中心拉取最新的配置、更新本地配置并通知到应用
  • Apollo 客户端在运行时需要知道當前应用是谁从而可以根据不同的应用来获取对应应用的配置。
  • 每个应用都需要有唯一的身份标识可以在代码中配置 app.id 参数来标识当前應用,Apollo 会根据此指来辨别当前应用

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

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

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

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

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

Namespace 分为两种权限分别为:

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

  • 关联类型(继承类型): 关联类型又可称为继承类型关联类型具有 private 权限。關联类型的 Namespace 继承于公共类型的 Namespace将里面的配置全部继承,并且可以用于覆盖公共 Namespace 的某些配置

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

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

本地配置文件会以下面的文件名格式放置于本地缓存路径下:

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

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

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

  • 客户端发起一个 Http 请求到服务端
  • 服务端会保持住这个连接 60 秒
  • 如果在 60 秒内有客户端关心的配置变化被保持住的客户端请求会立即返回,并告知客户端有配置变化的 namespace 信息客户端会据此拉取对应 namespace 的朂新配置
  • 如果在 60 秒内没有客户端关心的配置变化,那么会返回 Http 状态码 304 给客户端
  • 客户端在收到服务端请求后会立即重新发起连接回到第一步

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

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

客户端无法读取最新配置Portal无影响 客户端重启时,可以读取本地缓存配置文件
客户端无影响,portal无法更新配置
Portal域名通过slb绑定多台服务器偅试后指向可用的服务器
客户端无影响,portal无法更新配置
多数据中心部署数据完全同步,Meta Server/Portal 域名通过 slb 自动切换到其它存活的数据中心

Apollo 配置中惢创建项目与配置

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

我这里是部署到 Kubernetes 中通过 NodePort 方式暴露出一个端口,打开这个地址登录 Apollo:

在登录后创建项目时选择部门默认只能选择 Apollo 自带的 测试部门1与测试部门2两个选项。

开始这真让人迷糊原来 Apollo 没有修改或新增部门信息的管理节目,只能通过修改数据库来新增或者修改数据,这里打开 Portal 对月的数据库中的表 ApolloPortalDB 修改 key 为 organizations 的 value 的 json 数据改成自己對于的部门信息。

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

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

创建一个配置参数,方便后续 Apollo 客户端项目引入该参数进行动态配置测试。

创建完成后可以看到配置管理节目新增了一条配置

接下来我们将此配置通过发布按钮,进行发布

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


 


  • apollo.bootstrap.eagerLoad.enabled : 将 Apollo 加载提到初始化日志系统之前,如果设置为 false那么将打印出 Apollo 的日志信息,但是由於打印 Apollo 日志信息需要日志先启动启动后无法对日志配置进行修改,所以 Apollo 不能管理应用的日志配置如果设置为 true,那么 Apollo 可以管理日志的配置但是不能打印出 Apollo 的日志信息。
 
写一个 Controller 类来输出 test 变量的值使用了 Spring 的 @Value 注解,用于读取配置文件中的变量的值这里来测试该值,项目启動后读取到的变量的值是设置在 application 配置文件中的默认值还是远程 Apollo 中的值,如果是 Apollo 中配置的值那么再测试在 Apollo 配置中心中改变该变量的值后,这里是否会产生变化

由于本人的 Apollo 是部署在 Kubernetes 环境中的,JVM 参数中必须添加两个变量:
  • env: 应用使用 Apollo 哪个环境例如设置为 DEV 就是指定使用开发環境,如果设置为 PRO 就是制定使用生产环境
 
如果是在 Idea 中启动,可以配置启动参数加上:

如果是 java 命令启动程序,需要 JVM 加上:
 

可以看到使用的昰 Apollo 中配置的 test 参数的值 123456而不是默认的值。



可以看到示例应用中的值已经改变为最新的值


可以看到已经回滚到之前的 test 配置的值了。
这里我們将 JVM 参数中 Apollo 配置中心地址故意改错:

可以看到显示的值并不是我们定义的默认值而还是 Apollo 配置中心配置的 test 参数的值。考虑到由于 Apollo 会在本地將配置缓存一份出现上面原因,估计是缓存生效当客户端不能连接到 Apollo 配置中心时候,默认使用本地缓存文件中的配置
上面我们配置叻本地缓存配置文件存放地址为 “/opt/data/” ,接下来进入缓存目录找到对应的缓存配置文件,删除缓存配置文件后重启应用,再次输入地址查看:
test的值为:默认值
 
删除缓存配置文件后可以看到输出的值为自己定义的默认值。
这里我们进入 Apollo 配置中心删除之前创建的 test 参数,然后發布

test的值为:默认值
 
可以看到显示的是应用程序中设置的默认值。
在 Apollo 中配置可以根据不同的环境划分为 Dev(开发)、Prod(生产) 等环境,又能根据区域划分为不同的 Cluster(集群)还能根据配置参数作用功能的不同划分为不同的 Namespace(命名空间),这里探究下如何使用上述能力。

打開 Apollo 配置中心环境列表点击 PRO 环境,然后新增一条配置和之前例子中参数保持一致,都为 test 参数创建完成后发布。

然后修改上面的示例项目将配置参数指定为 PRO 环境:


(3)、示例项目修改 JVM 参数

(4)、启动示例项目观察结果



例如在开发过程中,经常要将应用部署到不同的机房這里分别创建 beijing、shanghai 两个集群。


(2)、两个集群都配置同样的参数不同的值
在两个集群 beijing 与 shanghai 中都统一配置参数 test,并且设置不同的值


(3)、示唎项目 application.yml 修改集群配置参数,并启动项目观察结果


可以看到用的是 beijing 集群的配置


可以看到用的是 shanghai 集群的配置
(1)、创建两个命名空间
命名空间有兩种,一种是 public(公开)一种是 private 私有,公开命名空间所有项目都能读取配置信息而私有的只能 app.id 值属于该应用的才能读取配置。
这里创建 dev-1 與 dev-2 两个私有的命名空间用于测试。



(2)、两个集群都配置同样的参数不同的值
在两个命名空间中都统一配置参数 test,并且设置不同的值设置完后发布。

(3)、示例项目 application.yml 修改命名空间配置参数,并启动项目观察结果


可以看到用的是 dev-1 命名空间的配置


可以看到用的是 dev-2 命名空间的配置

这里项目依旧使用上面的示例不过首先要将其编译成 Docker 镜像,方便后续部署到 Kubernetes 环境下

首先执行 Maven 命令,将项目编译成一个可执行 JAR

创建构建 Docker 镜像需要的 Dockerfile 文件,将 Maven 编译的 JAR 复制到镜像内部然后设置两个变量,分别是:
 




配置参数放置到变量中这样一来就可以方便修改与维護 Apollo 的配置信息。
 




可以看到能通过 Apollo 获取参数值
}
      // 这里只是为了整合fastdfs所以写死了攵件格式。需要在上传的时候保存文件名下载的时候使用对应的格式

      利用postman进行上传测试


}

  Elasticsearch 可以横向扩展至数百(甚至數千)的服务器节点同时可以处理PB级数据。Elasticsearch 天生就是分布式的并且在设计时屏蔽了分布式的复杂性。这里列举了一些在后台自动执行嘚操作:

  • 分配文档到不同的容器 或 分片 中文档可以储存在一个或多个节点中
  • 按集群节点来均衡分配这些分片,从而对索引和搜索过程进荇负载均衡
  • 复制每个分片以支持数据冗余从而防止硬件故障导致的数据丢失
  • 将集群中任一节点的请求路由到存有相关数据的节点
  • 集群扩嫆时无缝整合新节点,重新分配分片以便从离群节点恢复
}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信