Feign: 伪RPC客户端(本质还是用httpClient)
ribbon和feign两个的区别和选择
选择feign
a 默认集成了ribbon
b 写起来更加思路清晰和方便
c 采用注解方式进行配置,配置熔断等方式方便
1 按照以往的步骤,先搭建好Eureka注册中心的服务端和客户端
可参考博文 SpringCloud-Eureka 服务注册与发现,搭建 服务端和客户端_eureka注册客户端到服务器-CSDN博客
假如需求:订单服务 调用 产品服务
2 订单服务的项目,添加Feign依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
3 订单服务的项目,启动类上添加注解
//如果FeignClient 在一个工程就用这个
@EnableFeignClients
//如果FeignClient在另个工程里
@EnableFeignClients(basePackages = {"FeignClient接口所在的包"})
4 订单服务的项目,修改配置文件,开启sentinel降级
spring:
cloud:
sentinel:
transport:
# 配置Sentinel 控制台 地址
dashboard: 127.0.0.1:8850
# 应用与Sentinel控制台交互的端口,应用本地会起一个该端口占用的HttpServer
# 默认8719端口,假如端口被占用,依次+1,直到找到未被占用端口
port: 8720
# 开启sentinel对feign的支持
feign:
sentinel:
enabled: true
5 订单服务的项目,写一个接口,用于调用生产者的方法
FeignClient 注意事项 (主要是映射路径,参数):
1 FeignClient 主要参数说明
contextId:要调用的微服务如果写了多个FeignClient,用这个区分,只1个FeignClient,可省
name: 要调用的微服务名称
path : 因 FeignClient不能和RequestMapping同时存在,看示例就知道了
fallback:降级方法的逻辑
fallbackFactory:降级方法的逻辑 【推荐,可以知道异常信息】
2 Http请求方法必须对应,get,post等
3 参数的名称,顺序要对应上
4 @RequestBody 等等这样的注解需要加上,常用的如下
@RequestBody JSON数据
@SpringQueryMap 表单传参pojo
@PathVariable URL参数
@RequestParam 普通表单参数
5 接口定义的方法名可以不一样
//需要调用的服务名称,这里为产品服务
@FeignClient(contextId = "aa",
name = "product-service",
path = "controller层类上面requestMapping的值",
//fallback = ChanPinServiceFallback.class,
fallbackFactory = ChanPinServiceFallbackFactory.class
)
public interface OrderService {
@RequestMapping(value = "/product/find")
public Result findone(@RequestParam(value = "id") int id);
}
//调用产品服务失败时,走的降级逻辑--方案1
@Component
public class ChanPinServiceFallback implements OrderService
{
public Result findone(int id)
{
return "降级";
}
}
//调用产品服务失败时,走的降级逻辑--方案2 (推荐,知道异常信息)
@Component
public class ChanPinServiceFallbackFactory implements FallbackFactory<OrderService > {
@Override
public OrderService create(Throwable cause) {
OrderService orderServiceOpenFeign = new OrderService () {
@Override
public Result findone(int id) {
return Result.build(500,"降级方法--添加---"+cause.getMessage(),null);
}
};
return orderServiceOpenFeign;
}
}
6【看情况】,如果@FeignClient是在一个单独的工程中,ChanPinServiceFallback.class,
ChanPinServiceFallbackFactory.class 需要使用spi的方式引入
A方案:在@FeignClient所在工程的resources目录下,目录META-INF\spring,新建文件org.springframework.boot.autoconfigure.AutoConfiguration.imports,内容就是这两个类的全类名
com.ruoyi.system.api.factory.ChanPinServiceFallback
com.ruoyi.system.api.factory.ChanPinServiceFallbackFactory
B方案:用 spring.factories的方式( 百度下网上一堆),选其中一种方式即可,取决于spring cloud的版本
7 注入feignclient的编写接口,调用即可
@Autowired
private OrderService orderService;
Result getlist = orderService.findone(5);
return getlist;
开始演示调用和降级:
1 服务提供者挂了,
2 服务提供者添加代码TimeUnit.SECONDS.sleep(50000)
3 服务提供者程序出错,如果加了try catch就走自己的逻辑,没加就走降级的逻辑
就会走降级逻辑