本文主要介绍了SpringCloud最新的应用技术,简单说明每类技术涉及的知识点,对应技术的学习资料、软件、可用代码和下载地址在文末给出。
文章目录
- 说明
- SpringCloud简介
- Consul
- Consul简介
- 使用示例
- Nacos
- Nacos简介
- 使用示例
- 负载均衡LoadBalancer
- LoadBalancer简介
- 使用示例
- 服务调用与负载均衡OpenFeign
- OpenFeign简介
- 使用示例
- 服务熔断和降级Resilience4j
- Resilience4j简介
- 使用示例
- 服务熔断和降级Sentinel
- Sentinel简介
- 使用示例
- 服务链路追踪Micrometer+Zipkin
- Micrometer、Zipkin简介
- 使用示例
- 服务网关Gateway
- Gateway简介
- 使用示例
- 分布式事务Seata
- Seata简介
- 使用示例
- SpringCloud资料下载
2024年,SpringCloud生态底层技术已经发生了较大改变。随着Eureak/Ribbon/Hystrix/Sleuth/Zuul等陆续已宣布停止更新,其他技术随之上位将其替代。目前SpringCloud生态应用场景和常用的底层应用技术如下,文章也将由此展开。相关图片和材料来自于尚硅谷和本地截图,可供配套学习。
服务场景 | 支撑技术 |
---|---|
服务注册与发现 | Consul、Nacos(阿里系) |
分布式配置管理 | Consul、Nacos(阿里系) |
服务调用与负载均衡 | LoadBalancer、OpenFeign |
服务熔断和降级 | Resilience4j、Sentinel(阿里系) |
服务链路追踪 | Micrometer Tracing + Zipkin |
服务网关 | Gateway |
分布式事务 | Seata(阿里系) |
说明
每个章节的结构均为简介+使用示例。简介
为该技术的原理简述。使用示例
为对应软件的展示,并不涉及具体的测试过程。
文章内容有限,无法深入演示所有过程,如果需要相关资料深入学习,可跳至最后下载相关资料和代码即可。
SpringCloud简介
Spring cloud 是一系列框架的有序集合
。它利用 spring boot 的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用 spring boot 的开发风格做到一键启动和部署。Spring Cloud 并不重复造轮子,而是将市面上开发得比较好的模块集成
进去,进行封装,从而减少了各模块的开发成本。换句话说:Spring Cloud 提供了构建分布式系统所需的“全家桶”
。针对每类基础服务,有对应的落地技术来实现,下面将展开介绍。
Consul
Consul简介
为什么需要服务注册与发现
(1)如果订单微服务和支付微服务的IP地址或者端口号发生了变化,则支付微服务将变得不可用,需要同步修改订单微服务中调用支付微服务的IP地址和端口号。
(2)如果系统中提供了多个订单微服务和支付微服务,则无法实现微服务的负载均衡功能。
(3)如果系统需要支持更高的并发,需要部署更多的订单微服务和支付微服务,硬编码订单微服务则后续的维护会变得异常复杂。
为什么需要分布式配置管理
微服务意味着要将单体应用中的业务拆分成一个个子服务,每个服务的粒度相对较小,因此系统中会出现大量的服务。由于每个服务都需要必要的配置信息才能运行,所以一套集中式的、动态的配置管理设施是必不可少的。比如某些配置文件中的内容大部分都是相同的,只有个别的配置项不同。就拿数据库配置来说吧,如果每个微服务使用的技术栈都是相同的,则每个微服务中关于数据库的配置几乎都是相同的,有时候主机迁移了,我希望一次修改,处处生效。
是什么
Consul 是一套开源的分布式服务发现和配置管理系统
。提供了微服务系统中的服务治理、配置中心、控制总线等功能。这些功能中的每一个都可以根据需要单独使用,也可以一起使用以构建全方位的服务网格,总之Consul提供了一种完整的服务网格解决方案
。
能做什么
提供服务发现、KV存储、可视化Web页面等功能
Consul官网
使用示例
Consul页面
Consul软件后台启动演示
http://localhost:8500/
服务注册与发现-可以在Consul前台页面查看到所有配置了Consul依赖的服务:
Consul前台页面-分布式配置管理,通过自建对应文件夹和文件内容完成配置,这样不用重启微服务,也能够动态实时获取到data文件中的相关参数。
Nacos
Nacos简介
是什么
官方:一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台
属于 SpringCloud Alibaba。
中文官网
使用示例
Nacos软件后台运行:
服务注册与发现-入驻Nacos的微服务可以在服务管理页面看到;在配置管理页面可以完成各微服务的配置:
配置页面-分布式配置管理:
负载均衡LoadBalancer
LoadBalancer简介
是什么
负载均衡简单的说就是将用户的请求平摊的分配到多个服务上,从而达到系统的HA(高可用),常见的负载均衡有软件Nginx,LVS,硬件 F5等。
Spring Cloud LoadBalancer是由SpringCloud官方提供的一个开源的、简单易用的客户端负载均衡器,它包含在SpringCloud-commons中用它来替换了以前的Ribbon组件。
官方网站
使用示例
8001和8002为服务提供者,80为消费者。测试80调用服务提供者时,会实现8001端口和8002端口的轮询调用。
服务调用与负载均衡OpenFeign
OpenFeign简介
是什么
OpenFeign是一个声明式的Web服务客户端
,是当前微服务之间调用的事实标准。
在OpenFeign的实现下,我们只需创建一个接口并使用注解的方式来配置它(在一个微服务接口上面标注一个@FeignClient注解即可),即可完成对服务提供方的接口绑定,统一对外暴露可以被调用的接口方法,大大简化和降低了调用客户端的开发量,也即由服务提供者给出调用接口清单,消费者直接通过OpenFeign调用即可。
OpenFeign还集成SpringCloud LoadBalancer,可以实现负载均衡。
涉及的注解
@EnableFeignClients 标注在主启动类上,表示开启Feign功能并激活。标注在服务发起的一方-消费者。
@FeignClient 配置在common微服务的服务接口上。
Feign的使用参考-更详细的介绍
OpenFeign 全方位讲解
官网
使用示例
业务流程示例
代码测试内容包括:
1.服务消费者通过调用公共模块API的服务接口实现服务调用
2.OpenFeign超时控制测试【通过配置自定义超时时间】
3.OpenFeign重试机制测试【通过配置自定义重试次数】
服务熔断和降级Resilience4j
Resilience4j简介
是什么
介绍Resilience4j前,需要先介绍CircuitBreaker断路器。
CircuitBreaker的目的是保护分布式系统免受故障和异常
,提高系统的可用性和健壮性
。
当一个组件或服务出现故障时,CircuitBreaker会迅速切换到开放OPEN状态(保险丝跳闸断电),阻止请求发送到该组件或服务从而避免更多的请求发送到该组件或服务。这可以减少对该组件或服务的负载,防止该组件或服务进一步崩溃
,并使整个系统能够继续正常运行。同时,CircuitBreaker还可以提高系统的可用性和健壮性,因为它可以在分布式系统的各个组件之间自动切换,从而避免单点故障的问题。
而Resilience4j是断路器思想的落地实现者。Resilience4j是一个轻量级容错框架,提供了断路器,限流器,重试,隔离等功能。
熔断:断路
核心注解:@CircuitBreaker 加在对应方法上
隔离:舱壁
含义:用于限并发,实现依赖隔离和负载保护,限制对于下游服务的最大并发数量。
Resilience4j提供了两种隔离的实现方式,可以限制并发执行的数量。
SemaphoreBulkhead
使用了信号量
FixedThreadPoolBulkhead
使用了有界队列和固定大小线程池
核心注解:@Bulkhead 加在对应方法上
限流:速率限制
限流,就是通过对并发访问/请求进行限速,或者对一个时间窗口内的请求进行限速,以保护应用系统,一旦达到限制速率则可以拒绝服务、排队或等待、降级等处理。
Resilience4j使用令牌桶算法来实现限流。
核心注解:@RateLimiter 加在对应方法上
中文手册介绍
使用示例
代码涉及测试:
1.基于数量和基于时间的滑动窗口断路器测试
2.信号量舱壁和线程池舱壁测试
3.限流测试
服务熔断和降级Sentinel
Sentinel简介
是什么
随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件
,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护
等多个维度来帮助开发者保障微服务的稳定性
。
属于 SpringCloud Alibaba。
基本概念
1.资源
资源是 Sentinel 的关键概念。它可以是 Java 应用程序中的任何内容,例如,由应用程序提供的服务,或由应用程序调用的其它应用提供的服务,甚至可以是一段代码。
只要通过 Sentinel API 定义的代码,就是资源,能够被 Sentinel 保护起来。大部分情况下,可以使用方法签名,URL,甚至服务名称作为资源名来标示资源
。
2.规则
围绕资源的实时状态设定的规则,可以包括流量控制规则、熔断降级规则以及系统保护规则。所有规则可以动态实时调整。
原理
流控
熔断
热点
热点即经常访问的数据,很多时候我们希望统计或者限制某个热点数据中访问频次最高的TopN数据,并对其访问进行限流或者其它操作
授权
在某些场景下,需要根据调用接口的来源判断是否允许执行本次请求。此时就可以使用Sentinel提供的授权规则来实现,Sentinel的授权规则能够根据请求的来源判断是否允许本次请求通过。
在Sentinel的授权规则中,提供了 白名单与黑名单 两种授权类型。白放行、黑禁止
官方中文wiki
使用示例
Sentinel软件后台运行:
Sentinel软件前台页面展示
各类规则配置界面,配置后看进行相应测试
服务链路追踪Micrometer+Zipkin
Micrometer、Zipkin简介
是什么
Micrometer是一套完整的分布式链路追踪解决方案。能将一次分布式请求还原成调用链路,进行日记记录和性能监控。
Zipkin是一种分布式链路跟踪系统图形化的工具,Zipkin 是 Twitter 开源的分布式跟踪系统,能够收集微服务运行过程中的实时调用链路信息,并能够将这些调用链路信息展示到Web图形化界面上供开发人员分析,开发人员能够从ZipKin中分析出调用链路中的性能瓶颈,识别出存在问题的应用程序,进而定位问题和解决问题。
原理
一条链路追踪会在每个服务调用的时候加上Trace ID 和 Span ID。
链路通过TraceId唯一标识,Span标识发起的请求信息,各span通过parent id 关联起来 (Span:表示调用链路来源,通俗的理解span就是一次请求信息)
Micrometer官方介绍
Zipkin官方介绍
使用示例
通过80订单服务调用8001服务提供者,通过Micrometer收集链路信息,通过Zipkin展示。
启动Zipkin后台
http://localhost:9411/
访问Zipkin前台,可以看到每个方法的调用时长
Zipkin中可以看到请求链路
服务网关Gateway
Gateway简介
是什么
Cloud全家桶中有个很重要的组件就是网关,在1.x版本中都是采用的Zuul网关;
但在2.x版本中,zuul的升级一直跳票,SpringCloud最后自己研发了一个网关SpringCloud Gateway替代Zuul,那就是SpringCloud Gateway一句话:gateway是原zuul1.x版的替代
Spring Cloud Gateway组件的核心是一系列的过滤器,通过这些过滤器可以将客户端发送的请求转发(路由)到对应的微服务。 Spring Cloud Gateway是加在整个微服务最前沿的防火墙和代理器,隐藏微服务结点IP端口信息,从而加强安全保护
。Spring Cloud Gateway本身也是一个微服务,需要注册进服务注册中心。
客户端向 Spring Cloud Gateway 发出请求。然后在 Gateway Handler Mapping 中找到与请求相匹配的路由,将其发送到 Gateway Web Handler。Handler 再通过指定的过滤器链来将请求发送到我们实际的服务执行业务逻辑,然后返回。
在架构图中的位置
作用
1.路由:
隐藏端口、隐秘URI等,保护后端真实端口和地址;路由转发;
2.断言:
匹配HTTP中所有的请求内容,请求与断言相匹配则进行路由。
自带After/Before/Header/Method Route Predicate等组件。可以实现某个时间点之前有效、某个时间点后有效、请求头中参数是否符合预期、请求方法是否匹配。
3.过滤:
可以再请求被路由前或者之后对请求进行修改。
自带Add/RemoveRequestHeader、Add/RemoveRequestParameter等组件。可以实现在请求头中添加或删除参数、在请求过程中增加或者删除请求参数等。
官网地址
使用示例
微服务8001为服务提供者,对外暴露时希望套一层9527网关。
测试实现路由、断言、过滤的功能测试。
1.路由:端口修改、动态获取服务URI
2.断言:测试After/Before/Header/Method Route Predicate的使用
3.过滤:测试Add/RemoveRequestHeader、Add/RemoveRequestParameter等过滤功能的使用
分布式事务Seata
Seata简介
Apache Seata(incubating) 是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务。
属于 SpringCloud Alibaba。
原理
ASeata对分布式事务的协调和控制是通过XID加上TC-TM-RM来完成的。XID是全局事务的唯一标识。TC可以简单理解为Seata本身;TM理解为微服务模块的发起者;RM则是mysql数据库本身。
三个组件相互协作,TC以Seata 服务器(Server)形式独立部署,TM和RM则是以Seata Client的形式集成在微服务中运行
流程:
- TM 向 TC 申请开启一个全局事务,全局事务创建成功并生成一个全局唯一的 XID;
- XID 在微服务调用链路的上下文中传播;
- RM 向 TC 注册分支事务,将其纳入 XID 对应全局事务的管辖;
- TM 向 TC 发起针对 XID 的全局提交或回滚决议;
- TC 调度 XID 下管辖的全部分支事务完成提交或回滚请求。
官方中文介绍
使用示例
模拟一个购物场景:总共涉及订单、库存、账户服务。用户下单后,生成一个订单,并远程调用扣减相应的库存和账户余额。这里会涉及一个分布式事务场景,要求整个链路支持正常业务和异常回滚。
涉及的微服务:
启动seata后台
测试时Seata前台展示:
可以观测到xid/transactionId/resourceId之间的关系
SpringCloud资料下载
前面对SpringCloud相关技术作了整体介绍,但篇幅有限因此并未细节展开。如果要深入学习,推荐配套课程和手敲代码学习。
配套课程为B站免费的尚硅谷2024年的SpringCloud课程。配套课程-尚硅谷周阳老师
SpringCloud整套课程涉及的微服务如下
配套70页Word笔记如下
以上涉及的文档笔记、代码、软件均可在windows下正常使用和运行。可以通过关注以下公众号并回复springcloud
即可获取网盘链接,该公众号仅用于免费资源分享。
公众号名称:Java侠客
觉得文章有帮助可以点个赞或关注支持一下哟~