公司动态

SpringcloudAlibaba详解---超详细

📅 2026/8/28 12:41:48
SpringcloudAlibaba详解---超详细
简介–Spring Cloud Alibaba是阿里巴巴结合自身的微服务实践开源的微服务全家桶我个人觉得其组件比Spring Cloud 中的组件更加好用和强大。并且对的Spring Cloud组件做了很好的兼容。比如在Spirng Cloud Alibaba中依然可以使用Feign作为服务调用方式使用Eureak做服务注册发现等等。主要功能----1.服务注册和发现(nacos)可以注册服务并且客户可以使用Spring托管的bean自动集成功能区发现实例。注册中心。2.分布式配置nacos支持分布式系统中的外部配置配置更改时自动刷新。 配置中心3.流控制和服务降级(Sentinel )支持WebServletWebFlux–(比Springmvc更高级)OpenFeignRestTemplateDubbo访问限制和降级流的功能。它可以在运行时通过控制台实时修改限制和降级流的规则并且还支持监视限制和降级度量标准。 - 服务熔断限流hystrix4.Rpc服务扩展Spring Cloud客户端RestTemplate(ribbon)和OpenFeign以支持调用Dubbo RPC服务。5.分布式事务seata支持高性能且易于使用的分布式事务解决方案。6.事件驱动支持构建与共享消息系统连接的高度可扩展的事件驱动微服务。7.阿里云对象存储大规模安全低成本高度可靠的云存储服务。支持随时随地在任何应用程序中存储和访问任何类型的数据。8.阿里云SchedulerX准确高度可靠高可用性的计划作业调度服务响应时间在几秒钟内。9.阿里云短信阿里云短信服务覆盖全球提供便捷高效智能的通信功能帮助企业快速联系客户。与奈飞对比-----注册中心nacos---------### 什么是nacosNacos致力于帮助您发现配置和管理微服务。它提供了一组简单有用的功能使您能够实现动态服务发现服务配置服务元数据和流量管理。Nacos使构建交付和管理微服务平台变得更容易更快捷。它是通过微服务或云原生方法支持以服务为中心的现代应用程序体系结构的基础架构。说的通俗一些就是承担了奈飞框架中的Eureka的功能相当于注册中心但比Eureka更加智能与便捷。### 如何安装nacos官方提供了Nacos的服务端供我们下载使用我们启动Nacos后将我们的微服务注册进入Nacos即可。下载地址[https://github.com/alibaba/nacos/releases]启动nacosnacos的启动也十分方便在下载好的jar包目录下执行- windows执行bin目录下的startup命令 startup.cmd -m standalone-linux 执行 sh startup.sh -m standalone启动成功页面如下所示nacos的默认端口为8848在启动成功后用户即可访问nacos访问地址为:(本地单机模式)http://127.0.0.1:8848/nacos/index.html登录的账号和密码均为:nacos登录成功页面如图所示(笔者这里已经注册好了几个服务故会有信息第一次登录且未将服务注册到nacos的话这里是没有信息的)### 服务架构简单搭建### 举例服务项目结构### 微服务调用流程Order-Service-20010提供订单的查询服务Order-Client-30010调用Order-Service-20010提供的服务查询自身的订单信息Order-Common作为公共服务提供了相关实体类以及对应的无参有参构造方法### 项目搭建父工程的pom.xml project.build.sourceEncodingUTF-8/project.build.sourceEncoding project.reporting.outputEncodingUTF-8/project.reporting.outputEncoding java.version1.8/java.version org.springframework.boot spring-boot-starter-parent 2.2.5.RELEASE com.alibaba.cloud spring-cloud-alibaba-dependencies 2.2.1.RELEASE pom import org.springframework.cloud spring-cloud-dependencies Hoxton.SR3 pom import junit junit 4.12 org.projectlombok lombok 1.18.12 ### 服务注册到nacos#### Order-Service-20010配置##### 添加依赖 com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery ##### 编写启动类 SpringBootApplication EnableDiscoveryClient public class OrderServerStart { public static void main(String[] args) { SpringApplication.run(OrderServerStart.class); } } ##### 编写配置文件yml server: port: 20010 spring: application: name: Order-server cloud: nacos: discovery: server-addr: 127.0.0.1:8848 #### Order-Client-30010配置##### 添加依赖 com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery ##### 编写启动类 SpringBootApplication EnableDiscoveryClient EnableFeignClients public class OrderClientStart { public static void main( String[] args ) { SpringApplication.run(OrderClientStart.class); } } ##### 编写配置文件yml server: port: 30010 spring: application: name: Order-client cloud: nacos: discovery: server-addr: 127.0.0.1:8848启动成功后nacos当中便会看见注册成功的服务Nacos配置中心---------### 客户端接入配置中心#### 概述在《SpringCloud极简入门》中我们通过Spring Cloud Config作为统一配置文件管理中心其实我们总结一下发现Spring Cloud Config使用起来总归比较麻烦。Nacos作为Spring Cloud Alibaba的一个重要组件它不仅可以用作服务注册与发现也可以用来替代Spring Cloud Config作为统一配置文件管理而且他的使用更为简单和人性化。#### 如何实现点击页面左上角的“按钮即可添加新的配置不过需要注意的是编写的后缀改为yaml,在项目中要将application.yml,修改为bootstrap.yml并在内部进行相关的配置#### 导入依赖 com.alibaba.cloud spring-cloud-starter-alibaba-nacos-config com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery org.springframework.boot spring-boot-starter-web org.example springcloudalibaba-user-common 1.0-SNAPSHOT #### 配置Controller RefreshScope //刷新配置 RestController public class UserController { Value(”KaTeX parse error: Expected EOF, got } at position 228: …r; } }̲#### 修改yml配置以修改…{temp.notify}“) private String notify; Autowired private OrderOpenFeignClient feignClient; //限制的资源 SentinelResource(value “getUser”,blockHandler “LimitResource”) // 给资源取名user后续通过名字来进行限流 GetMapping(”/{id}“) public User getUser(PathVariable(“id”) Long id){ //发起远程调用 List orders feignClient.getList(id); int inew Random().nextInt(2); System.out.println(1/i); User user new User(id,“root”notify ,orders); return user; } public User LimitResource(PathVariable(“id”) Long id,BlockException e){ e.printStackTrace(); return new User(-1L,“限流了”,null); } } #### 如何设置限流在sentinel的当前页面点击对应资源的流控按钮进行流控策略的配置。这里单机阈值设置为1表示1s内的访问量超过一次则会触发限流效果。系统便会执行自己设定的LimitResource方法笔者这里便不附上运行截图了配置十分简单配置完成也不需要重启服务直接进行接口访问压测即可。### Sentinel流控效果#### 快速失败快速失败:(RuleConstant.CONTROL_BEHAVIOR_DEFAULT)是默认的流控方式当流量达到阀值直接返回异常QPS达到任何规则阈值后后续请求就会立即拒绝并抛出FlowException 异常。简单理解并发太高直接请求拒绝#### warmup预热Warm Up预热:(RuleConstant.CONTROL_BEHAVIOR_WARM_UP)方式根据codeFactor默认3的值从阀值/codeFactor为初始阀值经过预热时长才到达设置的QPS的阀值即预热/冷启动方式。简单理解慢慢的增大处理并发的能力#### 排队等待排队等待(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER)忽然增加的请求并发量达到了限流阈值后续请求会被拒绝有时候我们可能更希望后续的请求可以加入队列进行排队慢慢执行而不是直接拒绝请求这种方式后严格控制请求通过的时间间隔也即是让请求以均匀的速度通过对应的是漏桶算法这种方式主要用于处理间隔性突发的流量例如消息队列。 简单理解突发流量处理不过来让请求排队。Sentinel熔断----------### 概述#### 什么是熔断Sentinel除了流控还提供了服务熔断和降级机制服务之间的调用关系错综复杂微服务的调用链上的某些服务资源不稳定(宕机异常超时)可能会导致可能请求的失败和请求的堆积调用链产生连锁反应可能会导致整个微服务架构瘫痪。服务熔断降级机制是保障高可用的重要措施之一。#### Sentinel熔断Sentinel的服务熔断机制会对调用链上的某个不稳定(宕机异常超时)的资源做出请求限制快速失败避免影响到其它的服务而导致级联错误。资源熔断后在后续的一定时间(时间窗口)之内对该服务的请求都自动熔断抛出 DegradeException异常。Sentinel拥有比Hystrix更强大和丰富的功能能满足我们的各种应用场景并且经历过淘宝双十一的考验是微服务架构中熔断机制的不二选择。### 熔断规则#### 平均响应RT平均响应时间 (DEGRADE_GRADE_RT)当资源的平均响应时间超过阈值DegradeRule 中的 count以 ms 为单位之后资源进入准降级状态。如果接下来 1s 内持续进入 5 个请求即 QPS 5它们的 RT 都持续超过这个阈值那么在接下的时间窗口DegradeRule 中的 timeWindow以 s 为单位之内对这个方法的调用都会自动地熔断抛出 DegradeException。注意 Sentinel 默认统计的 RT 上限是 4900 ms超出此阈值的都会算作 4900 ms若需要变更此上限可以通过启动配置项 -Dcsp.sentinel.statistic.max.rtxxx 来配置。#### 异常比例异常比例(DEGRADE_GRADE_EXCEPTION_RATIO)每秒请求量 5 ,当资源的每秒异常总数占通过量的比值超过阈值DegradeRule 中的 count之后资源进入降级状态即在接下的时间窗口DegradeRule 中的 timeWindow以 s 为单位之内对这个方法的调用都会自动地返回。异常比率的阈值范围是 [0.0, 1.0]代表 0% - 100%。#### 异常数异常数 (DEGRADE_GRADE_EXCEPTION_COUNT)当资源近 1 分钟的异常数目超过阈值之后会进行熔断。注意由于统计时间窗口是分钟级别的若 timeWindow 小于 60s则结束熔断状态后仍可能再进入熔断状态。#### 慢调用比例熔断策略慢调用比例是以慢调用数量的比例作为阈值首先需要设置最大 RT即最大的响应时间用于鉴定是否是慢调用请求的响应时间大于该值则统计为慢调用。当单位统计时长statIntervalMs内请求数大于设置的最小请求数并且慢调用的比例大于比例阈值则接下来的请求会自动熔断熔断时间为设置的熔断时长。经过熔断时长后熔断器会进入探测恢复状态HALF-OPEN 状态若在HALF-OPEN状态下有一个请求响应时间小于 最大RT 则结束熔断否则继续熔断。### 熔断实战示例#### 导入依赖 org.springframework.cloud spring-cloud-starter-openfeign #### 配置yml feign: sentinel: enabled: true #熔断#### 配置OpenFeign接口 FeignClient(value “Order-server”) public interface OrderOpenFeignClient { GetMapping(”/order/{id}“) public List getList(PathVariable(“id”) Long id); }熔断返回fallback Component public class UserFallBack implements FallbackFactory { Override public OrderOpenFeignClient create(Throwable throwable) { return id -Arrays.asList(new Order(-2L,“服务暂时不可用”,“请您稍后再试”)); } } #### 修改Controller在SentinelResource中添加相关属性值Controller完整代码 RefreshScope RestController RequestMapping(”/user) public class UserController { Value(“${temp.notify}”) private String notify; Autowired private OrderOpenFeignClient feignClient; //限制的资源 SentinelResource(value “getUser”,blockHandler “LimitResource”,blockHandlerClass UserFallback.class, fallback “Error”) // 给资源取名user后续通过名字来进行限流 GetMapping(“/{id}”) public User getUser(PathVariable(“id”) Long id){ //发起远程调用 List orders feignClient.getList(id); int inew Random().nextInt(2); System.out.println(1/i); User user new User(id,“root”notify ,orders); return user; } //方案1 // public User LimitResource(PathVariable(“id”) Long id,BlockException e){ // e.printStackTrace(); // return new User(-1L,“限流了”,null); // } public User Error(PathVariable(“id”) Long id){ return new User(-1L,“熔断数据集”,null); } } 因为在这里写了一个Error方法并且在SentinelResource中添加了fallbackError所以fallback返回的将是Error的内容。测试结果写在最后:SpringCloudAlibaba是一款优秀的微服务架构在市面上有着广泛的应用。这篇文章介绍了SpringCloudAlibaba的一些基本使用适合初学者希望能够给大家带来帮助。笔者小中大厂均有面试经验目前正在从事全栈开发工作坚持每日分享java全栈开发知识与相关的面试真题希望能够给大家带来帮助同大家共同进步