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());