聊聊 延时消息的 6种 实现方案 大家好,我是不才陈某~延时消息(定时消息)指的在分布式异步消息场景下,生产端发送一条消息,希望在指定延时或者指定时间点被消费端消费到,而不是立刻被消费。延时消息适用的业务场景非常的广泛,在分布式系统环境下,延时消息的功能一般会在下沉到中间件层,通常是 MQ 中内置这个功能或者内聚成一个公共基础服务。本文旨在探讨常见延时消息的实现方案以及方案设计的优缺点。实现方案基于外部存...
陈某《Spring Cloud 进阶》专栏 中卷 实战 PDF 分享,持续更新! 大家好,我是不才陈某~《Spring Cloud 进阶》这个专栏已经写到中卷了,第一篇文章在21年7月份发布,写到现在差不多已经一年了。上卷已经分享过PDF,有想要的可以看这篇文章:3本书了,7万+字,10篇文章,《Spring Cloud 进阶》基础版 PDF上卷主要介绍的是Spring Cloud Alibaba 的几种组件基础知识,对应发表的文章如下:五十五张图告诉...
Gitee倒下了,自己造个免费的分布式存储服务~ 大家好,我是不才陈某~最近真的被Gitee整废了,昨天又设置了仓库不能公开,必须申请开源,审核通过才能公开难道这是被约谈了?先是博客园,现在又是Gitee交流群里小伙伴也都在埋怨,辛苦搭建的图床也废了有些朋友建议直接使用收费的,比如七牛云,不过技多不压身,自己造一个岂不美哉!今天来安利一个开源免费的对象存储套件MinIO,自己撸一个免费的存储系统,顺带实现一个图床。什么是MinIO?Minio 是个基于 Golang 编写的开源对象存储套件,基于Apache License v2.0开源协
Spring Boot 整合多数据源,这才叫优雅~ 大家好,我是不才陈某~大约在19年的这个时候,老同事公司在做医疗系统,需要和HIS系统对接一些信息,比如患者、医护、医嘱、科室等信息。但是起初并不知道如何与HIS无缝对接,于是向我取经。最终经过讨论采用了视图对接的方式,大致就是HIS系统提供视图,他们进行对接。写这篇文章的目的这篇文章将会涉及到Spring Boot 与Mybatis、数据库整合,类似于整合Mybatis...
Redis 性能优化 13 条军规 前言Redis作为高性能的内存数据库,在大数据量的情况下也会遇到性能瓶颈,日常开发中只有时刻谨记优化铁则,才能使得Redis性能发挥到极致。本文将会介绍十三条性能优化军规,开发过程中只要按照执行,性能必能质的飞跃。1. 避免慢查询命令慢查询命令指的是执行较慢的命令,Redis自身提供了许多的命令,并不是所有的命令都慢,这和命令的操作复杂度有关,因此必须知道Redis不同命...
25 Nacos实战:灰度配置如何实现? 大家好,我是不才陈某~实际生产环境中难免会涉及到配置的更新,而有些配置是否可行仅仅在本地、测试环境运行是很难保证生产环境不出错,此时就需要将配置变更到生产环境中。如何变更?直接修改使其全部生效吗?答案是:不行原因很简单:如果这个配置有问题,那么将使得整个集群服务瘫痪此时就要采用灰度配置:只针对某些服务做变更,一旦这些配置没问题,将作用于所有服务,这样能够使得服务平稳的运行,不至于整个集群瘫痪。Nacos中如何灰度配置在Nacos1.1.0起配置已经支持灰度配置,在配置编辑中,勾选Beta发布,
24-调用链追踪:Skywalking实现异步调用链路追踪 上节介绍了skywalking的链路追踪、数据持久化、日志查看的功能,已经能满足绝大部分的需求,但是链路追踪这里有个问题:无法支持异步调用的链路追踪。获取文章列表的这个接口的业务方法中涉及到了异步调用,代码如下: @SneakyThrows @Override public PageData<ArticleVo> list(ArticleListReq req) { ....... //① 异步获取文章作者的信息 CompletableF
23-调用链追踪:集成SKywalking实现链路打标 今天这节介绍一下分布式链路追踪Skywalking这个组件,也是个人比较青睐的一款组件。为什么需要链路追踪?大型分布式微服务系统中,一个系统被拆分成N多个模块,这些模块负责不同的功能,组合成一套系统,最终可以提供丰富的功能。在这种分布式架构中,一次请求往往需要涉及到多个服务,如下图:服务之间的调用错综复杂,对于维护的成本成倍增加,势必存在以下几个问题:服务之间的依赖与被依赖的关系如何能够清晰的看到?出现异常时如何能够快速定位到异常服务?出现性能瓶颈时如何能够迅速定位哪个服务影响的?为了能
22-Seata实战:木谷博客使用AT模式解决分布式事务 前两节介绍了分布式事务的基础理论知识,这节介绍一下Seata的AT模式在木谷博客系统中的实践。什么是Seata?Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。对业务无侵入:即减少技术架构上的微服务化所带来的分布式事务问题对业务的侵入高性能:减少分布式事务解决方案所带来的性能消耗官方文档:https://seata.io/zh-cn/index.ht
21-Seata实战:七种分布式事务解决方案 上节介绍了分布式事务的基础理论知识,这节笔者带你深入了解一下分布式事务的七种解决方案。分布式事务有哪几种解决方案?在分布式架构下,每个节点只知晓自己操作的失败或者成功,无法得知其他节点的状态。当一个事务跨多个节点时,为了保持事务的原子性与一致性,而引入一个协调者来统一掌控所有参与者的操作结果,并指示它们是否要把操作结果进行真正的提交或者回滚(rollback)。2阶段提交(2PC)二阶段提交协议(Two-phase Commit,即 2PC)是常用的分布式事务解决方案,即将事务的提交过程分为两个阶段
20-Seata实战:分布式事务基础理论 分布式事务是微服务的重点、难点,也是很多初中级开发工程师进阶的拦路虎,笔者将分布式事务分为三节介绍一下,从理论到实战,希望对你有所帮助。什么是分布式事务?分布式对应的是单体架构,互联网早起单体架构是非常流行的,好像是一个家族企业,大家在一个家里劳作,单体架构如下图:但是随着业务的复杂度提高,大家族人手不够,此时不得不招人,这样逐渐演变出了分布式服务,互相协作,每个服务负责不同的业务,架构如下图:因此需要服务与服务之间的远程协作才能完成事务,这种分布式系统环境下由不同的服务之间通过网络远程协作完成
19-微服务监控:整合Spring Boot Admin 监控微服务 Spring Boot Admin 可以监控 Spring Boot 单机或集群项目,它提供详细的健康 (Health)信息、内存信息、JVM 系统和环境属性、垃圾回收信息、日志设置和查看、定时任务查看、Spring Boot 缓存查看和管理等功能。最终效果图如下:服务端搭建服务端用来收集各个微服务的健康信息分析展示,添加如下依赖:<!--① spring boot admin的服务端--><dependency> <groupId>de.codece
18-Sentinel实战:网关层流量如何整形? 这节讲一下木谷博客系统中网关的流控整形,对于Sentinel一些基础内容不再详细介绍了,偏向实战。对于Sentinel有不清楚的可以看看笔者的这两篇文章:Spring Cloud Gateway 整合阿里 Sentinel网关限流实战!阿里限流神器Sentinel入门大全!网关层作为微服务的门户,对某些热点业务的限流至关重要。网关集成Sentinel需要三个依赖,如下:<!--①sentinel依赖--><dependency><groupId>
17-Sentinel实战:Sentinel理论知识入门 今天这一节来介绍一下微服务的重要的部分:流量整形;对于高并发大促、秒杀的场景,对于资源没有完善的流量控制机制是非常危险的,Spring Cloud Alibaba Sentinel组件完美的解决了这一问题。什么是sentinel?sentinel顾名思义:卫兵;在Redis中叫做哨兵,用于监控主从切换,但是在微服务中叫做流量防卫兵。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。Sentinel 具有以下特征:丰富的应用场景:Sentinel 承接
16-重复提交怎么破? 在Web / App项目中,有一些请求或操作会对数据产生影响(比如新增、删除、修改),针对这类请求一般都需要做一些保护,以防止用户有意或无意的重复发起这样的请求导致的数据错乱。常见的处理方案分为如下两类:客户端处理服务端处理这节介绍一下服务端处理重复提交的思路。木谷博客系统中针对那些非幂等的接口做了防重复提交,思路如下:根据请求的**ip+hash(类名+方法名)**作为key将这个key存入redis中,且设置过期时间,在过期之前保持互斥当然一定要在接口执行之前拦截,可以使用拦截器
15-网关实战:微服务集成Swagger实现在线API文档 上节介绍了网关层面聚合API文档,通过网关的路由信息找到了各个服务的请求地址,这节讲一下微服务如何集成Swagger。网关的API文档默认调用的是微服务的**/v2/api-docs**这个接口获取API详细信息,比如文章服务的URL:http://localhost:9000/blog-article/v2/api-docs,返回信息如下:木谷博客系统将swagger这个公共的部分抽离出了一个blog-swagger-starter,这样每个微服务只需要依赖这个starter即能接入swagger。
14-网关实战:网关层整合 Swagger 聚合API文档 上节课介绍了网关层的认证鉴权,今天这节介绍一下网关层如何聚合API接口文文档。为什么需要聚合API接口文档?大型微服务系统模块众多,木谷博客系统就有9个,如果这些服务的接口地址没有一个统一,那么客户端将要保存每个服务的接口地址,这个肯定是不现实。先来看一下API聚合后的样子,如下图:如何聚合?网关聚合非常简单,API文档选用的Swagger;在gateway模块的pom文件添加如下依赖:<!--swagger--><dependency> <groupI
13-OAuth2.0实战:微服务如何接收网关传递的身份信息? 上一节介绍了网关层面的统一认证鉴权,将解析过的身份信息加密放入请求头传递给下游微服务;那么下游微服务如何接收网关传递的身份信息?很简单,只需要在每个服务的过滤器中从请求头接收,将其解密。木谷博客系统中是将该过滤器统一放在blog-common-starter中,这样后续微服务只需要引入这个依赖即可。新建com.mugu.blog.common.filter.AuthenticationFilter,代码如下:/** * 具体方法主要分为两步 * 1. 解密网关传递的信息
12-OAuth2.0实战:Spring Gloud Gateway基础理论入门 为什么需要网关?传统的单体架构中只有一个服务开放给客户端调用,但是微服务架构中是将一个系统拆分成多个微服务,那么作为客户端如何去调用这些微服务呢?如果没有网关的存在,只能在本地记录每个微服务的调用地址。无网关的微服务架构往往存在以下问题:客户端多次请求不同的微服务,增加客户端代码或配置编写的复杂性。认证复杂,每个服务都需要独立认证。存在跨域请求,在一定场景下处理相对复杂。网关的基本功能?网关是所有微服务的门户,路由转发仅仅是最基本的功能,除此之外还有其他的一些功能,比如:认证、鉴权、熔断
11-OAuth2.0实战:网关层统一认证授权 上一节介绍了认证中心,这节介绍下网关如何集成认证中心实现网关的统一认证授权。木谷博客系统的整个认证授权架构设计如下图:网关在这里的主要功能就是6-8这三步:校验token:对令牌的过期时间、签名进行校验鉴权:对令牌的权限进行校验转发:解析令牌中的相关信息,通过请求头加密转发给下游微服务检验TOKEN对令牌的有效性进行校验,只需要实现ReactiveAuthenticationManager这个接口,其中authenticate进行校验,主要逻辑:根据tokenStore解析JWT令牌,然