Feign实战-Springboot集成OpenFeign Demo以及参数详解

2023-09-20 22:12:00

最近整理一下微服务的文章,先拿一直用的OpenFeign开刀

思考:微服务之间如何方便优雅的实现服务间的远程调用

一、说说openFeign是什么吧?

说到这个,那不得不先说说RPC

1.什么是RPC

RPC 全称是 Remote Procedure Call ,即远程过程调用,其对应的是我们的本地调用。RPC 的目的是:让我们调用远程方法像调用本地方法一样

//本地调用
R result = orderService.findOrderByUserId(id);
//RPC远程调用  orderService为代理对象
R result = orderService.findOrderByUserId(id);

 

RPC框架设计架构

2. 什么是Feign

Feign是Netflix开发的声明式、模板化的HTTP客户端,Feign可帮助我们更加便捷、优雅地调用HTTP API。

Feign可以做到使用 HTTP 请求远程服务时就像调用本地方法一样的体验,开发者完全感知不到这是远程方法,更感知不到这是个 HTTP 请求。它像 Dubbo 一样,consumer 直接调用接口方法调用 provider,而不需要通过常规的 Http Client 构造请求再解析返回数据。它解决了让开发者调用远程接口就跟调用本地方法一样,无需关注与远程的交互细节,更无需关注分布式环境开发。

Spring Cloud openfeign对Feign进行了增强,使其支持Spring MVC注解,另外还整合了Ribbon和Eureka,从而使得Feign的使用更加方便。

2.1 OpenFeign和Feign的区别

Feign

Feign是SpringCloud组件中的一个轻量级RESTful的Http服务客户端,Feign内置了Ribbon,用来做客户端负载均衡,去调用服务注册中心的服务。Feign的使用方式是:使用Feign的注解定义接口,调用这个接口,就可以调用服务注册中心的服务。

OpenFeign

OpenFeign是SpringCloud在Feign的基础上支持了SpringMVC的注解,如@RequestMapping等。OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务。

 

2.2 Ribbon&Feign对比

Ribbon+RestTemplate进行微服务调用

@Bean
@LoadBalanced
public RestTemplate restTemplate() {
    return new RestTemplate();
}

//调用方式
String url = "http://mall-order/order/findOrderByUserId/"+id;
R result = restTemplate.getForObject(url,R.class);

Feign进行微服务调用

@FeignClient(value = "mall-order",path = "/order")
public interface OrderFeignService {
    @RequestMapping("/findOrderByUserId/{userId}")
    public R findOrderByUserId(@PathVariable("userId") Integer userId);
}

//调用
@Autowired
OrderFeignService orderFeignService;
//feign调用
R result = orderFeignService.findOrderByUserId(id);

2.3 Feign的设计架构 

二、Spring Cloud Alibaba快速整合Feign

下面是Springboot集成OpenFeign Demo,完全照着来妥妥的没问题

服务提供者我就不写了,这就是正常的controller,主要是调用者这块,接下来写的也是这个

1.在pom.xml文件中添加以下依赖

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

2.调用端添加启动注解 @EnableFeignClients

@EnableAsync
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class, DruidDataSourceAutoConfigure.class })
@EnableDiscoveryClient
@EnableFeignClients  //扫描和注册feign客户端的beanDefinition
@MapperScan("com.**.**.**.**.mapper")
public class Application {

	public static void main(String[] args) {
		SpringApplication.run(Application.class, args);
	}
}

3.编写调用接口+@FeignClient注解

创建一个FeignClient接口,用于定义要调用的远程服务的方法:

@FeignClient(value = "base-application", path = "/base")
@RequestMapping("/api/testDemo")
public interface OpenFeignBaseDemo {

    @PostMapping("/queryList")
    String queryList(@RequestBody JSONObject jsonObject);
}

在上面的代码中,我们使用@FeignClient注解指定了要调用的远程服务的名称。然后,我们定义了一个名为queryList的方法,并使用@PostMapping注解指定了要调用的远程服务的API路径。

4.发起调用,像调用本地方式一样调用远程服务

在其他类中使用OpenFeignBaseDemo 来调用远程服务的方法

@RestController
@RequestMapping("/openFeignDemo")
public class OpenFeignControllerDemo {

    @Autowired
    private OpenFeignBaseDemo openFeignBase;

    @PostMapping(value = "/test", produces = { "application/json;charset=utf-8" })
    public ResponseEntity test(@RequestBody JSONObject jsonObject) {
        //feign调用
        String res = openFeignBase.queryList(jsonObject);
        return new ResponseEntity(res, HttpStatus.OK);
    }

}

5.结果预览

启动两个工程,postmain调用 请求url :localhost:8088/server/openFeignDemo/test。

6.这里我必须强调一下第3步这个参数设置的含义

public @interface FeignClient {
    @AliasFor("name")
    String value() default "";

    String contextId() default "";

    @AliasFor("value")
    String name() default "";

    String qualifier() default "";

    String url() default "";

    boolean decode404() default false;

    Class<?>[] configuration() default {};

    Class<?> fallback() default void.class;

    Class<?> fallbackFactory() default void.class;

    String path() default "";

    boolean primary() default true;
}

下面就对各个属性进行分析

value、name
value和name的作用一样,如果没有配置url那么配置的值将作为服务名称,用于服务发现。反之只是一个名称。

contextId
我们不想将所有的调用接口都定义在一个类中,有一种解决方案就是为每个Client手动指定不同的contextId,这样就不会冲突了。

url
url用于配置指定服务的地址,相当于直接请求这个服务,不经过Ribbon的服务选择。像调试等场景可以使用。

decode404
当调用请求发生404错误时,decode404的值为true,那么会执行decoder解码,否则抛出异常。

configuration
configuration是配置Feign配置类,在配置类中可以自定义Feign的Encoder、Decoder、LogLevel、Contract等。

fallback
定义容错的处理类,也就是回退逻辑,fallback的类必须实现Feign Client的接口,无法知道熔断的异常信息。

fallbackFactory
也是容错的处理,可以知道熔断的异常信息。

path
path定义当前FeignClient访问接口时的统一前缀,比如接口地址是/user/get, 如果你定义了前缀是user, 那么具体方法上的路径就只需要写/get 即可。

primary
primary对应的是@Primary注解,默认为true,官方这样设置也是有原因的。当我们的Feign实现了fallback后,也就意味着Feign Client有多个相同的Bean在Spring容器中,当我们在使用@Autowired进行注入的时候,不知道注入哪个,所以我们需要设置一个优先级高的,@Primary注解就是干这件事情的。

qualifier
qualifier对应的是@Qualifier注解,使用场景跟上面的primary关系很淡,一般场景直接@Autowired直接注入就可以了。

7.报错解决

如果遇到这样的错误:feign.RetryableException: Read timed out executing POST 

可以做如下处理:yaml配置

feign:
  client:
    config:
      default:
        connectTimeout: 1000
        readTimeout: 6000

或者propertis配置

feign.client.config.default.connect-timeout=20000
feign.client.config.default.read-timeout=20000  

https://cloud.spring.io/spring-cloud-openfeign/reference/html/

更多推荐

java版工程管理系统Spring Cloud+Spring Boot+Mybatis实现工程管理系统源码

工程项目管理软件(工程项目管理系统)对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营,全过程、全方位的对项目进行综合管理工程项目各模块及其功能点清单一、系统管理1、数据字典:实现对数据字典标签的增删改查操作2、编码管理:实现对系统编码的增删改查操作3、用户管理:管理和查看用户角

MYSQL04高级_逻辑架构剖析、查询缓存、解析器、优化器、执行器、存储引擎

文章目录①.逻辑架构剖析②.服务层-查询缓存③.服务层-解析器④.服务层-优化器⑤.服务层-执行器⑥.MySQL8执行原理①.逻辑架构剖析①.服务器处理客户端请求②.连接层系统(客户端)访问MySQL服务器前,做的第一件事就是建立TCP连接经过三次握手建立连接成功后,MySQL服务器对TCP传输过来的账号密码做身份认证

Windows/Linux(命令、安装包和源码安装)平台各个版本QT详细安装教程

前言本文章主要介绍了Windows/Linux平台下,QT4,QT5,QT6的安装步骤。为什么要把QT版本分开介绍呢,因为这三个版本,安装步骤都不一样。Windows平台,QT4的QtCreator,QT库和编译器是分开的,需要分别单独下载安装。QT5将QtCreator,QT库和编译器都集成到了一起,只需要下载安装包

如何在 Excel 中计算日期之间的天数

计算两个日期之间的天数是Excel中的常见操作。无论您是规划项目时间表、跟踪时间还是分析一段时间内的趋势,了解如何在Excel中查找日期之间的天数都可以提供强大的日期计算功能。幸运的是,Excel提供了多种简单的方法来获取两个日期之间的天数。继续阅读以了解在Excel中计算日期差异的不同公式和函数。为什么在Excel中

Java实现添加文字水印、图片水印功能实战

java实现给图片添加水印实现步骤:获取原图片对象信息(本地图片或网络图片)添加水印(设置水印颜色、字体、坐标等)处理输出目标图片java实现给图片添加文字水印获取原图片对象信息第一步:获取需要处理的图片获取图片的方式,通常由两种:一种是通过下载到本地,从本地读取(本地图片);另外一种是通过网络地址进行读取(网络图片)

Ribbon负载均衡

文章目录1.Ribbon2.负载均衡原理1.服务端负载均衡2.客户端负载均衡3.负载均衡流程4.负载均衡策略5.自定义负载均衡策略1.代码方式2.配置文件方式6.饥饿加载1.RibbonSpringCloudRibbon是一套基于NetflixRibbon实现的客户端负载均衡和服务调用工具。Ribbon是一个基于HTT

SpringBoot的学习要点

黑马程序员SpringBoot2全套视频教程,springboot零基础到项目实战(springboot2完整版)_哔哩哔哩_bilibili博客阅读:Microservices中文文档:SpringBoot中文文档spring官网:https://start.spring.io/thymeleaf官方文档阅读(英文版

Unity中Shader实现模板测试Stencil

文章目录前言一、UI中的遮罩1、Mask——>模板测试2、RectMask2D——>UNITY_UI_CLIP_RECT二、模板缓冲区Stencil一般是和Pass平行的部分,Pass部分写的是颜色缓冲区Stencil:Comp(比较操作)Pass(模版缓冲区的更新)三、实际使用1、在使用模板缓冲区前,需要如下图设置一

在 Windows 上安装 NodeJS

🎬岸边的风:个人主页🔥个人专栏:《VUE》《javaScript》⛺️生活的理想,就是为了理想的生活!目录安装vm-windows、node.js和npm替代版本管理器安装VisualStudioCode替换代码编辑器安装Git使用适用于Linux的Windows子系统进行生产如果你不熟悉如何使用Node.js进行

开始在 Windows 上使用 Next.js

🎬岸边的风:个人主页🔥个人专栏:《VUE》《javaScript》⛺️生活的理想,就是为了理想的生活!目录必备条件安装Next.js本指南帮助你安装Next.jsWeb框架并在Windows上启动和运行。Next.js是一个框架,用于基于React.js、Node.js、Webpack和Babel.js创建由服务器

黑马头条 热点文章实时计算、kafkaStream

热点文章-实时计算1今日内容1.1定时计算与实时计算1.2今日内容kafkaStream什么是流式计算kafkaStream概述kafkaStream入门案例Springboot集成kafkaStream实时计算用户行为发送消息kafkaStream聚合处理消息更新文章行为数量替换热点文章数据2实时流式计算2.1概念一

热文推荐