SpringCloud微服务架构详解二

远程调用 Feign

​ Feign是一个Spring Cloud 提供的 http 客户端组件,用于使用 http 协议访问远程服务;能够让我们调用远程服务像调用本地服务一样方便。

1、在pom.xml文件中加入Feign 的依赖

<!--fegin组件-->
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

2、在启动类上贴**@EnableFeignClient**扫描注解

@SpringBootApplication
@EnableFeignClients
public class OrderServer {
    
    
    public static void main(String[] args) {
    
    
        SpringApplication.run(OrderServer.class,args);
    }
}

3、提供一个接口API

/**
 * 专门用于调用商品服务的接口
 * \@FeignClient 标识这个类是 Feign 的客户端
 * 当这个接口被扫描到时, 就会自动创建为 Feign 客户端代理对象
 *
 * 大致实现原理:
 *  1 扫描所有的 \@FeignClient 注解的接口, 创建代理对象, 并且以 name 作为服务 id
 *  2 当调用该代理类中的任意方法时, 获取到 \@RequestMapping 中的请求地址, 以及对应的请求参数
 *  3 给予服务 id 从注册中心获取到对应的服务访问地址
 *  4 利用负载均衡算法, 获取到服务调用的服务地址,并构建请求路径和参数
 *  5 发起 http 请求到远程服务
 *  6 将远程服务返回的 json 字符串转换为方法返回类型的对此昂, 并进行返回
 	
 	注意:参数列表需要贴上相应的注解
 		a、路径参数:@PathVariable
 		b、表单参数(普通类型):@RequestParam
 		c、自定义对象:@RequestBody
 */
@FeignClient(name = "product-service")
public interface ProductFeignApi {
    
    

    @RequestMapping("/product/{pid}")
    Product findByPid(@PathVariable("pid") Long pid);
}

4、在具体使用业务的地方,注入属性后直接调用findById方法即可

服务熔断降级 Sentinel

3.1、高并发带来的问题

​ 由于网络原因不能保证服务100%可用,如果一个服务出现问题,调用这个服务就会出现网络延迟,此时若有大量网络涌入,会形成任务堆积最终导致服务瘫痪。

3.2、服务雪崩效应

雪崩效应:由于服务与服务之间的依赖性,故障会传播,会对整个微服务系统造成灾难性的严重后果。

雪崩发生的原因多种多样,不合理的容量设计、高并发下某一服务相应变慢、某一台机器资源耗尽。无法完全杜绝雪崩的源头,只有做到尽可能减小容错。

在这里插入图片描述

3.3、常见的容错方案

3.3.1、隔离机制

​ 比如服务A有100个线程,此时服务A可能给服务B分配90个线程,服务C和D总共分配10个线程,倘若此时服务A挂掉了,那么服务B、C、D也就处于等待瘫痪状态;现在在服务A中划分三个服务分别服务于A、B、C,即使服务A中的某一个服务故障,那么服务A、B、C中至少还有两个可以正常提供服务。

在这里插入图片描述

3.3.2、超时机制

​ 在上游服务调用下游服务的时候,设置一个最大响应时间,如果超过这个时间,下游未作出反应,就断开请求,释放掉线程。

在这里插入图片描述

3.3.3、限流机制

​ 限流就是限制系统的输入和输出流量以达到保护系统的目的。保证系统的稳固运行,一旦达到需要的阈值,就需要限制流量并采取少量措施已完成限制流量的目的、

在这里插入图片描述

3.3.4、熔断机制

​ 当下游服务因访问压力过大而响应变慢或失败,上游服务为了保护系统整体的可用性,暂时切断对下游服务的调用。这种牺牲局部保全整体的措施就叫熔断

在这里插入图片描述

熔断的三种状态

  • 熔断关闭状态(Closed):熔断器没有故障时所处状态,不受任何限制。
  • 熔断开启状态(Open):后续对该服务接口的调用不再经过网络,直接执行本地的fallback方法。
  • 半熔断状态(Half-Open):尝试恢复服务,若成功率达到预期,服务恢复进入熔断关闭状态;成功率低则重新进入熔断关闭状态。

3.3.5、降级机制

​ 就是微服务提供的一个兜底方案,一旦服务无法正常调用就是用兜底方案。

在这里插入图片描述

Sentinel 入门

4.1、Sentinel 简介

Sentinel:是阿里开源的一套服务容错的综合性解决方案。提供了面向流控/熔断降级/系统维度的容错方案控制。

Sentinel 中的两大核心

  • 核心库(Java 客户端)能运行于所有Java运行时环境
  • 控制台(Dashboard)基于SpringBoot开发,打包后直接运行,不需要Tomcat等容器。

4.2、安装Sentinel控制台

1、在破灭.xml中引入sentinel依赖

<!--sentinel组件-->
<dependency>
	<groupId>com.alibaba.cloud</groupId>
	<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

2、下载jar包 https://github.com/alibaba/Sentinel/releases

3、启动控制台

# 直接使用jar命令启动项目(控制台本身是一个SpringBoot项目) 
java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.0.jar

4、在application.yml配置文件中添加以下配置:

spring:
  cloud:
    sentinel: 
      transport: 
        port: 9999 #跟控制台交流的端口,随意指定一个未使用的端口即可 
        dashboard: localhost:8080 # 指定控制台服务的地址

5、通过浏览器访问localhost:8080 进入控制台 ( 默认用户名密码是 sentinel/sentinel )

在这里插入图片描述

Sentinel 容错维度

在这里插入图片描述

流量控制:调整网络包的数据,请求随机不可控系统处理能力有限,因此需要根据系统的处理能力对流量进行控制。

熔断降级:检测到某个资源不稳定时,对此资源限制,让请求快速失败,避免其他资源受到影响而导致级联故障。如请求时间长等

系统负载保护:提供系统维度的自适应保护能力。负载较高的情况下持续请求会导之系统崩溃,无法响应。

Sentinel 规则种类

5.1、流控规则(重点)

流量控制:监控应用流量的QPS(每秒查询率)或并发线程数等指标,当达到阈值对流量进行控制,避免瞬间流量高峰。

三种流控模式

  • 直接(默认):接口达到限流条件时,开启限流
  • 关联:当关联的资源达到限流条件时,开启限流[适当做应用让步]
  • 链路:当从某个接口过来的资源达到限流条件时,开启限流

5.2、熔断规则(重点)

三个衡量条件:

  • 慢调用比例:以慢调用比例作为阈值,需要设置RT(最大响应时间),请求响应时间大于阈值为慢调用,单位之间内请求数大于最小请求数且调用比例大于阈值,接下来请求自动熔断。
  • 异常比例:单位时间内请求数目大于最小请求数目且异常比例大于阈值,请求自动熔断。熔断器进入探测恢复状态,若接下来的一个请求成功则结束熔断,否则再次被熔断。
  • 异常数:单位时间内异常数大于阈值自动熔断。熔断器进入探测恢复状态,若接下来的一个请求成功则结束熔断,否则再次被熔断。

5.3、热点规则

热点:经常访问的数据

在很多时候需要统计某个热点数据中访问频次最高的 TOP K数据,并对其访问进行限制。如统计一段时间内最常购买的商品并进行控制。

5.4、授权规则

通过开源访问控制(黑白名单控制)的功能来决定该次请求是否放行。只有请求源于白名单内才能通过,源于黑名单内不能通过。

5.5、系统规则

是从应用级别的入口流量进行控制,监控单台机器的load、CPU使用率、平均RT、入口QPS和并发线程数几个指标,让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性。

猜你喜欢

转载自blog.csdn.net/weixin_49137820/article/details/128244801