SpringCloud-Feign消费者调用生产者,整合sentinel编写fallback,fallbackFactory降级方法逻辑

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 服务提供者挂了
服务提供者添加代码TimeUnit.SECONDS.sleep(50000)
3 服务提供者程序出错,如果加了try catch就走自己的逻辑,没加就走降级的逻辑
就会走降级逻辑

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值