Java之Springcloud Feign组件详解

 更新时间:2021年08月10日 11:14:24   作者:深情以改  
这篇文章主要介绍了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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java字节码中jvm实例用法

    Java字节码中jvm实例用法

    在本篇文章里小编给大家整理的是一篇关于Java字节码中jvm实例用法内容,有兴趣的朋友们可以学习参考下。
    2021-02-02
  • Java泛型通配符的使用详解

    Java泛型通配符的使用详解

    本文主要介绍了Java泛型通配符的使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • Java编程之继承问题代码示例

    Java编程之继承问题代码示例

    这篇文章主要介绍了Java编程之继承问题代码示例,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • Java8新特性之Stream使用详解

    Java8新特性之Stream使用详解

    这篇文章主要介绍了Java8新特性之Stream使用详解,流是用来处理集合中的数据,以声明的形式操作集合,它就像SQL语句,我们只需告诉流需要对集合进行什么操作,它就会自动进行操作,并将执行结果交给你,无需我们自己手写代码,需要的朋友可以参考下
    2023-08-08
  • MyBatis延迟加载策略深入探究

    MyBatis延迟加载策略深入探究

    本文主要为大家详细介绍下mybatis的延迟加载,从原理上介绍下怎么使用、有什么好处能规避什么问题。感兴趣的小伙伴可以跟随小编一起学习一下
    2022-07-07
  • 详解SpringBoot restful api的单元测试

    详解SpringBoot restful api的单元测试

    本篇文章主要介绍了详解SpringBoot restful api的单元测试,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • Netty分布式ByteBuf缓冲区分配器源码解析

    Netty分布式ByteBuf缓冲区分配器源码解析

    这篇文章主要为大家介绍了Netty分布式ByteBuf缓冲区分配器源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-03-03
  • 利用 SpringBoot 在 ES 中实现类似连表查询功能

    利用 SpringBoot 在 ES 中实现类似连表查询功能

    这篇文章主要介绍了如何利用 SpringBoot 在 ES 中实现类似连表的查询功能,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • Spring boot框架JWT实现用户账户密码登录验证流程

    Spring boot框架JWT实现用户账户密码登录验证流程

    这篇文章主要介绍了Springboot框架JWT实现用户账户密码登录验证,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-06-06
  • Springboot+Vue+axios实现文章收藏功能

    Springboot+Vue+axios实现文章收藏功能

    这篇文章主要为大家详细介绍了Springboot+Vue+axios实现文章收藏功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08

最新评论