好家伙,分布式配置中心这种组件真的是神器

我是3y,一年 CRUD经验用十年的 markdown程序员👨🏻‍💻常年被誉为优质八股文选手

上次给大家安排了 监控的相关使用姿势,不知道大家有没有配置起来。但我可不管你们的进度怎么样,我不会等着你们的哟。

今天来跟大家聊下 分布式配置中心这个话题

01、什么是分布式配置中心

在之前我就很早已经提及过:分布式配置中心这种组件在后端就是 标配的。

要理解分布式配置中心很简单:其实就是把一些配置的信息 分离于自身的系统,而这些信息又能被应用 实时获取得到。

好家伙,分布式配置中心这种组件真的是神器

要做到上面的 核心功能并不难,但是作为中间件会需要更多的 配套服务,包括但不限于

  • 1、有后台界面供我们修改配置
  • 2、配置服务如果挂了有相关的容灾逻辑
  • 3、支持不同环境下的配置信息(我们线上的配置一般是分不同的环境配置不同的值)
  • 4、相关权限管理(只有负责人才能对配置进行update)
  • 5、简单易用(有对应的SDK支持或api支持)

有的公司会自研一套这种分布式配置中心的组件,实现了上面我提到的功能。作为个人或者小公司,直接上 开源的就完事了。 别老想着自研多么美妙,维护成本极大的

02、为什么分布式配置中心

我们可以把常变动的 配置信息存放在分布式配置中心上,比如:请求的ip地址、限流值、系统的配置值、各种业务开关等等。

好家伙,分布式配置中心这种组件真的是神器

甚至,我老东家的 规则引擎也是在分布式配置中心的基础上干的,分布式配置中心用到的场景是在是太多了…

就以我们austin项目为例就好了,这期我们要实现 丢弃消息。没错,你没看错。我们项目的 核心是发消息,但需要在系统中实现丢弃消息的功能。

austin作为推送平台,它的定位是面向整个公司的所有类型的消息推送。有了这个定位以后,我们很难去保证用这个系统的都是些什么人(自然在这里面就会有 粗心的)。

从austin的实现架构,我们可以发现的是: 如果瞬间有大批量消息需要被下发时,数据会堵在MQ上等待消费

好家伙,分布式配置中心这种组件真的是神器

我们是在 austin-api层实现了判断 模板是否被删除的校验,但很有可能的是:请求已经全部被 austin-api处理完毕了,消息已经积压在MQ了。

是可以在 austini-handler再判断一遍模板是否被删除,但很多时候 消息模板的拥有者并不是想把模板删掉(删掉意味着他们在控制台就看不到该模板的配置消息了),可能他们就只是发错了而已,希望还没下发的消息不再发送而已。

好家伙,分布式配置中心这种组件真的是神器

除此之外,我们还得在 austin项目实现 白名单拦截的功能,这功能作用于 devpre环境。

对于 austin项目而言, devpre环境跟线上环境其实没有什么本质上的区别。因为最终是下发消息,只要环境能把消息下发到用户手上,那就可以把他当做线上环境在用。

一般业务在正式下发消息之前,都会在 devpre环境走一遍流程。但我们是很难保证它们的测试一定是正常的,万一业务方就出Bug导致 dev/ pre环境大批量推送了呢?

所以,我们会在 dev/ pre环境设置白名单,只有在白名单的内的用户才能收到消息。而白名单的列表我们又可以维护在分布式配置中心上

PS :相信大家多多少少都见过很多 推送的事故(各大厂貌似都有过类似的新闻和经历)。在很大原因上,就是环境混用了。本来想用 dev或者 pre环境去测试消息下发,不料使用了生产环境。(这种问题一般就需要通过权限和审批的干预了)

好家伙,分布式配置中心这种组件真的是神器

像之前的实现的去重功能,我在代码硬编码写了具体的 numseconds值。这些值也许有一天都会随着运营规则有所变动,所以也会抽到分布式配置中心上。

….

03、分布式配置中心 选择

从我第一天把 Apollo写入到 austin可能要引入的中间件,就有很多人问我: 为什么选择Apollo。我还挺纳闷的,怎么就这个中间件问我的特别多呢?分布式配置中心可选择的项目也是蛮多的:

好家伙,分布式配置中心这种组件真的是神器

在网上也有很多相关的对比,比如:

功能特性 重要性 spring-cloud-config Apollo disconf Nacos 静态配置管理 高 基于file 支持 支持 支持 动态配置管理 高 支持 支持 支持 支持 统一管理 高 无,需要github 支持 支持 支持 多环境 中 无,需要github 支持 支持 支持 本地配置缓存 高 无 支持 支持 支持 配置锁 中 支持 不支持 不支持 不支持 配置校验 中 无 无 无 无 配置生效时间 高 重启生效,或手动refresh生效 实时 实时 实时 配置更新推送 高 需要手工触发 支持 支持 支持 配置定时拉取 高 无 支持 配置更新目前依赖事件驱动, client重启或者server端推送操 支持 用户权限管理 中 无,需要github 支持 支持 支持 授权、审核、审计 中 无,需要github 支持 无 支持 配置版本管理 高 Git做版本管理 界面上直接提供发布历史和回滚按钮 操作记录有落数据库,但无查询接口 界面操作,支持回滚 配置合规检测 高 不支持 支持(但还需完善) 支持 实例配置监控 高 需要结合spring admin 支持 支持,可以查看每个配置在哪些机器上加载 支持 灰度发布 中 不支持 支持 不支持部分更新 支持 告警通知 中 不支持 支持,邮件方式告警 支持,邮件方式告警 支持

总体来说:Apollo支持的功能齐全、 社区活跃、中文文档丰富。所以,我就选择了Apollo。 社区活跃太重要了,当你使用某个框架时出现问题,然后网上一搜,发现都没人有过类似的踩坑记录,这时候头都大了。

之前我就提到过: 技术选型并往往不跟技术挂钩。如果是 个人项目,选个社区活跃的,并且该中间件已经被踩了很多坑的,学习它的思想和原理就能 举一反三。等以后知识面上去了,觉得自己当时脑子进了屎选了个破玩意,切换成本一般也不会有多大。

如果是在公司,如果本身就有类似的中间件,该用什么就用什么,在这基础上修修补补就好了。如果本身没有类似的中间件,那就多点花时间调研,但最后还是离不开 中间件的成熟度和社区活跃度(也有可能大老板按照以往的习惯一拍板。哎,这就选好了,不伤脑筋)

不过,感兴趣的还是可以多看看对比对比,这类文章在网上很多。

04、分布式配置中心原理

我以前的公司是自研的分布式配置中心,我曾经就看过其原理思想。那时候看到公司自研的技术实现是利用 长连接使配置能实时被客户端监听到。这次引用了Apollo,我也去看了下设计文档,也是通过 长轮询的方式实现客户端实时感知

好家伙,分布式配置中心这种组件真的是神器

推荐大家去读一读,如果对分布式配置中心不太熟悉或者不了解它是什么东西的话。

携程Apollo配置中心架构剖析演进

https://www.apolloconfig.com/#/zh/design/apollo-design

对于这块,我感觉我没什么可讲的,我平白无事也不会去捞源码看(除非特别对某个技术实现感兴趣,想看看人家是怎么实现的)。而Apollo文档这块做得是 相当不错了。

我针对性从头读到尾,感觉挺流畅的,貌似不太需要我补充什么内容。

05、部署Apollo

部署Apollo跟之前一样直接用 docker-compose就完事了,在GitHub已经给出了对应的教程和 docker-compose.yml以及相关的文件,直接复制粘贴就完事咯。

https://www.apolloconfig.com/#/zh/deployment/quick-start-docker

https://github.com/apolloconfig/apollo/tree/master/scripts/docker-quick-start

好家伙,分布式配置中心这种组件真的是神器

由于端口的占用问题,我换了下映射端口,最主要看两个端口吧: 8070是后台控制页面的端口, 8080是服务的端口

好家伙,分布式配置中心这种组件真的是神器

06、SpringBoot 使用apollo

写到这的时候,发现我是真的没啥好写的,我无非也是跟着官方文档弄弄。唯一的好处是我有 现成的代码,跟着做的同学可以直接复制粘贴就完了。

1、引入maven的依赖


  com.ctrip.framework.apollo
  apollo-client-config-data
  1.9.1

2、在配置文件上加入apollo的配置信息:

apollo  TODO
app:
  id: austin
apollo:
  bootstrap:
    enabled: true
    namespaces: boss.austin

配置的信息是在apollo的后台上新增的(这块大家只要能打开后台,问题就不大了,操作都挺简单的,感觉也没必要看啥文档)

好家伙,分布式配置中心这种组件真的是神器

部门的创建其实也是一份”配置”,输入 organizations就能把现有的部门给改掉,我新增了 boss股东部门,大家都是我的股东。

好家伙,分布式配置中心这种组件真的是神器

3、在Spring中直接使用 ApolloConfig就完了

好家伙,分布式配置中心这种组件真的是神器

还值得一提的是,我们是在云服务器上使用docker部署的apollo的。一般获取姿势配置都是在 内网上暴露对应的服务地址的,但我们这先体验的,所以可以直接跳过 meta server

为了方便使用,直接在启动的时候设置下参数就好了(跟着做的同学可以换下 自己的ip和端口

好家伙,分布式配置中心这种组件真的是神器

08、总结

这篇文章简单介绍了什么是分布式配置中心,以及分布式配置中心能用来干什么,介绍了如何入门Apollo,使用SpringBoot环境下使用Apollo。

我强烈建议如果不了解分布式配置中心的同学可以从Apollo入手,根据上面给出的链接阅读下他的 架构由来以及它的 设计理念。作为一个markdown程序员而言,我觉得写得很不错的了。

对这感兴趣的,也可以深入阅读下源码,看看关键的功能是怎么实现的(这不又是一条学习路径?)

如果公司还没有用到分布式配置中心的,看完文章看看自己的项目有没有相关的场景,可以专研下来接入下(一整个Q的KPI/OKR就有了,不用愁了)

点个赞一点都不过分吧?我是3y,下期见。

好家伙,分布式配置中心这种组件真的是神器

关注我的微信公众号【 Java3y】除了技术我还会聊点日常,有些话只能悄悄说~ 【对线面试官+从零编写Java项目】 持续高强度更新中!求star!! 原创不易!!求三连!!

好家伙,分布式配置中心这种组件真的是神器

austin项目源码Gitee链接:gitee.com/austin

austin项目源码GitHub链接:github.com/austin

Original: https://www.cnblogs.com/Java3y/p/15962828.html
Author: Java3y
Title: 好家伙,分布式配置中心这种组件真的是神器

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/594448/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • JAVA的类型转换(基本类型)

    类型转换 由于java是强类型语言,所以在进行某些运算的时候,需要用到类型转换。 低–>高指的是字节大小,从小到大。 小数的优先级大于整数 数值进行类型转换时不要…

    Java 2023年6月9日
    084
  • 代码审查:从 ArrayList 说线程安全

    本文从代码审查过程中发现的一个 ArrayList 相关的「线程安全」问题出发,来剖析和理解线程安全。 案例分析 前两天在代码 Review 的过程中,看到有小伙伴用了类似以下的写…

    Java 2023年6月5日
    0106
  • 免费正版 IntelliJ IDEA license 详细指南

    一、前言 IntelliJ IDEA 一直是我非常喜欢的 IDE 自从用上之后就回不了头了,但是 Ultimate 版本的费用十分昂贵,其实 JetBrains 自己就提供了6种免…

    Java 2023年6月6日
    0109
  • 统一网关Gateway的使用:

    为什么需要网关? Gateway网关是我们服务的守门神,所有微服务的统一入口 网关的核心功能特性: 网关的功能:身份认证和权限校验 服务路由,负载均衡 请求限流 在SpringCl…

    Java 2023年6月16日
    098
  • 开学总动员!2022华为开发者大赛等你来挑战!

    摘要:9月23日开启2022华为开发者大赛”开学季总动员”主题直播活动。 金秋开学季,为了吸引更多高校开发者关注与参与华为开发者大赛,华为于9月23日开启2…

    Java 2023年6月15日
    072
  • java WebSocket 即时通讯服务端代码

    ackage org.fh.plugins.ChatServer; import java.net.InetSocketAddress; import java.net.Unkno…

    Java 2023年6月8日
    083
  • 玩转 SpringBoot2.x 之整合 thumbnailator 图片处理

    1、序 在实际项目中,有时为了响应速度,难免会对一些高清图片进行一些处理,比如图片压缩之类的,而其中压缩可能就是最为常见的。最近,阿淼就被要求实现这个功能,原因是客户那边嫌速度过慢…

    Java 2023年5月30日
    0100
  • 日志导致线程Block的这些坑

    日志导致线程Block的这些坑,你不得不防 https://mp.weixin.qq.com/s/nowNpIOHBFHD0pctcKr2UA Original: https://…

    Java 2023年5月30日
    0106
  • 设计模式之命令模式

    命令模式又称为行动/交易模式,属于行为型模式;是指将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行储存、传…

    Java 2023年6月5日
    089
  • 小程序接口申请和隐私文档

    谨以此文,记录我被微信开发工具折磨的这段日子 本指引是HexPal小程序开发者 (以下简称”开发者”)为处理你的个人信息而制定。 开发者处理的信息 根据法律…

    Java 2023年6月7日
    078
  • Java反射的总结

    Java Reflection 反射是被视为动态语言的关键,反射机制允许程序执行期借助于Reflection。API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。 加…

    Java 2023年6月8日
    0101
  • MySQL表历史数据清理总结

    最近工作中在处理线上几个数据表的清理工作,工作虽然简单,但操作起来注意的地方还是挺多的。现将整个过程进行简单的总结,以便作为日后的参考。 首先确定下我们清理数据的期望: 期望清理过…

    Java 2023年6月5日
    0117
  • MyBatis的二级缓存

    二级缓存的原理 二级缓存的原理和一级缓存一样,第一次查询会将数据放到缓存中,然后第二次查询直接去缓存读取。 但是一级缓存是基于 SqlSession 的,二级缓存是基于 mappe…

    Java 2023年6月5日
    0121
  • entitybuilder–一个简单的业务通用框架

    关于业务通用框架的思考 业务系统是千差万别的,例如,保存、更新和删除订单,或者保存订单和保存客户,走的根本不是一个流程。但是,它们还是有共同点,它们的流程大致可以分成下面的几个部分…

    Java 2023年6月13日
    072
  • Git配置用户信息和SSH免密

    一、配置用户信息 1.查看配置信息 查看所有配置 $ git config -l/–list 查看系统配置 $ git config –system -l/–list 查看用…

    Java 2023年6月8日
    084
  • 草履虫都能看懂的系统环境变量配置

    超详细的环境变量配置教学(Windows10) 很多刚刚入坑计算机的小伙伴可能对环境变量的配置不太熟悉,如果你还在找教程,那么看到这里,你就不用继续找了(嘿嘿~),废话不多说,让我…

    Java 2023年6月5日
    089
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球