本文分享自华为云社区《如何利用动态配置中心在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. junit4单元测试报错Invalid project specified

    junit4单元测试报错Invalid project specified. 前天在进行单元测试的时候出现了Invalid project specified的报错查了一下发现是项目名字的问题.项目名 ...

  2. 如何写出优雅的代码?试试这些开源项目「GitHub 热点速览」

    又是一期提升开发效率的热点速览,无论是本周推特的检查 Python 语法和代码格式的 ruff,或者是 JS.TS 编译器 oxc,都是不错的工具,有意思的是它们都是 Rust 写的. 此外,还有用来 ...

  3. JVM Stack and Frame

    Overview Sharing a single thread within the district: PC Register/JVM Stack/Native Method Stack.All ...

  4. 2022/07/16暑期集训考试 day1

    T1 取餐号 看到数据范围 直接锁定埃氏筛和线性筛 我打的是一个优化一点的埃氏筛 #include<bits/stdc++.h> using namespace std; #define ...

  5. 改变element dialog弹窗的关闭按钮样式

    .el-dialog__headerbtn { top: 8px !important; background: url('https://你路径资源的url图片') left no-repeat; ...

  6. TiDB binlog故障处理之drainer周期性罢工

    背景 前段时间用户反馈某生产环境 TiDB 集群 drainer 频繁发生故障,要么服务崩溃无法启动,要么数据跑着跑着就丢失了,很是折磨人.该集群跑的是离线分析业务,数据量20T ,v4版本,有多个 ...

  7. Codeforces Round #706 (Div. 2) A-D题解

    写在前边 链接:Codeforces Round #706 (Div. 2) \(A,B,C,D\),这场有点简单,不过由于A写炸了后边题连看都没看就溜了,就从上大分变成了掉大分 A. Split i ...

  8. 七天.NET 8操作SQLite入门到实战 - 第三天SQLite快速入门

    前言 今天我们花费一个小时快速了解SQLite数据类型.SQLite常用命令和语法. 七天.NET 8操作SQLite入门到实战详细教程 第一天 SQLite 简介 第二天 在 Windows 上配置 ...

  9. 全屏API及vue3 hook封装

    最近在一个大屏项目遇到一个需求:用户可以通过一个按钮,触发页面部分模块全屏.通过以下API可以实现: Element.requestFullscreen()方法用于发出异步请求使元素进入全屏模式. 且 ...

  10. Android 实现APP可切换多语言

    原文: Android 实现APP可切换多语言 - Stars-One的杂货小窝 如果是单独给app加上国际化,其实很容易,创建对应的国家资源文件夹即可,如values-en,values-pt,ap ...