1-SpringCloudGateway开篇
1. 序言引用 1.1. 背景微服务架构中,通常一个系统会被拆分为多个微服务,面对这么多微服务客户端应该如何去调用呢?如果没有其他更优方法,我们只能记录每个微服务对应的地址,分别去调用,但是这样会有很多的问题和潜在因素。 客户端多次请求不同的微服务,会增加客户端代码和配置的复杂性,维护成本比价高。 认证复杂,每个微服务可能存在不同的认证方式,客户端去调用,要去适配不同的认证, 存在跨域的请求,调用链有一定的相对复杂性(防火墙 / 浏览器不友好的协议)。 难以重构,随着项目的迭代,可能需要重新划分微服务 为了解决上面的问题,微服务引入了 网关 的概念,网关为微服务架构的系统提供简单、有效且统一的API路由管理,作为系统的统一入口,提供内部服务的路由中转,给客户端提供统一的服务,可以实现一些和业务没有耦合的公用逻辑,主要功能包含认证、鉴权、路由转发、安全策略、防刷、流量控制、监控日志等。 1.2. 网关在微服务中的位置 1.2.1. 网关对比 Zuul...
seata 开篇
1. 序言seat是一个分布式事务协调中心,详细见官方文档 官网 2. Seata 是什么?Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。 2.1. AT 模式2.1.1. 前提基于支持本地 ACID 事务的关系型数据库。Java 应用,通过 JDBC 访问数据库。 2.1.2. 整体机制两阶段提交协议的演变: 一阶段:业务数据和回滚日志记录在同一个本地事务中提交,释放本地锁和连接资源。 二阶段: 提交异步化,非常快速地完成。 回滚通过一阶段的回滚日志进行反向补偿。 2.2. 写隔离 一阶段本地事务提交前,需要确保先拿到 全局锁 。 拿不到 全局锁 ,不能提交本地事务。 拿 全局锁 的尝试被限制在一定范围内,超出范围将放弃,并回滚本地事务,释放本地锁。 以一个示例来说明: 两个全局事务 tx1 和 tx2,分别对 a 表的 m 字段进行更新操作,m 的初始值 1000。 tx1...
7-SpringCloudAlibaba 引入sentinel
1. 序言Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。 丰富的应用场景: Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、实时熔断下游不可用应用等。 完备的实时监控: Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。 广泛的开源生态: Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。 完善的 SPI 扩展点: Sentinel 提供简单易用、完善的 SPI 扩展点。您可以通过实现扩展点,快速的定制逻辑。例如定制规则管理、适配数据源等。 官方文档 2. 工程搭建2.1. pom12345<!--引入sentinel starter 里面定义好了web 和...
5-sentinel数据持久化
1. 序言sentinel数据默认保存在内存中,dashboard服务端和使用客户端均是如此。客户端需要在启动时通过编码加载,改动时需要修改代码,无法做到配置化。 这里改造分为服务端和客户端的改造 服务端改造:从nacos中获取规则数据,保存时存入nacos中 客户端改造:启动时从nacos中获取数据 2. 改造2.1. 服务端sentinel-dashboard改造这里只对push模式改造,其他两种因有不完全缺陷,也不适合生产,就不考虑了。 sentinel官方修改文档 主要修改建议 民间修改文档 push模式改造需要改造sentinel-dashboard,dashboard应该与nacos交互存储,持久化至nacos中 2.1.1. 下载sentinel-dashboard工程https://github.com/alibaba/Sentinel 下载工程,拷贝出sentinel-dashboard 切换项目只能得到1.8.6的版本,这里使用1.8.6版本,正好也比1.8.1版本好改造 2.1.2. 改造项目2.1.2.1....
6-SpringCloudAlibaba引入hytrix
1. 序言前面已经将openfeign引入了,现在引入hytrix做负载服务熔断降级 1.1. hystrix 引入1.1.1. pom依赖1234<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId></dependency> 注意不要引入到 1234<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-netflix-hystrix</artifactId></dependency> 没有starter自动配置会报错的 1.1.2....
4-sentinel整合dashboard
1. 序言sentinel 默认加载到内存中,项目启动之后流控规则其实没办法改变了,sentinel这里提供了一个dashboard 服务,可以启动客户端查看对应的配置信息,也可以监控,十分方便 sentinel引入 服务端和客户端的概念 服务端:及控制台dashboard程序,需要单独启动项目 客户端:每一个用了sentinel且引入了连接包的服务 2. 基础工程2.1. 工程搭建2.1.1. 服务端服务端直接从官方网站上下载即可:sentinel-dashboard 下载完成后启动jar 包 1java -jar sentinel-dashboard-1.8.1.jar --server.port=8847 默认的服务端口为8080,一般而言我们需要修改一下。启动之后服务端就完成了 2.1.2. 客户端客户端不需要做特殊改造,只需要引入依赖和加入配置即可 2.1.2.1. pom1234<dependency> <groupId>com.alibaba.csp</groupId> ...
5-SpringCloudAlibaba引入openfeign
1. 序言前面已经成功调用了生产者消费者,但消费者是通过RestTemplate调用的,而spring-cloud中有原生的openfeign方案,更为符合微服务特性因此改RestTemplate为OpenFeign调用,同时加入Hystrix做熔断 2. OpenFeign工程沿用消费者工程,需要引入openfeign和改造调用接口 2.1. openfeign的引入 添加依赖 1234567891011121314151617181920212223<dependencies> <!-- <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> <dependency> ...
3-sentinel整合Spring
1. 序言由Java的示例,其实我们在spring中也可以根据sentinel-core通过切面AOP来自定义实现一个拦截,这很容易,Sentinel自己也实现了Spring的使用 Sentinel自行实现了两套拦截的方案: 一套是基于Filter的拦截,通过映射请求路径的方式,代码中在config中配置好路径对应的资源策略 另一套是基于Interceptor方案,通过添加@SentinelResource,拦截对应的数据 2. 工程搭建2.1. 基于Servlet的Filter2.1.1. pom1234567891011121314<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> ...
4-SpringCloudAlibaba生产者消费者调用
1. 序言前面已经搭建了工程并成功注册到nacos中,这里我们使用生产者消费者模型实现远程调用,并且把config和discovery融合 2. 生产者搭建2.1. pom1234567891011121314151617<dependencies> <!--配置中心--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> <!--服务发现--> <dependency> <groupId>com.alibaba.cloud</groupId> ...
2-sentinel Java工程
1. 序言使用SentinelCore搭建一个简单的限流项目,用其中最核心的逻辑理解Sentinel 2. 工程搭建2.1. 引入依赖123456<dependencies> <dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-core</artifactId> </dependency></dependencies> 只需要这一个依赖就够了 2.2. Java中使用1234567891011121314151617181920212223242526272829303132333435363738394041424344454647import com.alibaba.csp.sentinel.Entry;import com.alibaba.csp.sentinel.SphU;import...