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

news2024/9/25 23:20:19

最近整理一下微服务的文章,先拿一直用的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/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1026610.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

程序员还在为兼职接单发愁,快看看这几个宝藏平台吧!!!

在当今经济发展压力巨大的背景下&#xff0c;总有人还在与生活顽强对抗&#xff0c;拿什么和生活对抗嘞&#xff0c;那当然只有马内咯&#xff0c;尤其是对于程序员而言&#xff0c;现在内卷严重&#xff0c;如果能做一点线上兼职搞点马内&#xff0c;那岂不美哉&#xff0c;如…

计算机毕业设计 基于SpringBoot餐厅点餐系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

Android ANR问题触发机制

1 Anr类型 ​ Anr一般有四种类型。 1.1 input dispatching timeout ​ 主要时按键或触摸屏事件在5s内没有响应。这个时间在ActivityManagerService中定义。 C:\Users\wangjie\AppData\Local\Android\Sdk\sources\android-32\com\android\server\am\ActivityManagerService.…

嵌入式学习 - 用电控制电

目录 前言&#xff1a; 1、继电器 2、二极管 3、三极管 3.1 特殊的三极管-mos管 3.2 npn类型三极管 3.3 pnp类型三极管 3.4 三极管的放大特性 3.5 mos管和三极管的区别 前言&#xff1a; 计算机的工作的核心原理&#xff1a;用电去控制电。 所有的电子元件都有数据手册…

window隐私保护设置(win10)

window隐私保护设置(win10) 1、文件夹选项中&#xff0c;把隐私模块中关于快速访问的选项√去掉 2、个性化中开始模块根据需要关闭需要的选项&#xff0c;最后一个可以关闭任务栏应用历史记录 小尾巴~~ 只要有积累&#xff0c;就会有进步

Multispectral and hyperspectral image fusion in remote sensing: A survey

遥感中的多光谱和高光谱图像融合:一项调查 把融合方法分为:全色锐化、基于分解、基于机器学习;总结了常用数据集和性能评估指标;提出未解决的问题绘制指导方针。 针对这一任务,有叫多光谱与高光谱融合、高光谱超分辨率、高光谱锐化、超锐化 全色锐化相关方法 HS和MS图像…

牛客网Verilog刷题 | 快速入门-基础语法

1、VL1 四选一多路器 描述 制作一个四选一的多路选择器&#xff0c;要求输出定义上为线网类型 状态转换&#xff1a; d0 11 d1 10 d2 01 d3 00 信号示意图&#xff1a; 输入描述&#xff1a; 输入信号 d1,d2,d3,d4 sel 类型 wire 输出描述&#xff1a; 输出信号 mux_ou…

抖音seo优化排名源码搭建

抖音seo优化排名技术开发源码搭建&#xff1a; 思路&#xff1a;看上去比较简单&#xff0c;貌似使用 get、set 这两个 trap 就可以&#xff0c;但实际上并不是。实际上还需要实现 has, ownKeys , getOwnPropertyDescriptor 这些 trap&#xff0c;这样就能最大限度的限制私有属…

语义分割——灰度图像转伪彩色图像

目录 检验灰度图检验代码 灰度图转伪彩色图代码转换代码使用细则 示例转换结果总结 检验灰度图 制作语义分割数据集或用训练好模型测试图像时&#xff0c;得到的结果是灰度图像&#xff0c;如下&#xff1a; 检验代码 上面图像灰度值不是全是全为0&#xff0c;灰度范围在[0…

接口测试工具Postman使用实践

一、接口定义 软件不同部分之间的交互接口。通常就是所谓的API――应用程序编程接口&#xff0c;其表现的形式是源代码。 —— [ 百度百科 ] 我们常说的接口一般指两种&#xff1a; &#xff08;1&#xff09;API&#xff1a;应用程序编程接口。程序间的接口 &#xff08;2…

Docker与Kubernetes集成以实现云原生应用程序:云原生在线教育平台

文章目录 项目概述项目架构项目步骤项目收益 &#x1f388;个人主页&#xff1a;程序员 小侯 &#x1f390;CSDN新晋作者 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 ✨收录专栏&#xff1a;云计算 ✨文章内容&#xff1a;云原生在线教育平台 &#x1f91d;希望作者的文…

【Zabbix】Zabbix结合WxPusher推送告警消息

WxPusher简单介绍 什么是WxPusher WxPusher (微信推送服务)是一个使用微信公众号作为通道的&#xff0c;实时信息推送平台&#xff0c;你可以通过调用API的方式&#xff0c;把信息推送到微信上&#xff0c;无需安装额外的软件&#xff0c;即可做到信息实时通知。 你可以使用W…

【Spring Cloud系列】Feign详解与实战

Feign详解与实战 文章目录 Feign详解与实战一、概述二、什么是Feign三、Feign特性四、Feign简单使用3.1 Feign使用步骤3.2 Feign具体使用1. 引入依赖2. 启动类上添加注解3.编写FeignClient接口 五、使用Feign发起http请求5.1 Maven导入Feign配置&#xff0c;并集成Jackson5.2 F…

如何理解功率谱/能量谱密度?它与自相关函数的关系?

目录 1. 自相关函数&#xff1a; 2.功率谱密度 /能量谱密度 什么是 能量信号&#xff1f; 什么是 功率信号&#xff1f; 什么是 能量谱密度&#xff1f; 什么是 功率谱密度&#xff1f; 3.自相关函数 与 能量谱密度/功率谱密度 的关系&#xff1f; 4.周期性的功率信号的 功…

安卓ROM定制 修改必备常识-----初步了解system系统分区文件夹的基本含义 【二】

安卓修改rom 固件 修改GSI 移植rom 必备常识 lib--**so文件基本解析 一起来了解system目录相应文件的用途吧。&#xff08;rom版本不同里面的app也会不一样&#xff09; 简单打开img格式后缀文件 给大家说下最简单的方法提取img里面的文件&#xff0c;对于后缀img格式的文件可…

实现过滤词汇高亮

js实现过滤词汇高亮 场景代码 场景 前端实现查询后&#xff0c;将过滤后数据中的搜索词展现为高亮。 代码 思路&#xff1a;利用 正则表达式 对过滤词添加类名&#xff0c;然后使用 v-html 渲染在表格中。 // 复制json数组copyObjectDataList(arr) {let list [];_.each(arr…

(2021|PMLR,DALL·E,自回归,Transformer)零样本文本到图像生成

Zero-Shot Text-to-Image Generation 公众号&#xff1a;EDPJ&#xff08;添加 VX&#xff1a;CV_EDPJ 或直接进 Q 交流群&#xff1a;922230617 获取资料&#xff09; 目录 0. 摘要 1. 简介 2. 方法 2.1. 第一阶段&#xff1a;学习视觉码本 2.2. 第二阶段&#xff1a…

23种设计模式汇总详解

设计原则 中文名称英文名称含义解释单一职责原则Single Responsibility Principle(SRP)任何一个软件模块都应该只对某一类行为者负责一个类只干一件事&#xff0c;实现类要单一开闭原则Open-Close Principle(OCP)软件实体&#xff08;类、模块、函数等&#xff09;应该是可以扩…

vmware NAT模式配置方式

VMware在NAT模式下宿主机与多台虚拟机互相访问&#xff0c;可连接外网 虚拟机的网络连接类型的选择&#xff0c;网络连接类型一共有桥接、NAT、仅主机和不联网四种。 桥接&#xff1a;选择桥接模式的话虚拟机和宿主机在网络上就是平级的关系&#xff0c;相当于连接在同一交换机…

飞行动力学 - 第30节-滚转收敛模态机理及飞行品质 之 基础点摘要

飞行动力学 - 第30节-滚转收敛模态机理及飞行品质 之 基础点摘要 1. 典型横航向响应2. 滚转收敛模态机理3. 滚转收敛模态近似4. 滚转收敛品质要求5. 参考资料 1. 典型横航向响应 2. 滚转收敛模态机理 3. 滚转收敛模态近似 横航向扰动之后首先体现的是重阻尼的滚转收敛模态 飞…