为什么不用原生的spring cloud config!

java框架篇spring cloud之spring config server 1.前言 什么是spring cloud? Spring cloud为用户提供了一整套快速开发分布式应用的解决方案,包括配置管理,服务发现,断路开关,智能路由,微代理,控制总线,一次token,全局锁,leader选举,分布式session,集群状态等功能。spring boot作为spring cloud等基础应用,可以快速搭建一个微服务。 2.功能点 Distributed/versi... 阅读详情

引言

近几年传统应用架构已经逐渐朝着微服务架构演进。那么随着业务的发展,微服务越来越庞大,此时服务配置的管理变得会复杂起来。为了方便服务配置文件统一管理,实时更新,配置中心应运而生。其实,所谓配置中心,就是将配置的数据放在某种存储介质中,该介质可以是

  • File(例如Git、Svn)
  • Database(例如mysql、oracle)
  • nosql Database(例如Redis、Memacache、MongoDb)
  • 其他第三方中间件(例如Zookeeper)
    那么配置中心可以简单理解为是封装了对这些介质进行操作的接口,供客户端拉取使用。

由于我们采用的是Spring-Boot的架构,因此当时自然而然会考虑到Spring-Cloud中提供的配置中心Spring-Cloud-Config,但是当时做完调研以后,觉得并不能直接用。因此,本文想来分享一下,原生Spring-Cloud-Config的配置中心的缺点,以及我们对Spring-Cloud-Config做了哪些改动。

正文

OK,我们当时做配置中心的选型的时候。第一选择是Spring-Cloud- Config。Spring-Cloud-Config在存储介质的选择这块,基本上网上所有的文章都在推荐使用Git,即将配置文件放在Git中,服务端从Git中读取。其实官网上讲的最详细的配置,也是采取用Git作为存储介质。因此,我相信大部分读者在生产上也是用Git作为存储介质,搭配Spring-Cloud-Config使用。但是呢,博主认为以Git作为存储介质存在一些硬伤。

Git的权限控制是个坑

Git的权限管理是说控制用户能不能Push或者Delete分支,或者能不能Push代码,而不是能不能访问某个目录的文件。对目录和文件的可读是Git的最基本要求,不可能做到针对目录级别的不可读。因此如果直接使用,会出现这样一种情形

不同团队之间可以互看对方配置!

于是,可能会有如下情形发生

A团队同事A:"小B,这个地方不懂怎么配?"
A团队同事B:"去看看B团队的配置,直接贴过来。"
然后B团队就会发现自己的中间件里总是会多出一些莫名奇妙的数据!

当然,你可以禁止研发直接登陆Git改配置。然后呢,基于Git研发一套配置管理系统,在上面做权限控制,但是又有几个公司这么做呢?因为,这可能带来第二个问题。

粒度问题

将配置信息放在Git中,有一个致命问题:粒度太粗了!

你每次对一条配置发生crud的操作,其带来的影响是整个文件发生变动。如果将来我们需要对某条配置做灰度发布,基于Git来做是比较麻烦的,注意了,我没说不能做,只是比较麻烦。

那么,当时我们最理想的存储介质就是数据库,将配置信息放在数据库里有两个好处

  • 基于数据库开发一套配置管理系统,显然比基于git来开发容易的多!
  • 将配置放在数据库里,每条配置对应数据库的表中的一条记录。这么做粒度够细,针对某些重要的配置,做灰度发布,实现起来就容易很多。

因此,我们采用数据库作为存储介质。庆幸的是,这一点在Spring-Cloud-Config中是支持的。在该组件下,只需要设置

spring.profiles.active=jdbc

就能够激活jdbc模式。

但是我们很快发现了一个更大的问题,也正是因为这个问题,我们不得以需要进行改写Spring-Cloud-Config。

Spring-Cloud-Config的刷新机制是个坑!

因为一个配置中心应该要能够做到,配置发生改动的时候,项目能够自动感知,自动更新配置才对。在Spring-Cloud-Config中,这套机制是借助一些代码仓库(SVN、Github等)提供的Webhook机制加上Spring-Cloud-Bus来实现的。

在Webhook中配置一个回调地址,刷新流程如下图所示:

file

OK,那么问题又来了!

(1)配置数据放在数据库中,数据库里没有Webhook这种东西啊,怎么做到实时刷新?

(2)Spring-Cloud-Config的这套刷新机制依赖于消息总线,依赖于消息队列,存在延迟的情况!且依赖于消息队列的可用性,系统的复杂度大大增加。如果生产环境上消息队列出问题了,我们的刷新功能就会受到影响!

所以,笔者认为这套刷新机制并不是很尽如人意,需要进行修改。因此,我们很自然而然的想到了利用长轮询来改写Spring-Cloud-Config的刷新机制!

长轮询是什么

既然有长轮询,那必定有短轮询,我顺便讲讲短轮询是什么!假设我们有一个需求

在页面上要实时显示后台的库存数量!比如库存减少了,用户不需要进行刷新,页面上的数字自己会变化。

那么,如果采取短轮询就是在客户端(js)中不断访问后台,后台接到请求马上返回最新的库存数,然后刷新到这个页面当中。

短轮询的缺点?

很明显资源浪费。假设有几百人打开了该页面,就有几百个请求在不停的请求服务端,明显听着就不合理。

因此,自然就有了长轮询的出现!其实也很简单,客户端(js)依然是不断的去请求。但是呢,服务端不是马上返回。而是等待库存数量变化了再返回。大家知道,HTTP都有超时时间。如果在该时间内,依然没有变化,客户端将再次发起请求。

注意了,长短轮询对于客户端来说是没有区别的,就是不断的轮询。但是对于服务端,区别就比较大了。在短轮询情况下,服务端对于每次请求不管有没有变化都会立即返回结果。而长轮询情况下,如果有变化才会立即返回结果。而如果没有变化,服务端则不会再立即给客户端返回结果,直到超时为止。 

怎么实现

那么,我们在项目中采用Spring的DeferredResult来实现。在Servlet3.0以后引入了异步请求之后,Spring封装了一下提供了相应的支持,也就是DeferredResult,能够极大的提升吞吐量。

可能有人对Servlet的异步化不熟,我大概介绍一下。我们平时常用的是同步Servlet,其执行流程如下图所示:

file

缺点很明显啦 ,业务逻辑线程和servlet容器线程是同一个,一般的业务逻辑总得发生点IO,比如查询数据库,比如产生RPC调用,这个时候就会发生阻塞,而我们的servlet容器线程肯定是有限的,当servlet容器线程都被阻塞的时候我们的服务这个时候就会发生拒绝访问,从而吞吐量上不去!

那么,你使用异步Servlet如下图所示

file

在异步Servlet中,业务线程有自己的线程池进行处理,并不会占用Tomcat中的线程,从而提升了吞吐量!

那么,怎么利用DeferredResult怎么实现长轮询呢?流程如下

(1)客户端和服务端建立TCP连接

(2)客户端发起HTTP请求

(3)服务端发起请求,监听60s内是否有配置发生变动(如何监听配置发生变动?)

(4)如果没发生变动,给客户端返回304标志位,客户端继续发起请求

(5)如果发生了变动,服务端会调用DeferredResult.setResult返回200状态码,客户端收到响应结果后,会发起请求获取变更后的配置信息。

最后一个问题:如何有效快速的监听出配置表的数据发生了变动?

因为我们用的是mysql。这里有一个Mysql的自定义函数叫mysql-udf-http。具有httpget()、httppost()、httpput()、httpdelete()四个函数,可以在MySQL数据库中利用HTTP协议进行REST相关操作。然后再和mysql的触发器结合起来用,可以实现在配置表发生变动的时候,主动通知我们的配置中心服务端。让服务端明白配置发生了变动!

一个疑问

采用长轮询技术来实现配置刷新,客户端和服务端需之间需要一直保持TCP连接进行通信。可能有些朋友会担心,到底服务端能撑多少的连接?可能觉得对性能有影响?

这里给出参考配置

使用了内存8G、4核的虚拟机约可以撑8000左右的连接!

总结

最后这套配置中心,我基于原有的Spring-Cloud-Config,改写其中的刷新机制,更加符合我们的业务场景!现已将改写思路说清,大家可以自行尝试!

如何一起学习,有没有免费资料?

file

本文由博客一文多发平台 OpenWrite 发布!

spring-cloud-config使用oracle存储配置 spring-cloud-config使用oracle存储配置:提供了客户端与服务端配置文件与pom依赖。具体配置方法可以看一下我发的博客 立即下载

相关推荐

【gcc】跨版本兼容实战:高版本编译程序在低版本glibc环境下的部署方案

本文针对高版本gcc编译的程序在低版本glibc环境下部署的兼容性问题,提供了四种实战解决方案:静态编译的局限性、容器化部署的优雅方案、使用Devtoolset工具链的官方支持,以及最通用灵活的打包依赖SO发布方案。重点剖析了通过设置RPATH和Interpreter或使用patchelf工具,实现程序与自带库的独立部署,有效解决glibc版本鸿沟。

weixin_29237635的博客 363

SpringCloud Config

SpringCloud Config 一、配置中心解决了什么 1.1、服务配置的现状 在微服务系统中,每个微服务不仅仅只有代码,他还需要连接其他资源,例如数据库的配置或功能性的开关等等。 但是随着微服务系统的不断迭代,整个微服务系统可能会成为一个网状结构,这个时候就要考虑整个微服务系统的扩展性、伸缩性、耦合性等等。其中一个很重要的环节就是配置管理的问题。 1.2、常见的配置类型 1.2.1、服务配...

330553352的专栏 308

基于ThingsBoard+ESP8266的MQTT远程控制实战:从设备接入到仪表盘交互

本文详细介绍了基于开源物联网平台ThingsBoard与ESP8266开发板,通过MQTT协议实现远程控制的完整实战流程。从环境搭建、设备创建、仪表盘设计到核心代码编写与联调,手把手指导完成从云端到硬端的物联网闭环,为智能家居与物联网原型开发提供低成本、高效率的解决方案。

weixin_29192365的博客 333

Spring Cloud Config配置服务及那些你不知道的坑

SpringCloudConfig就是我们通常意义上的配置中心,把应用原本放在本地文件的配置抽取出来放在中心服务器,从而能够提供更好的管理、发布能力。SpringCloudConfig分服务端和客户端,服务端负责将git svn中存储的配置文件发布成REST接口,客户端可以从服务端REST接口获取配置。但客户端并不能主动感知到配置的变化,从而主动去获取新的配置,这需要每个客户端通过POST方法触发各自的/refresh。SpringCloudBus通过一个轻量级消息代理连接分布式系统的节点。

老王随聊 2218

【鸿蒙实战开发】HarmonyOS申请调试签名证书过程

这份鸿蒙(HarmonyOS NEXT)资料包含了鸿蒙开发必掌握的核心知识要点,内容包含了(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、Harmony南向开发、鸿蒙项目实战等等)鸿蒙(HarmonyOS NEXT)技术知识点。

HarmonyOS_002的博客 3562

nRF开发环境搭建全攻略:VS Code + nRF Connect SDK + Zephyr实战

嵌入式开发中,环境配置往往是新手入门的第一道障碍,尤其面对基于Zephyr RTOS的Nordic nRF平台时,工具链的复杂度常让人望而却步。理解构建系统、SDK版本管理和调试工具之间的协作关系,是高效开发的前提。Zephyr作为开源实时操作系统,通过设备树和Kconfig实现硬件描述与功能配置,而nRF Connect SDK(NCS)则是Nordic基于Zephyr的增强发行版,两者结合为物联网开发提供了强大支持。基于VS Code搭建开发环境,配合west工具管理多仓库、CMake/Ninja执行构

weixin_29188997的博客 228

为什么不用原生Spring-Cloud-Config

作者:孤独烟,我就是我,不一样的烟火,平安银行后端码农!来自:孤独烟(ID:zrj_guduyan)引言近几年传统应用架构已经逐渐朝着微服务架构演进。那么随着业务的发展,...

架构师小秘圈 794

CH7034B显示模块原理图设计,已量产

显示桥接板的价值,不在于简单把 RGB 排线换成另一种接口,而在于能否把并行视频、时钟、显示控制、模拟输出和辅助配置同时组织成稳定系统。当前这张 CH7034B 原理图就是这种思路:U3 CH7034B 作为核心桥接芯片,输入侧是 LCD_R0~R7、LCD_G0~G7、LCD_B0~B7、LCD_DE、LCD_HSYNC、LCD_VSYNC、LCD_CLK 与 LCD_BL,输出侧则通过 DAC0~DAC2 和 DDC_SC/DDC_SD 形成模拟显示接口边界。

不脱发的程序猿 166

Spring Cloud Config 踩坑记

Spring Config 为我们处理配置中心问题带来了极大的方便,不过由于spring对config的封装很“过度”,所以如果遇上问题都会很头疼,那么这里把几个我遇到的坑在这里简单的为大家叙述下: 首先项目大体一般需要四个: config-server config-client config-bus eureka-server 注意:config-server和config-cli...

cauchy8389的专栏 602

【教程4>第1章>第11节】使用MATLAB快速产生批量verilog语句加快FPGA开发

...........如果手动写,那么就非常麻烦,这个时候,我们借助matlab,则可以快速生成上述类型的verilog程序,我们编写如下的MATLAB语句。\n");\n");end。

FPGA/MATLAB学习教程/源码/项目合作开发 1241

华为OD机试真题 新系统2026-04-01 C语言 实现【计算数列位置N的值】

1、输入M、N两个数,则按照以下规则形成一个数列; 2、数列的前M个元素的值为1到M; 3、从M+1个元素开始,计算的逻辑为: 如果其前面的M个元素中,存在值相同的元素,则该位置上的数值等于前面M个数中最大的数值与最小的数值之如果其前面的M个元素中,不存在值相同的元素,则该位置上的数值等于前面M个数中最大的数值与最小的数值之差;

MISAYAONE的博客 605

我为什么放弃Spring Cloud

Spring Cloud 脱去Netflix公司的系列微服务组件的外衣,基本就是Spring Boot,那么,给Spring Boot 换装Kubernetes,又是一番怎样的景象? 在转型微服务架构之初,我就把微服务应用的运行环境的研究放在首位,动辄十几个应用的微服务系统,不解决这个问题,部署、运维本身就是一个让人抓狂的工作,如此微服务就是个概念,优势将荡然无存。随着对Kubernates研究的深入,惊喜的发现它已经具备了诸多微服务的特性,服务网格通过Sidecar模式,更是让应用无须做任...

qingdao666666的博客 805

LoveSQL

LoveSQL(SQL注入详解) 1、根据题目,显然想到的是sql注入漏洞,直接尝试万能密码 2、此时url构造,查看字段数 /check.php?username=admin' order by 3%23&password=1 # 存在 /check.php?username=admin' order by 4%23&password=1 # 报错 因此,得到总共有三个字段数 注意:url中不能用#,应该用url编码%23 3、用union来查询测试注入点,查看回显点

lunan的博客 1562

为什么不用原生的Spring Cloud Config!

点击上方“Java后端技术”,选择“置顶或者星标”你关注的就是我关心的!作者:孤独烟微信公众号:孤独烟(ID:zrj_guduyan)引言近几年传统应用架构已经逐渐朝着微...

Java后端技术 724

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

易语言不用oracle客户端_为什么不用原生的Spring Cloud Config!

引言近几年传统应用架构已经逐渐朝着微服务架构演进。那么随着业务的发展,微服务越来越庞大,此时服务配置的管理变得会复杂起来。为了方便服务配置文件统一管理,实时更新,配置中心应运而生。其实,所谓配置中心,就是将配置的数据放在某种存储介质中,该介质可以是File(例如Git、Svn)Database(例如mysql、oracle)nosql Database(例如Redis、Memacache、Mong...

weixin_39783156的博客 104

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Spring cloud config详解

摘要:Spring Cloud Config是一个微服务配置管理工具,包含ConfigServer(配置中心)和ConfigClient(配置客户端)。ConfigServer从Git等仓库拉取配置并提供REST接口,客户端启动时自动获取配置。支持多环境配置、动态刷新(通过/actuator/refresh或Spring Cloud Bus)、配置加密和安全认证。建议生产环境中采用高可用部署、配置分层管理和敏感信息加密。

onlymscn的博客 2309

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

为什么不用原生的Spring Cloud Config

引言 近几年传统应用架构已经逐渐朝着微服务架构演进。那么随着业务的发展,微服务越来越庞大,此时服务配置的管理变得会复杂起来。为了方便服务配置文件统一管理,实时更新,配置中心应运而生。其实,所谓配置中心,就是将配置的数据放在某种存储介质中,该介质可以是 File(例如Git、Svn) Database(例如mysql、oracle) nosql Da...

aimqiy86426的博客 173

【Spring Cloud】Spring Cloud Config

SpringCloudConfig介绍、刷新、加密

每篇博客都不是最终版,都会随着我的学习更新 1507

Spring Cloud Config 是什么?

Spring Cloud Config 为微服务架构提供了标准化的配置管理解决方案,尤其适合基于 Spring Cloud 构建的企业级应用。它通过集中化存储、动态刷新和版本控制,解决了分布式系统配置管理的复杂性问题。在实际应用中,需结合业务场景选择合适的配置中心,并注意安全、性能和监控等方面的最佳实践。

weixin_43521001的博客 895

Spring-cloud-config

本文介绍了Spring Cloud Config配置中心的使用方法及其与Nacos的区别。主要内容包括:1)Config Server的搭建与Git仓库配置;2)Config Client的配置方法;3)配置自动刷新机制,包括手动刷新、WebHook自动触发和Spring Cloud Bus集群广播;4)配置加密功能,支持对称和非对称加密。重点解决了微服务环境下配置动态更新问题,通过消息总线实现了多服务自动刷新,并提供了敏感信息加密方案。文章详细说明了从基础配置到高级功能的完整实现过程,包括相关依赖、配置文

多敲代码防脱发的博客 991

Day 25:Spring Cloud Config 和 Spring Cloud Gateway

提供了一个集中的配置管理系统,支持从 Git 仓库或本地文件加载配置。客户端应用可以在启动时自动从配置服务器获取配置信息,支持动态配置更新。:是一个 API 网关,主要用于路由请求、负载均衡和权限控制等功能。通过配置文件可以定义路由规则,并且可以通过过滤器进行请求的预处理和后处理。实践操作配置 Spring Cloud Config Server,使用 Git 或本地文件作为配置源,客户端应用自动获取配置。

weixin_49564779的博客 1341
上一篇: 微服务为什么一定要选spring cloud?
下一篇: 微服务设计我们需要考虑哪些要点?
JavaAQA
博客等级 码龄7年 1粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值