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 restTemplate(){ return new RestTemplate(); } }
3.服务消费方 创建远程调用接口
@Service @FeignClient("user-6001") public interface UserFeignService { @GetMapping("/api/user/{id}") public R getUserNameById(@PathVariable("id") Integer id); }
代码如下(示例):
4.更改代码后测试
@RestController @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个全部阻塞了,也不影响另外两个服务的线程。
到此这篇关于Java之Springcloud Feign组件详解的文章就介绍到这了,更多相关Java之Springcloud Feign内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Spring Boot获取resources目录下的文件三种方式详解
在Spring Boot项目中,经常需要获取resources目录下的文件,这些文件可以包括配置文件、模板文件、静态资源等,这篇文章主要介绍了Spring Boot获取resources目录下的文件的三种方式,需要的朋友可以参考下2023-06-06Spring Data JPA框架快速入门之自定义Repository接口
Spring Data JPA是Spring基于JPA规范的基础上封装的⼀套 JPA 应⽤框架,可使开发者⽤极简的代码即可实现对数据库的访问和操作,本篇我们来了解Spring Data JPA框架的自定义Repository接口2022-04-04SpringBoot浅析安全管理之Spring Security配置
安全管理是软件系统必不可少的的功能。根据经典的“墨菲定律”——凡是可能,总会发生。如果系统存在安全隐患,最终必然会出现问题,这篇文章主要介绍了SpringBoot安全管理Spring Security基本配置2022-08-08Spring Boot 整合 Apache Dubbo的示例代码
Apache Dubbo是一款高性能、轻量级的开源 Java RPC 框架,这篇文章主要介绍了Spring Boot 整合 Apache Dubbo的方法,本文通过示例说明给大家讲解的非常详细,需要的朋友可以参考下2021-07-07java算法入门之有效的括号删除有序数组中的重复项实现strStr
大家好,我是哪吒,一个热爱编码的Java工程师,本着"欲速则不达,欲达则欲速"的学习态度,在程序猿这条不归路上不断成长,所谓成长,不过是用时间慢慢擦亮你的眼睛,少时看重的,年长后却视若鸿毛,少时看轻的,年长后却视若泰山,成长之路,亦是渐渐放下执念,内心归于平静的旅程2021-08-08
最新评论