【深入理解SpringCloud微服务】深入理解微服务配置中心原理,并手写一个微服务配置中心

为什么要使用配置中心

在没有配置中心以前,我们应用程序的配置都是保存在本地,如果是单体架构的话,这种方式是没有问题的,优点是非常的简单。

在这里插入图片描述

但是如果在微服务架构下,每个微服务自己管理自己的配置文件的话,这种方式就太混乱,不利于运维人员对配置文件的维护。

因此,在微服务架构下,通常会引入配置中心,所有微服务的配置都统一维护在配置中心,应用程序从配置中心读取配置并加载,这样对不同服务配置的维护就显得更方便。

在这里插入图片描述

配置中心原理

配置中心通常分为配置中心服务端和配置中心客户端。配置中心服务端通过某种存储方式存储配置信息,比如数据库、文件、github。而配置中心客户端请求配置中心服务端拉取配置信息,常见的是通过http请求拉取配置。

在这里插入图片描述

配置中心还会提供接口或者一个界面去进行配置添加和修改。

在这里插入图片描述
然后配置中心客户端从配置中心服务端拉取到配置信息后,会加载配置信息到本地环境中,这样我们的应用程序就能读取到从配置中心拉取回来的配置。

在这里插入图片描述

最后,配置中心通常还会有配置变更通知的功能。当配置中心发生配置变更时,需要通知客户端,可以使用与客户端维持的长连接进行推送,或者由客户端主动轮询。当客户端收到配置变更通知时,会刷新本地环境。

在这里插入图片描述

如何手写一个配置中心

以上的一整套操作,如果从零搞起,是非常麻烦的,如果我们基于Spring,使用SpringBoot开发的话,有一些接口是可以复用的,我们下面了解一下。

使用PropertySourceLocator

SpringBoot在启动的时候,会使用PropertySourceLocator#locate()方法查找配置信息,PropertySourceLocator#locate()方法返回PropertySource,里面包含了查找到的配置信息,然后SpringBoot会把PropertySource添加到Environment对象中。

在这里插入图片描述

于是,我们可以自己实现一个PropertySourceLocator重写locate()方法,locate()方法请求配置中心获取配置。我们把自己实现的PropertySourceLocator注册到Spring容器中,SpringBoot启动时就会调用我们的PropertySourceLocator去配置中心拉取配置,加载到Environment中,这样就省掉了很多代码。

在这里插入图片描述

监听配置变更,刷新配置

当配置中心发生配置变更时,要通知客户端。配置中心可以利用长连接进行推送,也可以客户端自己进行长轮询。

当客户端接收到配置变更时的环境刷新操作。客户端需要重新请求配置中心拉取配置,刷新本地环境Environment,然后还要把变更的配置重新赋值到引用该配置的对象当中。

在SpringBoot中,有一个RefreshEventListener监听器,会监听RefreshEvent事件,当RefreshEventListener监听到RefreshEvent事件时,会创建一个新SpringContext去加载配置信息,并且销毁被@RefreshScope注解修饰的bean。在下一次请求使用到被销毁的bean时,Spring会重新实例化,那么这个bean就会读取到最新的配置。

在这里插入图片描述

这样,当客户端接收到配置中心的配置变更通知时,只要通过通过Spring的事件监听机制发布一个RefreshEvent事件即可,这样又能省掉很多代码。

在这里插入图片描述

实现一个微服务配置中心

下面是我手写实现的一个配置中心,由于篇幅关系,只会展示核心代码。如果要看详细代码的话,文末会附上git仓库的地址,从上面下载即可。

服务端

配置中心服务端是基于SpringBoot开发的,采用传统的MVC架构。

库表

我们的配置中心是基于数据库存储配置信息的。

CREATE TABLE `t_config_file` (
  `f_id` bigint(20) NOT NULL,
  `f_environment` varchar(1024) DEFAULT NULL COMMENT '环境(自定义,如:dev、test)',
  `f_service_name` varchar(1024) DEFAULT NULL COMMENT '配置所属服务名',
  `f_name` varchar(1024) DEFAULT NULL COMMENT '配置文件名',
  `f_priority` int(11) DEFAULT 0 COMMENT '优先级,值越大越优先',
  `f_create_time` bigint(20) DEFAULT NULL COMMENT '创建时间',
  `f_modify_date` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp() COMMENT '修改时间',
  PRIMARY KEY (`f_id`),
  KEY `idx_config_file_modify_date` (
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值