Spring Cloud feign实现服务间的调用

feign简介

Feign是一个http请求调用的轻量级框架,可以以java接口注解的方式调用http请求,而不用像java中通过封装HTTP请求报文的方式直接调用。Feign通过处理注解,将请求模板化,当实际调用的时候,传入参数,根据参数再应用到请求上,进而转化成真正的请求,这种请求相对而言比较直观。

服务间的调用

需求背景:eureka注册中心已经搭建好,现在有两个微服务之间想要进行通信,并且这两个微服务都已经在eureka中注册好了,也就是说fin服务想要调用mal服务中的接口,那该如何实现。

步骤(fin  调用  api的接口  调用  mal逻辑):
1、api的pom.xml添加依赖

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

2、fin启动类添加注解

@EnableHystrix
@EnableFeignClients

3、api添加接口及熔断类  mal添加逻辑

(1)api添加接口及熔断类

@FeignClient注解用于指定从哪个服务中调用功能,注意里面的名称与被调用的服务名称保持一致,并且不能包含下划线。
@GetMapping注解用于对被调用的微服务进行地址映射。

@FeignClient(value = "ttie-provider-mal", fallback = SaleOrderFeignHystrix.class)
public interface SaleOrderFeignApi {

    @GetMapping(value = "/api/mal/getSaleOrder")
    DataResp<SaleOrderVo> getSaleOrder(@RequestParam(value = "orderNo") String orderNo);
    
}

在分布式系统中,每个服务都可能会调用很多其他服务,被调用的那些服务就是依赖服务,有的时候某些依赖服务出现故障也是很正常的。
Hystrix 可以让我们在分布式系统中对服务间的调用进行控制,加入一些调用延迟或者依赖故障的容错机制。
Hystrix 通过将依赖服务进行资源隔离,进而阻止某个依赖服务出现故障时在整个系统所有的依赖服务调用中进行蔓延;同时Hystrix 还提供故障时的 fallback 降级机制。
总而言之,Hystrix 通过这些方法帮助我们提升分布式系统的可用性和稳定性。

如果需要访问导致回退触发的原因,可以使用@FeignClient内的fallbackFactory属性。

@Component
public class SaleOrderFeignHystrix implements SaleOrderFeignApi {

    @Override
    public DataResp<SaleOrderVo> getSaleOrder(String orderNo) {
        return DataResp.fail(ErrorCodeEnum.E000002, "商品订单");
    }
    
}

当api调用mal失败或超时时,就会返回错误信息;熔断配置默认为关闭,如果使用需要启动;

修改mal的application.yml文件,enabled: true

feign:
  client:
    config:
      default:
        connect-timeout: 5000
        read-timeout: 15000
  hystrix:
    enabled: true

(2) mal添加业务逻辑

@RefreshScope
@RestController
@Api(tags = "API - 销售订单相关接口")
public class SaleOrderFeignClient implements SaleOrderFeignApi {
    @Autowired
    private SaleOrderService saleOrderService;

    @Override
    public DataResp<SaleOrderVo> getSaleOrder(String orderNo) {

        //具体业务逻辑

        return DataResp.ok(saleOrderVo);
    }
    
}

4、fin  调用  api

    @Lazy
    @Autowired
    private SaleOrderFeignApi saleOrderFeignApi;

    DataResp<SaleOrderVo> saleOrderResp = saleOrderFeignApi.getSaleOrder(servOrderVo.getSaleNo());

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值