dubbogo如何实现远程配置管理 -- 阅读官方文档

news/2024/5/4 1:23:37/文章来源:https://blog.csdn.net/qq_61039408/article/details/130388466

dubbo-go 中如何实现远程配置管理?

之前在 Apache/dubbo-go(以下简称 dubbo-go )社区中,有同学希望配置文件不仅可以放于本地,还可以放于配置管理中心里。那么,放在本地和配置管理中心究竟有哪些不一样呢?

放在本地,每次更新需要重启,配置文件管理困难,无法做到实时更新即刻生效。此外,本地文件还依赖人工版本控制,在微服务的场景下,大大的增加了运维的成本与难度。

而配置管理中心提供了统一的配置文件管理,支持文件更新、实时同步、统一版本控制、权限管理等功能。

配置中心

配置中心在 dubbo-go 中主要承担以下场景的职责:

  1. 作为外部化配置中心,即存储 dubbo.properties 配置文件,此时,key 值通常为文件名如 dubbo.properties , value 则为配置文件内容。
  2. 存储单个配置项,如各种开关项、常量值等。
  3. 存储服务治理规则,此时 key 通常按照 “服务名 + 规则类型” 的格式来组织,而 value 则为具体的治理规则。

就目前而言,dubbo-go 首要支持的是 Dubbo 中支持的开源配置中心,包括:

  1. Apollo:携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。
  2. ZooKeeper:一个分布式的,开放源码的分布式应用程序协调服务,是 Google 的 Chubby 一个开源的实现,是 Hadoop 和 Hbase 的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。
  3. Nacos: Alibaba 开源的配置管理组件,提供了一组简单易用的特性集,帮助您实现动态服务发现、服务配置管理、服务及流量管理。

而考虑到某些公司内部有自身的研发的配置中心,又或者当前流行而 Dubbo 尚未支持的配置中心,如 etcd,我们的核心在于设计一套机制,允许我们,也包括用户,可以通过扩展接口新的实现,来快速接入不同的配置中心。

那么在dubbo-go中究竟是怎么实现的呢?

我们的答案是:
基于动态的插件机制在启动时按需加载配置中心的不同实现。

dubbo-go设计

原逻辑为:启动时读取本地配置文件,将其加载进内存,通过配置文件中的配置读取注册中心的信息获取服务提供者,注册服务消费者。

有些读者会有点困惑,不是说好了使用配置中心的,为什么现在又要读取本地配置呢?答案就是,读取的这部分信息分成两部分:

  • 使用什么作为配置中心;
  • 该配置中心的元数据,比如说使用 zookeeper 作为配置中心,那么 zookeeper 的链接信息就是元数据,毕竟我们只有在知道了链接信息之后才能连上 zookeeper;

在改造的时候,需要考虑以下的问题:

  1. 如何实现支持多个配置中心?如何实现按需加载?

    通过抽象 DynamicConfiguration 让开发者可以快速支持多个配置中心。使用者导入指定的组件包后,在启动阶段将需要的组件加载进内存中,以便给程序按需调用,如下图绿色部分。

  2. 配置中心的配置加载阶段在什么时候?

    应在读取配置文件阶段后,读取并解析本地配置文件中配置中心信息。初始化配置中心链接,读取 /dubbo/config/dubbo/dubbo.properties 与 /dubbo/config/dubbo/应用名/dubbo.properties ,并将其加载到内存之中覆盖原有配置,监听其变更,实时更新至内存,如下图蓝色部分: img

ConfigCenterFactory

使用者加载对应配置中心模块后,在初始化阶段加入各配置中心模块往其中注册其初始化类。

var configCenterFactories = make(map[string]func() config_center.DynamicConfigurationFactory)// SetConfigCenterFactory sets the DynamicConfigurationFactory with @name
func SetConfigCenterFactory(name string, v func() config_center.DynamicConfigurationFactory) {configCenterFactories[name] = v
}// GetConfigCenterFactory finds the DynamicConfigurationFactory with @name
func GetConfigCenterFactory(name string) (config_center.DynamicConfigurationFactory, error) {if configCenterFactories[name] == nil {return nil, errors.New("config center for " + name + " is not existing, make sure you have import the package.")}return configCenterFactories[name](), nil
}

DynamicConfigurationFactory

整个动态配置中心的关键点就在DynamicConfigurationFactory上,其中通过解析内部自定义的URL,获取其协议类型,反射其参数,用于创建配置中心的链接。

// DynamicConfigurationFactory gets the DynamicConfiguration
type DynamicConfigurationFactory interface {GetDynamicConfiguration(*common.URL) (DynamicConfiguration, error)
}

如:

配置文件中配置:

config_center:protocol: zookeeperaddress: 127.0.0.1:2181namespace: test

dubbo-go 内部会解析为:

zookeeper://127.0.0.1:2181?namespace=test

在内部传递,用于初始化配置中心链接。

DynamicConfiguration

该接口规定了各个配置中心需要实现的功能:

  • 配置数据反序列化方式:目前只有Properties转换器,参见:DefaultConfigurationParser。
  • 增加监听器:用于增加监听数据变化后增加特定逻辑(受限于配置中心client端实现)
  • 删除监听器:删除已有监听器(受限于配置中心client端实现,目前所知nacos client没有提供该方法)
  • 获取路由配置:获取路由表配置
  • 获取应用及配置:获取应用及配置,如:协议类型配置等
// DynamicConfiguration for modify listener and get properties file
type DynamicConfiguration interface {Parser() parser.ConfigurationParserSetParser(parser.ConfigurationParser)AddListener(string, ConfigurationListener, ...Option)RemoveListener(string, ConfigurationListener, ...Option)// GetProperties get properties fileGetProperties(string, ...Option) (string, error)// GetRule get Router rule properties fileGetRule(string, ...Option) (string, error)// GetInternalProperty get value by key in Default properties file(dubbo.properties)GetInternalProperty(string, ...Option) (string, error)// PublishConfig will publish the config with the (key, group, value) pairPublishConfig(string, string, string) error// RemoveConfig will remove the config white the (key, group) pairRemoveConfig(string, string) error// GetConfigKeysByGroup will return all keys with the groupGetConfigKeysByGroup(group string) (*gxset.HashSet, error)
}

img

优先考虑与现有 Dubbo 设计兼容,从而降低使用者的学习成本,dubbo-admin 作为服务提供者实现应用级配置管理, dubbo-go 作为消费端实现配置下发管理功能。下面以 ZooKeeper 为例,对服务提供者与服务消费者进行整体流程分析。

如何存储配置管理

dubbo-admin 配置管理中增加 global 配置,ZooKeeper 中会自动生成其对应配置节点,内容均为 dubbo-admin 中设置的配置。

  1. /dubbo/config/dubbo/dubbo.properties 对应全局配置文件。
  2. /dubbo/config/dubbo/ 应用名 /dubbo.properties 对应指定应用配置文件。
节点路径

img

上图展示了 dubbo.properties 文件在 ZooKeeper 和 Apollo 中的存储结构:

实现配置管理中心支持

以Apollo为例子,简单的介绍,如何实现一个新的配置管理中心。

选择配置管理中心Client/SDK

本例中使用的 Apollo Go Client 为:https://github.com/apolloconfig/agollo

节点路径

因为每隔配置管理中心的存储结构各有各的特点,导致dubbo在使用外部配置管理中心时,存储配置节点的结构不一样。在dubbo-configcenter找到希望支持的配置管理中心,而本例中Appollo则在ApolloDyncmicConfiguration.java。

注释中表明,Apollo namespace = governance (governance .properties) 用于治理规则,namespace = dubbo (dubbo.properties) 用于配置文件。

新建创建客户端方法,最好由客户端保持为单例。

func newApolloConfiguration(url *common.URL) (*apolloConfiguration, error) {c := &apolloConfiguration{url: url,}configAddr := c.getAddressWithProtocolPrefix(url)configCluster := url.GetParam(constant.CONFIG_CLUSTER_KEY, "")appId := url.GetParam(constant.CONFIG_APP_ID_KEY, "")namespaces := getProperties(url.GetParam(constant.CONFIG_NAMESPACE_KEY, cc.DEFAULT_GROUP))c.appConf = &config.AppConfig{AppID:         appId,Cluster:       configCluster,NamespaceName: namespaces,IP:            configAddr,}agollo.InitCustomConfig(func() (*config.AppConfig, error) {return c.appConf, nil})return c, agollo.Start()
}

以下为必须实现的方法,以下方法用于获取配置中心配置。

  • GetInternalProperty:在配置文件(Apollo 为 namespace)中,根据 key 获取对应 value;
  • GetRule:获取治理配置文件(Apollo 为 namespace);
  • GetProperties:获取整个配置文件(Apollo 为 namespace);

可选择实现的方法,如不实现,则不能动态更新 dubbo-go 中配置信息。

  • RemoveListener
  • AddListener

而 Parser & SetParser 使用默认实现即可,默认为 Properties 转换器。

使用方法

img

很显然,使用配置中心并不复杂,只需要把对应的依赖引入进来。在包初始化的时候,会创建出来对应的配置中心的实现。比如说加载 ZooKeeper 或者 Apollo 作为配置中心:

当然仅仅加载还不够,比如说虽然我加载了 zookeeper,但是我还需要知道怎么连上这个配置中心,即前面提到的配置中心的元数据,这部分信息是需要在本地配置出来的。比如说:

ZooKeeper

config_center:protocol: "zookeeper"address: "127.0.0.1:2181"

Apollo

config_center:protocol: "apollo"address: "127.0.0.1:8070"app_id: test_appcluster: dev

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

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

相关文章

【browserify】一步步教你学会browserify

https://www.cnblogs.com/fsg6/p/13139627.html Browserify browserify的官网是http://browserify.org/,他的用途是将前端用到的众多资源(css,img,js,…) 打包成一个js文件的技术。 比如在html中引用外部资源的时候,原来我们可能这样写 &l…

从0搭建Vue3组件库(九):VitePress 搭建部署组件库文档

VitePress 搭建组件库文档 当我们组件库完成的时候,一个详细的使用文档是必不可少的。本篇文章将介绍如何使用 VitePress 快速搭建一个组件库文档站点并部署到GitHub上 安装 首先新建 site 文件夹,并执行pnpm init,然后安装vitepress和vue pnpm install -D vitepress vue安…

年轻不乏野心,想做年薪40万+的软件测试工程师?写给长途漫漫中的你...

本人从事自动化测试10年多,之前在猪场工作,年薪突破40W,算是一个生活过得去的码农。(仅代表本人) 目前从事自动化测试的薪资待遇还是很不错的,所以如果朋友们真的对自动化感兴趣的话可以坚持学下去&#xf…

一种视频算法插件流水线执行架构

目的 将视频接入进来以后,使用算法对图像进行处理并且输出 1 各种接入 2 解码 3 解码后图像算法 如矫正算法 4 共享输出 方式 使用动态库的方式进行扫描底层,每个动态库为一个插件,每个插件包含特定的函数,通过扫描的方式加载所…

基于springboot的大学生租房系统源码论文数据库

3.1系统功能 现在无论是在PC上还是在手机上,相信全国所有地方都在进行大学生租房管理。随着经济的不断发展,系统管理也在不断增多,大学生租房系统就是其中一种,很多人会登录到相关的租房系统查看租房信息,还能查看房屋…

11.java程序员必知必会类库之word处理库

前言 正常业务中,可能涉及到和合作方签约电子合同,此时,我们需要先设计合同模板,维护固定内容,将可变的内容通过占位符替代,等签章的时候,生成pdf,然后可以根据设计的合同章的坐标,…

Linux基础命令和程序部署

Linux基础命令 ls 可以查看当前目录内容ls 后面跟上一个具体路径可以查看指定目录内容ls -l 可以以列表的形式查看,缩写llpwd 查看当前目录的绝对路径cd 切换目录(就是window界面的鼠标双击目录进入动作),cd在切换目录时后面可以…

Android 9.0 系统设置显示主菜单添加屏幕旋转菜单实现旋转屏幕功能

1.前言 在android9.0的系统rom定制化开发中,在对系统设置进行定制开发中,有产品需求要求增加旋转屏幕功能的菜单,就是在点击旋转屏幕菜单后弹窗显示旋转0度,旋转 90度,旋转180度,旋转270度针对不同分辨率的无重力感应的大屏设备的屏幕旋转功能的实现,接下来就来分析实现…

详解子网划分练习题(32道)

目录 1 子网划分概念: 2 划分方法: 子网划分方法:段,块,数的计算三步。 段就是确定ip地址段中既有网络地址,又有主机地址的那一段是四段中的那一段? 块就确定上一步中确定的那一段中的主机…

FreeRTOS(三)——应用开发(一)

文章目录 0x01 FreeRTOS文件夹FreeRTOSConfig.h文件内容上面定义的宏决定FreeRTOS.h文件中的定义0x02 创建任务创建静态任务过程configSUPPORT_STATIC_ALLOCATION创建动态任务过程configSUPPORT_DYNAMIC_ALLOCATION 0x03 FreeRTOS启动流程启动流程概述 0x04 任务管理任务调度器…

CASAIM自动化精密尺寸测量设备全尺寸检测铸件自动化检测铸件

铸造作为现代装备制造工业的基础共性技术之一,铸件产品既是工业制造产品,也是大型机械的重要组成部分,被广泛运用在航空航天、工业船舶、机械电子和交通运输等行业。 铸件形状复杂,一般的三坐标或者卡尺圆规等工具难以获取多特征…

FPGA入门系列5--运算符号

文章简介 本系列文章主要针对FPGA初学者编写,包括FPGA的模块书写、基础语法、状态机、RAM、UART、SPI、VGA、以及功能验证等。将每一个知识点作为一个章节进行讲解,旨在更快速的提升初学者在FPGA开发方面的能力,每一个章节中都有针对性的代码…

【剧前爆米花--爪哇岛寻宝】网络互连,网络通信和网络分层

作者:困了电视剧 专栏:《JavaEE初阶》 文章分布:这是一篇关于网络初识的文章,在这篇文章中讲解了局域网广域网,IP地址,端口以及网络分层等相关内容,希望对你有所帮助! 目录 网络互连…

第10届蓝桥杯省赛真题剖析-2019年3月24日Scratch编程初中级组

[导读]:超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成,后续会不定期解读蓝桥杯真题,这是Scratch蓝桥杯真题解析第126讲。 第10届蓝桥杯省赛,这是2019年3月24日举办的省赛Scratch考试真题,比赛是在线下举办的…

Redis数据库的安装(Windows10)

Redis数据库的安装 前言安装启动命令简单的几条语句 前言 本节开始学习Redis数据库。 Redis数据库的优势如下: 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ord…

测量射频器件噪声系数的三种方法盘点

本文介绍了测量噪声系数的三种方法:增益法、Y系数法和噪声系数测试仪法。这三种方法的比较以表格的形式给出。 在无线通信系统中,噪声系数(NF)或者相对应的噪声因数(F)定义了噪声性能和对接收机灵敏度的贡献。本篇应用笔记详细阐…

二十、线索关联市场活动(一):查询市场活动

功能需求 用户在线索明细页面,点击"关联市场活动"按钮,弹出线索关联市场活动的模态窗口; 用户在线索关联市场活动的模态窗口,输入搜索条件,每次键盘弹起,根据名称模糊查询市场活动,把所有符合条件的市场活动显示到列表中; 用户选择要关联的市场活动,点击"关联…

史上最全Maven教程(三)

文章目录 🔥Maven工程测试_Junit使用步骤🔥Maven工程测试_Junit结果判定🔥Maven工程测试_Before、After🔥依赖冲突调解_最短路径优先原则🔥依赖冲突调解_最先声明原则🔥依赖冲突调解_排除依赖、锁定版本 &a…

Netty源码解读

Netty源码解读 Netty线程模型 1、定义了两组线程池BossGroup和WorkerGroup,BossGroup专门负责接收客户端的连接, WorkerGroup专门负责网络的读写 2、BossGroup和WorkerGroup类型都是NioEventLoopGroup,Group中维护了多个事件循环线程NioEventLoop&#…

案例3:Java汽车保养维修系统设计与实现开题报告

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…