Java之Springcloud Feign组件详解

网友投稿 275 2022-12-20

Java之Springcloud Feign组件详解

一、Feign是什么?

OpenFeign是Spring Cloud提供的一个声明式的伪Hltp客户端,它使得调用远程服务就像调用本地服务一样简单,只需要创建一个接口并添加一个注解即可,Nacos很好的兼容了OpenFeign,OpenFeign默认集成了Ribbon,

所以在Nacos下使用OpenFeign默认就实现了负载均衡的效果。

二、使用步骤

1.消费方导入依赖

c

org.springframework.cloud

spring-cloud-starter-openfeign

2.服务消费方的主程序启动类添加注解,开启@EnableFeignClients

@SpringBootApplication

@MapperScan("com.csqf.mapper")

@Import({

Swagger2Config.class,

ControllerExceptionAdvice.class,

})

@EnableFeignClients

public class springcloud_share_6002 {

public static void main(String[] args) {

SpringApplication.run(springcloud_share_6002.class,args);

}

@Bean

@LoadBalanced

public RestTemplate restTempdvctIjpClate(){

return new RestTemplate();

}

}

3.服务消费方 创建远程调用接口

@Service

@FeignClient("user-6001")

public interface UserFeignService {

@GetMapping("/api/user/{id}")

public R getUserNameById(@PathVariable("id") Integer id);

}

代码如下(示例):

4.更改代码后测试

@RedvctIjpCstController

@RequestMapping("/api/share")

public class ShareContoller {

@Autowired

private ShareServiceImpl shareService;

// @Autowired

// private RestTemplate restTemplate;

// @Autowired

// private DiscoveryClient discoveryClient;

@Autowired

private UserFeignService userFeignService;

@GetMapping("/{id}")

public R getShareById(@PathVariable("id") Integer id) {

Share share = shareService.getShareById(id);

R r = userFeignService.getUserNameById(share.getUserId());

String s = r.getData().toString();

ShareDto shareDto = new ShareDto();

BeanUtils.copyProperties(share,shareDto);

shareDto.setUserName(s);

return new R(ResponseEnum.SUCCESS,shareDto);

}

}

补充

1.重试机制

1:如果所有的重试完成 还是失败 要抛出 feign.RetryableException 异常

2: 重试 会产生接口的幂等性问题:

1:查询的接口 天生是幂等的

2: 增删改的处理 非幂等的

配置

说明

hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds

断路器的超时时间需要大于ribbon的超时时间,不然不会触发重试。

hello-service.ribbon.ConnectTimeout

请求连接的超时时间

hello-service.ribbon.ReadTimeout

请求处理的超时时间

hello-service.ribbon.OkToRetryOnAllOperations

是否对所有操作请求都进行重试

hello-service.ribbon.MaxAutoRetriesNextServer

重试负载均衡其他的实例最大重试次数,不包括首次server

2 远程调用的时候出现异常的处理(ControllerExceptionAdvice)

@ExceptionHandler(RetryableException.class)

@ResponseBody

public R doException(RetryableException ex){

ex.printStackTrace();

// System.out.println("抛出未知异常");

return new R(ResponseEnum.FEIGN_RETRY,null);

}

3.Feign的传递参数方式注意事项

如果你传递的参数,比较复杂时,默认会采用POST的请求方式。

传递单个参数时,推荐使用@PathVariable,如果传递的单个参数比较多,这里也可以采用@RequestParam,不要省略value属性

传递对象信息时,统一采用json的方式,添加@RequestBody。Client接口必须采用@RequestMapping

spring cloud项目使用feign的时候都会发现一个问题,就是get方式无法解析对象参数。其实feign是支持对象传递的,但是得是Map形式,而且不能为空,与spring在机制上不兼容,因此无法使用。

spring cloud在2.1.x版本中提供了@SpringQueryMap注解,可以传递对象参数,框架自动解析。

调用方feign接口只能是

被调用方接口

public R f1(User user) 或 public R f1(@RequestBoby User user)

参数 @RequstBoby 对象

public R f1(@SpringQueryMap User user)

参数 对象

总结

FEIGN 集成ribbon 和 resttemplate,简化 服务之间的调用

Feign是通过内置的Ribbon进行负载均衡,并通过HTTP去访问被调用方,所以Feign的重试,其实就是Ribbon的重试。另外,我们在实际工作中使用Feign,用到Hystrix,在这里就顺便说一下Hystrix的原理。举例说明下,假如在没有Hystrix的情况下,用户一个下单操作需要调用订单、支付、物流三个服务,如果其中物流Service因为种种问题不能提供服务,即便另外两个服务都好好的,整个下单操作也会因为物流Service而阻塞住,导致下单服务崩溃。而Hystrix为每个依赖的服务配置独立的线程池并进行隔离,假设下单服务有90个线程,没有Hystrix,则因为物流Service不能提供服务,不停地重试直到90个线程全卡死。而有了Hystrix,三个依赖的服务,每个30个线程,即便物流的30个全部阻塞了,也不影响另外两个服务的线程。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:SparkSQL使用快速入门
下一篇:如何使用IDEA开发Spark SQL程序(一文搞懂)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~