服务调用与服务容错保护
SpringCloud Alibaba Feign
Feign
Feign是Netflix开源的声明式HTTP客户端。
首先加入spring-cloud-start-openfeign
依赖,并在主类上加入 @EnableFeignClients 注解。为需要调用的微服务创建接口,在上面加上 @FeignClient(name = “serviceId”)。
Feign通过整合Ribbon实现了负载均衡。
Feign的组成
Feign细粒度配置自定义(日志级别)
java代码配置
配置专属的日志信息,就将配置在对应的ClientFeign中
//要配置feign的日志信息,就需要配置configuration类
@FeignClient(name = "serviceId" , configuration = feignConfiuration.class)
public interface feignClient{
@GetMapping("/xxx")
T findxxx(String param1);
}
//这个类如果加了@Configuration,就必须在主类之外的包中编写
//会涉及到父子上下文覆盖的问题
//会将所有的Feign全部都打印出来
public class feignConfiuration(){
@Bean
public Logger.leval leval(){
return Logger.leval.FULL;
//让Feign打印所有请求细节
}
}
logger:
leval:
feignClient: debug #这里要配置FeignClient的路径,并且配置成debug才能显示所有FULL的日志.
细粒度配置自定义-配置文件方式
feign:
client:
config:
user-center: #这里是想要调用的微服务名称
loggerLevel: full # 级别
配置文件的方式相当于配置类
全局配置自定义
全局配置是可以将所有的Feign的日志进行配置的方式,主要有两种,第一种是使用ComponentScan进行父子上下文的扫描,进行重叠,第二种是进行全局配置。
java实现
//在主类的EnableFeignClients上加入我们之前配置的Feign配置类即可
@EnableFeignClients(default = FeignConfiguration.class)
配置文件实现
feign:
client:
config:
default: #这里改成default
loggerLevel: full # 级别
Feign支持的配置项
注解支持
Java配置支持
Feign的继承(在不同的微服务中定义相同的接口)
我们在使用微服务之间相互调用时,总会遇到这样的问题,微服务A定义了一些对外的接口,微服务B要调用这个接口中的某些方法,并且两个需要统一返回类型,如DTO。
这时如果创建一个接口,微服务A(服务提供者)实现该接口,微服务B(服务调用者)继承该接口,将这个接口建立在一个Maven项目中并将其打成jar包,在微服务A、B中都使用它,这样就可以实现微服务共通的作用。
这样带来的好处是明显的,不用额外的再去创建一些与自己业务无关的代码,又有着充足的文档,一般来说很多公司使用。
官方的建议是不要这样使用,这样会加强微服务之间的耦合程度。
多参数请求构造
Feign脱离Ribbon使用(服务未注册在Nacos上)
@FeignClint(name = "xxxx" , url = "http:www.baidu.com")
public interface testBaiduClient{
@GetMapping("")
String index();
}
//只要写上url后,就可以调用外部的Url进行使用
RestTemplate与Feign
尽量使用Feign,杜绝使用RestTemplate
Feign的优化
- 使用连接池 ( 引入HttpClient依赖 )
- 设置相应的日志级别(不使用性能最好)
Feign常见问题总结
SpringCloud Alibaba Sentinel
微服务之间的调用失败,会造成级联的失败,最终导致雪崩效应。解决雪崩的方法就是使用断路器,在SpringCloud中使用Hystrix,而在SpringCloud Alibaba中使用的是Sentinel进行服务降级以及熔断策略。
常见容错方案
- 超时:规定一定的时间,超时没有请求到就关闭当前线程
- 限流:当流量超过了所设定的限制时,就将其抛出
- 仓壁模式:每个服务相互隔离,不阻碍其他服务的工作
- 断路器模式:错误率、错误次数达到一个阈值,就执行预定的策略处理。断路器三态转换(开启、关闭、半开闭)
Sentinel实现服务容错
Sentinel使用
添加依赖spring-cloud-starter-alibaba-sentinel
,使用actuator提供的端点可以访问到sentinel。
Sentinel控制台
首先到https://github.com/alibaba/Sentinel/releases
下载sentinel的控制台并启动对应的jar包,其次到微服务中配置。
spring:
cloud:
sentinel:
transport:
#指定sentinel的控制台地址,小心冲突
dashboard: 8080
控制台三种限流方式 直接(微服务级别)、关联(当关联的资源达到阈值,就限流自己)、链路(只记录指定链路上的流量 API级别)。
Warm Up(经过预热的时间才会达到阈值,适合秒杀类似的)。
排队等待:匀速排队,让请求以均匀的速度通过,阈值类型必须设置成QPS,否则无效,不是直接拒绝,而是等待。
添加@SentinelResource("xxxx")
,这里要在调用的API上添加,以便于用来指定限流方式中的链路以及热点规则。
热点规则中参数的类型必须是基础数据类型或者是String。