阿里云Kubernetes SpringCloud 实践进行时(2): 分布式配置管理

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 讲述了在阿里云Kubernetes容器服务基础之上,如何快速搭建基于Spring Cloud的微服务架构中的基础设施之分布式配置管理系统Spring Cloud Config。

简介

为了更好地支撑日益增长的庞大业务量,我们常常需要把服务进行整合、拆分,使我们的服务不仅能通过集群部署抵挡流量的冲击,又能根据业务在其上进行灵活的扩展。随着分布式的普及、服务的快速增长与云计算技术的进步,微服务架构也因其特有的优势而备受关注。微服务架构的本质,是把整体的业务拆分成很多有特定明确功能的服务,通过很多分散的小服务之间的配合,去解决更大,更复杂的问题。对被拆分后的服务进行分类和管理,彼此之间使用统一的接口来进行交互。

而随着服务数量的剧增,这些服务所依赖的配置文件则需要实现统一管理并且能够实时更新;否则对于分布式环境中多达上千、上百的服务实例来说,单单修改配置这项目工作就会耗费程序员很多时间和精力,甚至更为糟糕的是可能会带来配置不一致、错误的灾难。

本系列讲述了在阿里云Kubernetes容器服务基础之上,如何快速搭建基于Spring Cloud的微服务架构中的基础设施:

本文是系列中的第二篇,着重介绍分布式配置管理系统Spring Cloud Config。

Spring Cloud Config

为了应对分布式系统带来的这些复杂配置管理问题,Spring Cloud Config从以下几个角度提供必要的功能:

  • 集中管理的需求:一个使用微服务架构的应用系统可能会包括成百上千个微服务,因此集中管理很有必要;
  • 不同环境不同配置:例如数据源在不同的环境(开发,测试,生产)是不同的;
  • 运行期间可以动态调整。例如根据各个微服务的负载状况,动态调整数据源连接池大小或者熔断阀值,并且调整时不停止微服务;
  • 配置修改后可以自动更新;

针对分布式系统的外部配置,Spring Cloud Config主要提供了服务器端和客户端的支持,包括Config Server和Config Client两部分。由于Config Server和Config Client都实现了对Spring Environment和PropertySource抽象的映射,因此Spring Cloud Config很适合基于Spring Boot的应用程序。

  • Config Server: 是一个看横向扩展的,集中式的配置服务器,它用于集中管理应用程序各个环境下配置,默认使用Git存储配置内容。
  • Config Client: 是一个Config Server的客户端,用于操作存储在Config Server上的配置属性,所有微服务都指向Config Server,启动的时候会请求它获取所需要的配置属性,然后缓存这些属性以提高性能。

刷新配置机制

尽管使用/refresh 端点手动刷新配置,但是如果所有微服务节点的配置都需要手动去刷新的话,那必然是一个繁琐的工作,并且随着系统的不断扩张,会变得越来越难以维护。因此,实现配置的自动刷新是很有必要的,Spring Cloud Bus实现配置的自动刷新机制是一旦接收到RefreshEvent,就会启动ContextRefresher.refresh。

Spring Cloud Bus提供了批量刷新配置的机制,它使用轻量级的消息代理(例如RabbitMQ、Kafka等)连接分布式系统的节点,这样就可以通过Spring Cloud Bus广播配置的变化或者其他的管理指令。

图片.png

下面讲述一下在阿里云Kubernetes容器服务基础之上,如何快速搭建一套分布式配置管理系统。

准备Kubernetes环境

阿里云容器服务Kubernetes 1.9.3目前已经上线,可以通过容器服务管理控制台非常方便地快速创建 Kubernetes 集群。具体过程可以参考创建Kubernetes集群

体验通过服务目录简便部署RabbitMQ

搭建RabbitMQ

以RabbitMQ为例,点击左侧的服务目录,在右侧选中rabbitmq-broker

图片.png

点击参数, 可以通过修改参数配置进行定制化,例如指定服务名称等。此处注意一点的是,为了后面Config Client端能远程访问RabbitMQ,服务网络类型指定为LoadBalancer。修改之后,在右侧点击创建按钮。

图片.png

几分钟之后,一个RabbitMQ代理就可以安装完毕。

注册RabbitMQ代理

安装完成之后,首先需要通过kubectl命令注册RabbitMQ代理。

建立一个名为rabbitmq-broker.yaml的文件,内容如下:

apiVersion: servicecatalog.k8s.io/v1beta1
kind: ClusterServiceBroker
metadata:
  name: rabbitmq-broker
spec:
  url: http://aliacs-rabbitmq-broker-rabbitmq-broker.catalog.svc.cluster.local

执行kubectl create -f rabbitmq-broker.yaml,注册RabbitMQ代理。

其中:

  • name项可以根据需要进行修改;
  • url项为上述RabbitMQ代理的地址,格式为:{Kubernetes Service名称}.{Kubernetes 命名空间名称}.svc.cluster.local;
  • {Kubernetes 命名空间名称} 默认为catalog,也就是说从上述页面点击创建RabbitMQ代理对应的命名空间名称为catalog;
  • {Kubernetes Service名称}可以通过kubectl get svc -n catalog来获取;

图片.png

执行如下命令可以查看broker状态、service plan服务计划等,如下:

图片.png

创建RabbitMQ实例

服务目录中的RabbitMQ Broker提供了多种配置参数,来支持不同实例类型的创建。

建立一个名为rabbitmq-instance.yaml的文件,内容如下:

apiVersion: servicecatalog.k8s.io/v1beta1
kind: ServiceInstance
metadata:
  name: rabbitmq-instance
  namespace: catalog
spec:
  clusterServiceClassExternalName: rabbitmq-service
  clusterServicePlanExternalName: self-define
  Parameters: 
    PersistenceEnabled: false
    ServiceType: LoadBalancer

其中:

  • spec.clusterServicePlanExternalName指定为self-define,意味着可以进行定制化配置;
  • spec.Parameters.PersistenceEnabled指定为false,意味着不进行序列化存储;
  • spec.Parameters.ServiceType指定为LoadBalancer,意味着服务类型为LoadBalancer;

执行命令kubectl create -f rabbitmq-instance.yaml,创建实例。

创建集群角色

首先,建立一个名为rabbitmq-clusterrole.yaml的文件,内容如下:

kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: resources-holder-rabbitmq
rules:
- apiGroups: [""] # "" indicates the core API group
  resources: ["secrets","services","endpoints","nodes"]
  verbs: ["get", "watch", "list","create", "update", "patch", "delete"]

执行命令kubectl create -f rabbitmq-clusterrole.yaml,创建集群角色。

创建集群角色绑定

其次,建立一个名为rabbitmq-clusterrolebinding.yaml的文件,内容如下:

kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: read-resources-rabbitmq
subjects:
- kind: User
  name: system:serviceaccount:catalog:default
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: resources-holder-rabbitmq
  apiGroup: rbac.authorization.k8s.io

执行命令kubectl create -f rabbitmq-clusterrolebinding.yaml,创建集群角色绑定。

创建服务绑定

其次,建立一个名为rabbitmq-binding.yaml的文件,内容如下:

apiVersion: servicecatalog.k8s.io/v1beta1
kind: ServiceBinding
metadata:
  name: rabbitmq-binding
  namespace: catalog
spec:
  instanceRef:
    name: rabbitmq-instance
  secretName: rabbitmq-instance-credentials

执行命令kubectl create -f rabbitmq-binding.yaml,创建服务绑定。

至此,RabbitMQ服务实例已经创建并且绑定信息可以从rabbitmq-instance-credentials中获取到。

$ kubectl get secret -n catalog
NAME                            TYPE                                  DATA      AGE
rabbitmq-instance-credentials      Opaque                                6         2m

点击左侧的服务,在右侧选中刚创建的RabbitMQ服务,可以查看到对应的Web地址,如下:

图片.png

体验通过应用目录简便部署Config Server

创建Spring Config Server

点击左侧的应用目录,在右侧选中ack-springcloud-configserver,如下:

图片.png

点击参数, 可以通过修改参数配置进行定制化,重点注意spring.cloud.config.server.git部分的配置信息。

  • 指定global.rabbitmq.host为访问上述创建的RabbitMQ服务的地址;
  • 指定global.rabbitmq.username为访问上述创建的RabbitMQ服务的访问用户;
  • 指定global.rabbitmq.password为访问上述创建的RabbitMQ服务的访问用户密码;
  • 指定spring.cloud.config.server.git.uri为存放配置属性文件的git仓库地址,如https://github.com/spring-cloud-samples/config-repo
  • 指定spring.cloud.config.server.git.searchPaths为配置仓库路径,以逗号隔开
  • 指定spring.cloud.config.label为配置仓库的分支
  • 指定spring.cloud.config.server.git.username为访问git仓库的用户名
  • 指定spring.cloud.config.server.git.password为访问git仓库的用户密码

修改之后,在右侧选择对应的集群、命名空间,指定发布名称,然后点击部署。

图片.png

几分钟之后,一个挂载了RabbitMQ的Spring Config Server实例就可以创建出来。

体验Spring Config Server

点击左侧的服务,在右侧点击刚创建的Spring Config Server服务提供的访问地址,

图片.png

如果访问http://{public-ip}:8888/foo/development,可以看到如下类似的内容,则证明Spring Config Server已正常启动。

图片.png

自动同步刷新

Spring Cloud Bus提供了批量刷新配置的机制,它使用轻量级的消息代理(例如RabbitMQ、Kafka等)连接分布式系统的节点,这样就可以通过Spring Cloud Bus广播配置的变化或者其他的管理指令。

一旦某个Config Server上 /refresh 被触发,则该Config Server会向Spring Cloud Bus(本例中使用了RabbitMQ)发布RefreshRemoteApplicationEvent事件。
与此同时,其他的Config Server和Config Client会接收到该事件进行刷新,执行如下逻辑:
图片.png

总结

我们可以利用阿里云Kubernetes容器服务,快速搭建一套分布式配置管理系统,应对分布式系统带来的这些复杂配置管理问题。欢迎大家使用阿里云上的容器服务,快速搭建一套基于Spring Cloud的分布式配置管理系统Config Server,比较简单地集成到自己项目的微服务开发中。

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
1月前
|
存储 运维 安全
盘古分布式存储系统的稳定性实践
本文介绍了阿里云飞天盘古分布式存储系统的稳定性实践。盘古作为阿里云的核心组件,支撑了阿里巴巴集团的众多业务,确保数据高可靠性、系统高可用性和安全生产运维是其关键目标。文章详细探讨了数据不丢不错、系统高可用性的实现方法,以及通过故障演练、自动化发布和健康检查等手段保障生产安全。总结指出,稳定性是一项系统工程,需要持续迭代演进,盘古经过十年以上的线上锤炼,积累了丰富的实践经验。
|
1月前
|
Java 关系型数据库 数据库
微服务SpringCloud分布式事务之Seata
SpringCloud+SpringCloudAlibaba的Seata实现分布式事务,步骤超详细,附带视频教程
77 1
|
1月前
|
数据采集 人工智能 分布式计算
MaxFrame:链接大数据与AI的高效分布式计算框架深度评测与实践!
阿里云推出的MaxFrame是链接大数据与AI的分布式Python计算框架,提供类似Pandas的操作接口和分布式处理能力。本文从部署、功能验证到实际场景全面评测MaxFrame,涵盖分布式Pandas操作、大语言模型数据预处理及企业级应用。结果显示,MaxFrame在处理大规模数据时性能显著提升,代码兼容性强,适合从数据清洗到训练数据生成的全链路场景...
96 5
MaxFrame:链接大数据与AI的高效分布式计算框架深度评测与实践!
|
2月前
|
机器学习/深度学习 分布式计算 数据挖掘
MaxFrame 性能评测:阿里云MaxCompute上的分布式Pandas引擎
MaxFrame是一款兼容Pandas API的分布式数据分析工具,基于MaxCompute平台,极大提升了大规模数据处理效率。其核心优势在于结合了Pandas的易用性和MaxCompute的分布式计算能力,无需学习新编程模型即可处理海量数据。性能测试显示,在涉及`groupby`和`merge`等复杂操作时,MaxFrame相比本地Pandas有显著性能提升,最高可达9倍。适用于大规模数据分析、数据清洗、预处理及机器学习特征工程等场景。尽管存在网络延迟和资源消耗等问题,MaxFrame仍是处理TB级甚至PB级数据的理想选择。
69 4
|
2月前
|
存储 SpringCloudAlibaba Java
【SpringCloud Alibaba系列】一文全面解析Zookeeper安装、常用命令、JavaAPI操作、Watch事件监听、分布式锁、集群搭建、核心理论
一文全面解析Zookeeper安装、常用命令、JavaAPI操作、Watch事件监听、分布式锁、集群搭建、核心理论。
【SpringCloud Alibaba系列】一文全面解析Zookeeper安装、常用命令、JavaAPI操作、Watch事件监听、分布式锁、集群搭建、核心理论
|
2月前
|
分布式计算 大数据 数据处理
技术评测:MaxCompute MaxFrame——阿里云自研分布式计算框架的Python编程接口
随着大数据和人工智能技术的发展,数据处理的需求日益增长。阿里云推出的MaxCompute MaxFrame(简称“MaxFrame”)是一个专为Python开发者设计的分布式计算框架,它不仅支持Python编程接口,还能直接利用MaxCompute的云原生大数据计算资源和服务。本文将通过一系列最佳实践测评,探讨MaxFrame在分布式Pandas处理以及大语言模型数据处理场景中的表现,并分析其在实际工作中的应用潜力。
116 2
|
2月前
|
人工智能 运维 监控
阿里云ACK容器服务生产级可观测体系建设实践
本文整理自2024云栖大会冯诗淳(花名:行疾)的演讲,介绍了阿里云容器服务团队在生产级可观测体系建设方面的实践。冯诗淳详细阐述了容器化架构带来的挑战及解决方案,强调了可观测性对于构建稳健运维体系的重要性。文中提到,阿里云作为亚洲唯一蝉联全球领导者的容器管理平台,其可观测能力在多项关键评测中表现优异,支持AI、容器网络、存储等多个场景的高级容器可观测能力。此外,还介绍了阿里云容器服务在多云管理、成本优化等方面的最新进展,以及即将推出的ACK AI助手2.0,旨在通过智能引擎和专家诊断经验,简化异常数据查找,缩短故障响应时间。
阿里云ACK容器服务生产级可观测体系建设实践
|
2月前
|
运维 Kubernetes 调度
阿里云容器服务 ACK One 分布式云容器企业落地实践
阿里云容器服务ACK提供强大的产品能力,支持弹性、调度、可观测、成本治理和安全合规。针对拥有IDC或三方资源的企业,ACK One分布式云容器平台能够有效解决资源管理、多云多集群管理及边缘计算等挑战,实现云上云下统一管理,提升业务效率与稳定性。
|
2月前
|
机器学习/深度学习 存储 运维
分布式机器学习系统:设计原理、优化策略与实践经验
本文详细探讨了分布式机器学习系统的发展现状与挑战,重点分析了数据并行、模型并行等核心训练范式,以及参数服务器、优化器等关键组件的设计与实现。文章还深入讨论了混合精度训练、梯度累积、ZeRO优化器等高级特性,旨在提供一套全面的技术解决方案,以应对超大规模模型训练中的计算、存储及通信挑战。
122 4
|
3月前
|
NoSQL Java 数据处理
基于Redis海量数据场景分布式ID架构实践
【11月更文挑战第30天】在现代分布式系统中,生成全局唯一的ID是一个常见且重要的需求。在微服务架构中,各个服务可能需要生成唯一标识符,如用户ID、订单ID等。传统的自增ID已经无法满足在集群环境下保持唯一性的要求,而分布式ID解决方案能够确保即使在多个实例间也能生成全局唯一的标识符。本文将深入探讨如何利用Redis实现分布式ID生成,并通过Java语言展示多个示例,同时分析每个实践方案的优缺点。
102 8

相关产品

  • 容器服务Kubernetes版