2024-5-6-从0到1手写配置中心Config之实现配置中心客户端

  1. 配置加载原理

在Spring中PropertySource类实现了所有属性的实例化。

启动赋值:

  • 定义自定义属性配置源,从config-server获取全局属性;
  • Spring启动时,插入自定义属性配置源;
  • 绑定属性会优先使用,给自定义属性配置源赋值。

动态更新:

  • client端和server端保持心跳检测,当有配置变动时获取新配置;
  • 对于@Value的字段需要反射赋值;
  • 对于@ConfigurationProperties配置类可以发送刷新事件。

优先级:

  • 自定义配资源;
  • 来自系统属性;
  • 来自application.yaml;
  • 来自application.properties;
  • 来自spring内置属性。
  1. 自定义客户端注解

使用该注解就能加载客户端程序

图片

  1. 自定义ConfigService

接口: 获取所有配置名称;根据名称获取配置

图片

实现类:使用Map保存所有配置信息

图片

  1. 自定义配置源

继承了EnumerablePropertySource,从ConfigService中获取属性信息。

图片

  1. 自定义配置源处理器
  • 实现BeanFactoryPostProcessor接口重新bean的后置处理逻辑;
  • 实现 EnvironmentAware接口获取环境变量;
  • 实现 PriorityOrdered接口定义优先级。

图片

在postProcessBeanFactory()方法中

  • 通过http请求到 config-server 获取配置;
  • 创建自定义配置源;
  • 创建组合配置源,可以加载多个自定义的配置源;
  • 放到属性源环境变量的最前面。

程序启动时,debug可以看到,配置中心的值加载到env的最前面了。

图片

  1. 手动注册bean

配置中心的客户端只是一个jar包,不是web项目,不能自动扫描注解包,需要手动注册bean。

通过实现ImportBeanDefinitionRegistrarle完成手动注册。一开始先判断是否存在,避免重复加载,然后再注册。

图片

  1. 测试

新建一个web工程,在启动类中使用注解@EnableMidnightConfig启动配置中心客户端。

在demo工程中,使用了@Value的方式和@ConfigurationProperties配置的方式。

图片

图片

工程中默认的配置值midnight.a=a100。

图片

配置中心默认的是midnight.a=dev500。

图片

启动工程,查看日志,两种配置方式都是dev500,说明配置中心起作用了。

图片

源代码: https://github.com/midnight2104/midnight-config

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

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

相关文章

宁盾与深信服发布联合方案,解决云桌面及微软AD完整替代

自 Citrix 退出中国市场后,不少中大型企业关心国产云桌面脱离微软 AD 域是否还能正常工作。在2024年3月初,宁盾身份目录与深信服桌面云完成兼容互认证,对于企业的疑问给出了官方回应。 5月10日,在深信服《Citrix离场背景下&#…

【设计模式】JAVA Design Patterns——Balking(止步模式)

🔍目的 止步模式用于防止对象在不完整或不合适的状态下执行某些代码。 🔍解释 真实世界例子 洗衣机中有一个开始按钮,用于启动衣物洗涤。当洗衣机处于非活动状态时,按钮将按预期工作,但是如果已经在洗涤,则…

类中属性赋值的过程——Java学习笔记

类中属性赋值过程 非静态属性的赋值 可以通过: 默认初始化显示初始化构造器中初始化通过对象.属性或对象.方法的方法进行赋值代码块中初始化 执行先后顺序:默认初始化–>显式初始化–>代码块中初始化–>构造器初始化–>通过方法进行赋值 关于字节码…

Spring中Bean的作用域有哪些?

在Spring框架中,Bean的作用域定义了由Spring IoC容器创建的Bean实例的可见范围和生命周期。Spring提供了几种不同的Bean作用域供我们根据需求选择使用,每种作用域都有其特定的用途。常用的作用域包括: Singleton(单例)…

企业签名有什么优点?

企业签名具有以下优点: 1.自定义企业分发:为企业提供更大的灵活性和控制权 2.加强企业安全性: 控制分发 减少潜在风险、数据泄露 3.内部应用更新和管理:企业可自主更新和管理内部分发。灵活发布新版本应用程序,修复bug…

大型语言模型(LLM)论文串烧

近期把各家大型语言模型的论文过了一遍,包括: Qwen Llama 2 BlueLM GLM-130B Baichuan2 Yi 刚好趁着刚看完还有印象稍微做下总结。

「动态规划」地下城游戏

力扣原题链接,点击跳转。 有一个地下城,我们用mn大小的二维数组dungeon表示。dungeon[i][j]如果为正,该位置有血包,可以加血量;如果为负,该位置有恶魔,会扣掉相应的血量。有一个骑士在左上角&a…

科技产业园3D探秘:未来科技之城的奇幻之旅

在数字时代的浪潮中,科技产业园区成为了推动城市经济发展、科技创新的重要引擎。 当我们打开科技产业园的3D可视化模型,仿佛穿越时空,来到了一个充满奇幻色彩的科技世界。在这里,高楼大厦鳞次栉比,绿色植被点缀其间&am…

【文末附gpt升级方案】革新多模态学习:哈工大团队推出“Uni-MoE”统一多模态大模型的跨域MoE研究

革新多模态学习:哈工大团队推出“Uni-MoE”统一多模态大模型的跨域MoE研究 摘要:随着人工智能技术的飞速发展,多模态学习已成为机器学习领域的重要研究方向。然而,传统的多模态学习方法往往存在信息融合困难、模型复杂度高等问题…

深度学习模型keras第二十三讲:在KerasCV中使用SAM进行任何图像分割

1 SAM概念 ###1.1 SAM定义 Segment Anything Model(SAM)是一种基于深度学习的图像分割模型,其主要特点包括: 高质量的图像分割:SAM可以从输入提示(如点、框、文字等)生成高质量的对象掩模&am…

我爱我家:租赁下位替代买房,能行吗?

我爱我家,凭什么五天四板? 上周五的楼市组合拳出台后,地产板块迎来高潮。 这其中最火的不是我们常说的“招宝万金”,而是——我爱我家。 五天四板,一个月不到,股价轻松翻翻。 公司有什么变化吗&#xff1…

Flutter 页面布局 Flex Expanded弹性布局

题记 —— 执剑天涯,从你的点滴积累开始,所及之处,必精益求精,即是折腾每一天。 什么是弹性布局(Flex)? 弹性布局(Flex)是一种基于弹性盒子模型的布局方式,类…

C语言例题46、根据公式π/4=1-1/3+1/5-1/7+1/9-1/11+…,计算π的近似值,当最后一项的绝对值小于0.000001为止

#include <stdio.h> #include <math.h>int main() {int fm 1;//分母double sign 1;//正负号double fzs 1;//分子式double sum 0;while (fabs(fzs) > 0.000001) {sum fzs;sign * -1; //变换正负号fm 2; //分母3、5、7、9...增长fzs sign / fm;//分子式…

算法思想汇总

95% 的算法都是基于这 6 种算法思想 - 知乎 一文图解弄懂八大常用算法思想&#xff01; - 掘金 八种常用算法思想 | 智能后端和架构 【总结】递归、回溯、深度优先、广度优先_递归算法与深度优先算法-CSDN博客 https://www.cnblogs.com/cdaniu/p/16369446.html

9.6 Go语言入门(数组、切片和指针)

Go语言入门&#xff08;数组、切片和指针&#xff09; 目录五、数组、切片和指针1. 数组1.1 声明和初始化数组1.2 访问和修改数组元素1.3 多维数组 2. 切片2.1 声明和初始化切片2.2 访问和修改切片元素2.3 切片操作2.4 切片的追加和拷贝 3. 指针3.1 声明和初始化指针3.2 指针与…

【资料分享】你敢相信这些高大上的BI仪表盘都是用EXCEL做出来的?!

引言 现在大家都知道数据可视化、数据看板&#xff0c;几乎每个公司部门都有仪表盘的需求。 近年来&#xff0c;学习可视化软件的人也越来越多&#xff0c;国外Tableau、PowerBI就是这一领域的领先者&#xff0c;而国内也有不少厂家在研发数据可视化软件&#xff0c;比如帆软…

【前端每日基础】day18——css清除浮动

在CSS中&#xff0c;浮动&#xff08;float&#xff09;是一种常见的布局技术&#xff0c;但它常常导致父容器的高度无法自动扩展以包含浮动的子元素。这时就需要清除浮动。以下是几种常用的清除浮动的方法&#xff1a; 使用清除元素&#xff08;Clearfix&#xff09; Clearfi…

如何用java做一个模拟登录画面

要求&#xff1a; 实现registerAction方法中的注册逻辑。实现login方法中的登录逻辑&#xff0c;确保只有当用户名和密码都正确时才返回true。实现好友管理功能&#xff0c;包括添加好友、删除好友、查看好友列表。确保所有的文件操作&#xff08;如读取和写入credentials.txt…

Pytorch深度学习实践笔记4

&#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;pytorch深度学习 &#x1f380;CSDN主页 发狂的小花 &#x1f304;人生秘诀&#xff1a;学习的本质就是极致重复! 视频来自【b站刘二大人】 1 反向传播 Back propaga…

INES文件头解析

ines_header.h #pragma once/* ** NES ROM 标头信息格式 ** FlameCyclone ** 2024.5.11 ** (https://gitee.com/flame_cyclone/ines-info.git) */#include <stdint.h> #include <string.h>// INES ROM 标头 // https://www.nesdev.org/wiki/INES typedef struct _…