本文分享自华为云社区《如何利用动态配置中心在JavaAgent中实现微服务的多样化治理》,作者:华为云开源 。

一、前言

随着JavaAgent在微服务治理方面的广泛应用和发展,我们可以在运行时对微服务进行监控、管理和调整,以满足不同的业务需求和运行环境。然而,随着微服务架构的复杂性增加,管理和配置微服务的治理变得越来越困难,因此利用动态配置中心在JavaAgent中实现微服务多样化治理变得至关重要。

Sermant是基于Java字节码增强技术的无代理服务网格,支持通过动态配置实现微服务的多样化治理。以下是Sermant的微服务架构:

Sermant虽然不直接提供动态配置中心,但是Sermant基于不同的配置中心实现了动态配置功能,基于该功能Sermant不仅可以监听主流配置中心配置信息的修改、也可以针对不同的场景进行配置监听,例如:Sermant不仅可以监听服务的配置变更,还可以监听应用的全局配置变更。基于该功能可以更好的帮助开发人员和运维人员管理微服务治理的能力。

二、Sermant的动态配置模型

Sermant动态配置模型是一种基于分层模型设计的配置管理方案,它的核心组件包括Group和Key。Sermant通过不同的Group(分组信息)来对配置项进行隔离,使配置管理更具灵活性和可扩展性;同时,通过Key对配置项进行具体属性的标识,实现了对配置项的精准控制和高效维护。

在Sermant动态配置模型中,Group的数量不宜过多。Sermant动态配置模型中Group的实现是基于配置中心的数据模型,例如:Nacos的namespace,Nacos的namespace是用于实现租户隔离的,不宜过多,因此Sermant动态配置模型的Group数量也不宜过多。

与Group相比,Sermant动态配置模型允许创建多个Key,但单个实例订阅的Key不宜太多。这是因为在配置项的订阅和维护过程中,如果单个实例订阅的Key过多,可能会导致服务的性能出现问题,甚至引发配置更新不及时或者配置冲突的问题。因此,控制单个实例订阅的Key的数量是保证配置管理高效性和可用性的关键因素之一。

Sermant动态配置模型通过Group和Key的有机结合,实现了对复杂配置场景的全面覆盖和高效支撑。同时,通过控制Group和Key的数量,简化了配置项的订阅和更新流程,提高了系统的可用性和可维护性。

Sermant的动态配置模型如下图所示:

  • 基于 Zookeeper 的配置模型实现

Zookeeper采用树状的数据模型,会将数据信息保存在一个个数据节点上,这些节点被称为Znode,Znode是Zookeeper中最小数据单位,一个Znode可以有多个子节点。可以通过路径确定的一个唯一的Znode,如/zookeeper/key1。如下图所示:

Sermant的动态配置模型基于Zookeeper配置中心的实现方式如下所示:

Group(分组信息):Znode节点的父节点路径信息作为Group信息

Key(配置项名称):Znode节点的节点名称作为配置项的Key,节点数据作为具体的配置内容。

Znode节点可以通过不同的路径进行隔离,不同路径下可以存在节点名称相同的节点。保证Sermant通过不同的Group(分组信息)来对配置项进行隔离,同一个Group(分组信息)下可以有相同Key(配置项名称)。

  • 基于Nacos的配置模型实现

Nacos数据模型为层次模型,对于Nacos配置管理,通过Namespace、Group、Date ID能够定位到一个配置集。如下图所示:

Namespace(命名空间)主要用于不同环境的配置隔离,Group(配置分组)主要用于不同的项目或者应用,配置集可以包含了系统的各种配置信息,每个配置集的ID即Data Id。配置集中包含的一个个配置内容就是配置项。它代表了一个具体的可配置的参数与其值域,通常以key=value的形式存在

Sermant的动态配置模型基于Nacos配置中心的实现方式如下:

Group(分组信息):将Nacos的Namespace(命名空间)和配置分组(Group)组合起来作为Sermant的动态配置模型的分组信息。

Key(配置项名称):Nacos的配置集ID(Data Id)作为Sermant的动态配置模型的配置项名称。

配置集(Data Id)可以通过不同的Namespace(命名空间)和配置分组(Group)进行隔离,不同的Namespace(命名空间)和配置分组(Group)下可以存在名称相同的配置集(Data Id)。保证Sermant通过不同的Group(分组信息)来对配置项进行隔离,同一个Group(分组信息)下可以有相同Key(配置项名称)。

  • 基于 ServiceComb Kie 的配置模型实现

ServiceComb-Kie(ServiceComb Key-Value Store)的数据模型基于键值对(Key-Value)的方式来存储和管理配置信息。ServiceComb-Kie基于标签来控制配置的生效范围,通过标签和Key可以确定唯一的键值对。

Sermant的动态配置模型基于ServiceComb-Kie的实现方式如下:

Group(分组信息):ServiceComb-Kie的标签信息作为Sermant的动态配置模型的Group信息。

Key(配置项名称):ServiceComb-Kie的配置项名称作为Sermant的动态配置模型的Key。

ServiceComb-Kie的配置项可以通过不同的标签信息进行隔离,不同标签下可以存在相同配置项名称的配置,同样的标签信息下可以配置不同的配置项。保证Sermant通过不同的Group(分组信息)来对配置项进行隔离,同一个Group(分组信息)下可以有相同Key(配置项名称)。

三、Sermant动态配置模型的最佳实践

动态配置是Sermant的核心功能之一,可以帮助Sermant统一管理微服务治理能力,例如:灰度发布、限流降级、链路追踪等。如下图所示:

使用Sermant动态配置进行微服务服务治理时,要避免创建过多的Group(分组信息)和Key(配置项名称),减少配置的复杂性和混乱度,降低监听过多配置带来的性能消耗,也可以提高配置的可维护性和可读性。

接下来我们通过标签路由插件讲解Sermant动态配置的最佳实践方式。

1) 标签路由插件的功能

标签路由插件是Sermant实现微服务路由治理功能的基础,标签路由插件通过对服务提供者以服务粒度或者全局粒度配置路由规则,将某一个或多个服务的提供者划分到同一个分组,约束流量只在指定分组中流转,从而实现流量隔离的目的。标签路由插件也是流量染色、蓝绿发布、灰度发布、全链路灰度、同可用区优先调用等场景的能力基础。

2) 标签路由插件的动态配置模型

标签路由插件基于Sermant的动态配置模型进行规则配置。在微服务场景中标签路由插件动态配置模型实现如下:

Group(分组信息):基于应用名称appName和环境名称environment组成,例如:app=${appName}&environment=${ environment }

Key(配置项名称):针对服务粒度的规则,key值为servicecomb.routeRule.${srviceName},${ srviceName }为目标应用的微服务名称。针对全局粒度的规则,key值为servicecomb.globalRouteRule。

标签路由插件基于zookeeper配置中心的配置模型实现如下所示:

通过标签路由插件基于Sermant动态配置模型的实现我们可以看出,Sermant动态配置模型的Group(分组信息)支持基于应用名称和环境名称生成,此时针对于单个微服务应用只需要创建一个Group(分组信息),可以避免创建过多的的Group(分组信息)。Sermant动态配置模型的Key(配置项名称)支持基于微服务场景和服务名称生成,此时可以针对单个服务、也可以针对所有服务进行动态配置,保证单个实例不需要监听多个配置项,避免监听多个配置项导致服务性能下降、配置更新不及时或者配置冲突等问题。

四、总结

JavaAgent中的动态配置在实现微服务的多样化治理中扮演着重要的角色,是实现微服务治理的重要手段之一。通过动态配置,可以对微服务的运行时状态进行动态调整,从而实现微服务的动态治理。例如,可以根据实际负载情况通过动态配置来调整微服务的负载均衡策略,实现更加精细化的负载均衡。

而使用Sermant的动态配置模型进行微服务治理,不仅可以实现微服务的动态治理,还可以减少JavaAgent在微服务治理时由于Group太多或者实例监听的配置项过多带来的消耗,可以提高配置的可维护性和可读性。此外,Sermant的动态配置模型还支持主流的配置中心ServiceComb Kie、Zookeeper、Nacos,可以满足不同微服务治理场景下的使用,让用户更方便地进行微服务治理和运维操作。

点击关注,第一时间了解华为云新鲜技术~

如何利用动态配置中心在JavaAgent中实现微服务的多样化治理的更多相关文章

  1. Spring Cloud Config 配置中心实践过程中,你需要了解这些细节!

    本文导读: Spring Cloud Config 基本概念 Spring Cloud Config 客户端加载流程 Spring Cloud Config 基于消息总线配置 Spring Cloud ...

  2. Dubbo配置完全外部化实践,使用动态配置中心的注意事项

    问题描述 近期开发项目,将Dubbo的配置全部外部化到动态配置中心.这里配置中心我使用的是Apollo. @Configuration public class DubboConfig { @Bean ...

  3. 基于Apache Zookeeper手写实现动态配置中心(纯代码实践)

    相信大家都知道,每个项目中会有一些配置信息放在一个独立的properties文件中,比如application.properties.这个文件中会放一些常量的配置,比如数据库连接信息.线程池大小.限流 ...

  4. 如何在Ruby中编写微服务?

    [编者按]本文作者为 Pierpaolo Frasa,文章通过详细的案例,介绍了在Ruby中编写微服务时所需注意的方方面面.系国内 ITOM 管理平台 OneAPM 编译呈现. 最近,大家都认为应当采 ...

  5. 如何使用Istio 1.6管理多集群中的微服务?

    假如你正在一家典型的企业里工作,需要与多个团队一起工作,并为客户提供一个独立的软件,组成一个应用程序.你的团队遵循微服务架构,并拥有由多个Kubernetes集群组成的广泛基础设施. 由于微服务分布在 ...

  6. 使用 Skywalking 对 Kubernetes(K8s)中的微服务进行监控

    1. 概述 老话说的好:任何成功都不是轻易得来的,是不断地坚持与面对的结果. 言归正传,之前我们聊了 SpringCloud 开发的微服务是如何部署在  Kubernetes(K8s)集群中的,今天我 ...

  7. Spring Cloud 整合 nacos 实现动态配置中心

    上一篇文章讲解了Spring Cloud 整合 nacos 实现服务注册与发现,nacos除了有服务注册与发现的功能,还有提供动态配置服务的功能.本文主要讲解Spring Cloud 整合nacos实 ...

  8. Spring Cloud Config 使用Bus的动态配置中心

    server端配置 POM文件 <dependency> <groupId>org.springframework.boot</groupId> <artif ...

  9. Spring Cloud(九)高可用的分布式配置中心 Spring Cloud Config 集成 Eureka 服务

    上一篇文章,讲了SpringCloudConfig 集成Git仓库,这一篇我们讲一下SpringCloudConfig 配和 Eureka 注册中心一起使用 在分布式系统中,由于服务数量巨多,为了方便 ...

  10. IDEA 中 同一个微服务 按照多个端口启动

    网上讲这个东西的很多,抄来抄去的,大部分类似,多数没讲明白为什么那么配置. 譬如eureka.client.register-with-eureka和fetch-registry是否要配置,配不配区别 ...

随机推荐

  1. nginx中一个请求匹配到多个location时的优先级问题,马失前蹄了

    背景 为什么讲这么小的一个问题呢?因为今天在进行系统上线的时候遇到了这个问题. 这次的上线动作还是比较大的,由于组织架构拆分,某个接入层服务需要在两个部门各自独立部署,以避免频繁的跨部门沟通,提升该接 ...

  2. UVA908[Re-connecting Computer Sites]题解

    原题 1.题意分析 题意就是给你很多组数,对于每组数,有三组小数据.第一组小数据先输入一个n表示顶点数,然后再输入n-1条边表示初始边数.其它组小数据先输入一个数k,表示增加的边的数量,然后再输入k条 ...

  3. Util应用框架Web Api开发快速入门

    本文是使用Util应用框架开发 Web Api 项目快速入门教程. 前面已经详细介绍了环境搭建,如果你还未准备好,请参考前文. 开发流程概述 创建代码生成专用数据库. Util应用框架需要专门用来生成 ...

  4. 数据结构-线性表-双向链表(c++)

    与单循环链表类似,但析构函数需要注意 析构函数: 因为while循环的条件是p->next!=front,所以不能直接delete front: template<class T> ...

  5. go语言reflection反射

    一.反射 1.1简介 Reflection(反射)在计算机中就是表示程序在运行期间能够探知自身结构的能力类型(类型信息.内存结构.更新变量.以及调用方法) 1.2使用场景 函数的参数类型是interf ...

  6. [Python急救站课程]无角正方形

    无角正方形 from turtle import * penup() fd(-100) pendown() pensize(10) penup() seth(0) fd(20) pendown() f ...

  7. Spring系列:Spring6简介和基本使用

    一.概述 1.1 特点 Spring 是一款主流的 Java EE 轻量级开源框架 ,Spring 由"Spring 之父"Rod Johnson 提出并创立,其目的是用于简化 J ...

  8. 聊一聊 tcp/ip 在.NET故障分析的重要性

    一:背景 1. 讲故事 这段时间分析了几个和网络故障有关的.NET程序之后,真的越来越体会到计算机基础课的重要,比如 计算机网络 课,如果没有对 tcpip协议 的深刻理解,解决这些问题真的很难,因为 ...

  9. 题解 CF277A

    题目大意: 有 \(n\) 名员工,一共有 \(m\) 种语言,每名员工都会其中 \(k_i\) 种语言(\(m \ge \boldsymbol{k_i \ge 0}\)),现规定两名员工可以交流的条 ...

  10. 删除当前文件夹不是.vue文件,电脑命令符

    ::-----------------------------------------@echo offsetlocal EnableDelayedExpansionset _thisFilePath ...