微服务远程调用Feign

目录

RPC概述

什么是Feign?

Ribbon&Feign对比

Feign的设计架构

Spring Cloud Alibaba快速整合Feign

Spring Cloud Feign扩展

日志配置

契约配置

通过拦截器实现参数传递

自定义拦截器实现认证逻辑

超时时间配置


RPC概述

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

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

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

什么是Feign?

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

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

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


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);

Feign的设计架构

   

Spring Cloud Alibaba快速整合Feign

1)引入依赖

<!-- openfeign 远程调用 -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

2)编写调用接口+@FeignClient注解

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

3)调用端在启动类上添加@EnableFeignClients注解

@SpringBootApplication
@EnableFeignClients  //扫描和注册feign客户端的beanDefinition
public class MallUserFeignDemoApplication {public static void main(String[] args) {SpringApplication.run(MallUserFeignDemoApplication.class, args);}
}

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

@RestController
@RequestMapping("/user")
public class UserController {@AutowiredOrderFeignService orderFeignService;@RequestMapping(value = "/findOrderByUserId/{id}")public R  findOrderByUserId(@PathVariable("id") Integer id) {//feign调用R result = orderFeignService.findOrderByUserId(id);return result;}
}

 Feign 的继承特性可以让服务的接口定义单独抽出来,作为公共的依赖,以方便使用。


Spring Cloud Feign扩展

日志配置

1)定义一个配置类,指定日志级别

// 注意: 此处配置@Configuration注解就会全局生效,如果想指定对应微服务生效,就不能配置@Configuration
@Configuration
public class FeignConfig {/*** 日志级别* @return*/@Beanpublic Logger.Level feignLoggerLevel() {return Logger.Level.FULL;}
}

通过源码可以看到日志等级有 4 种,分别是:

  • NONE【性能最佳,适用于生产】:不记录任何日志(默认值)。
  • BASIC【适用于生产环境追踪问题】:仅记录请求方法、URL、响应状态代码以及执行时间。
  • HEADERS:记录BASIC级别的基础上,记录请求和响应的header。
  • FULL【比较适用于开发及测试环境定位问题】:记录请求和响应的header、body和元数据。

2) 局部配置,让调用的微服务生效,在@FeignClient 注解中指定使用的配置类

3) 在yml配置文件中配置 Client 的日志级别才能正常输出日志,格式是"logging.level.feign接口包路径=debug"

logging:level:feign: debug

局部配置可以在yml中配置

feign:client:config:mall-order:  #对应微服务loggerLevel: FULL

契约配置

       Spring Cloud 在 Feign 的基础上做了扩展,可以让 Feign 支持 Spring MVC 的注解来调用。原生的 Feign 是不支持 Spring MVC 注解的,如果想在 Spring Cloud 中使用原生的注解方式来定义客户端也是可以的,通过配置契约来改变这个配置,Spring Cloud 中默认的是 SpringMvcContract。

1)修改契约配置,支持Feign原生的注解

/*** 修改契约配置,支持Feign原生的注解* @return*/
@Bean
public Contract feignContract() {return new Contract.Default();
}

注意:修改契约配置后,OrderFeignService 不再支持springmvc的注解,需要使用Feign原生的注解。

2)OrderFeignService 中配置使用Feign原生的注解

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

3)也可以通过yml配置契约

feign:client:config:mall-order:  #对应微服务loggerLevel: FULLcontract: feign.Contract.Default   #指定Feign原生注解契约配置

通过拦截器实现参数传递

       通常我们调用的接口都是有权限控制的,很多时候可能认证的值是通过参数去传递的,还有就是通过请求头去传递认证信息,比如 Basic 认证方式。

Feign 中可以直接配置 Basic 认证

@Configuration  // 全局配置
public class FeignConfig {@Beanpublic BasicAuthRequestInterceptor basicAuthRequestInterceptor() {return new BasicAuthRequestInterceptor("zhangsan", "123456");}
}

扩展点: feign.RequestInterceptor

每次 feign 发起http调用之前,会去执行拦截器中的逻辑。

public interface RequestInterceptor {/*** Called for every request. Add data using methods on the supplied {@link RequestTemplate}.*/void apply(RequestTemplate template);
}

使用场景:统一添加 header 信息、对body中的信息做修改或替换。

自定义拦截器实现认证逻辑

public class FeignAuthRequestInterceptor implements RequestInterceptor {@Overridepublic void apply(RequestTemplate template) {// 业务逻辑String access_token = UUID.randomUUID().toString();template.header("Authorization",access_token);}
}@Configuration  // 全局配置
public class FeignConfig {@Beanpublic Logger.Level feignLoggerLevel() {return Logger.Level.FULL;}/*** 自定义拦截器* @return*/@Beanpublic FeignAuthRequestInterceptor feignAuthRequestInterceptor(){return new FeignAuthRequestInterceptor();}
}

也可以在yml中配置

feign:client:config:mall-order:  #对应微服务requestInterceptors[0]:  #配置拦截器com.tuling.mall.feigndemo.interceptor.FeignAuthRequestInterceptor

超时时间配置

         通过 Options 可以配置连接超时时间和读取超时时间,Options 的第一个参数是连接的超时时间(ms),默认值是 2s;第二个是请求处理的超时时间(ms),默认值是 5s。

全局配置

@Configuration
public class FeignConfig {@Beanpublic Request.Options options() {return new Request.Options(5000, 10000);}
}

yml中配置

feign:client:config:mall-order:  #对应微服务# 连接超时时间,默认2sconnectTimeout: 5000# 请求处理超时时间,默认5sreadTimeout: 10000

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

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

相关文章

计算机设计大赛 深度学习卷积神经网络垃圾分类系统 - 深度学习 神经网络 图像识别 垃圾分类 算法 小程序

文章目录 0 简介1 背景意义2 数据集3 数据探索4 数据增广(数据集补充)5 垃圾图像分类5.1 迁移学习5.1.1 什么是迁移学习&#xff1f;5.1.2 为什么要迁移学习&#xff1f; 5.2 模型选择5.3 训练环境5.3.1 硬件配置5.3.2 软件配置 5.4 训练过程5.5 模型分类效果(PC端) 6 构建垃圾…

数字电路 第一章—第二节(逻辑代数的基本概念、公式和定理)

一、基本逻辑关系举例 1、电路图 &#xff08;1&#xff09;与逻辑关系&#xff1a; &#xff08;2&#xff09;或逻辑关系&#xff1a; &#xff08;3&#xff09;非逻辑关系&#xff1a; 2、真值表 &#xff08;1&#xff09;在上述三种电路中&#xff0c;经过设定变量和状…

Nginx知识笔记

一、前言 首先&#xff0c;我们来看一张关于正向代理和反向代理的图片 简单理解正向代理和反向代理的概念&#xff1a; 正向代理&#xff1a;在客户端配置代理服务器(和跳板机功能类似&#xff0c;比如公司很多机器需要通过跳板机才允许登录&#xff0c;正向代理的典型用途是…

开源模型应用落地-工具使用篇-向量数据库进阶(四)

一、前言 通过学习"开源模型应用落地"系列文章&#xff0c;我们成功地建立了一个完整可实施的AI交付流程。现在&#xff0c;我们要引入向量数据库&#xff0c;作为我们AI服务的二级缓存。本文将继续基于上一篇“开源模型应用落地-工具使用篇-向量数据库&#xff08;三…

游泳耳机品牌排行榜前十名:十大爆款火热机型超高性价比

在当今这个科技日新月异的时代&#xff0c;游泳已经不再仅仅是一项简单的运动&#xff0c;而是一种生活方式的体现。随着人们对于健康生活的追求日益增强&#xff0c;游泳耳机也成为了许多游泳爱好者的必备装备之一。然而&#xff0c;市场上琳琅满目的游泳耳机品牌和型号让人眼…

网络安全8-11天笔记

内容安全&#xff1a; 攻击可能只是一个点&#xff0c;防御需要全方面进行。 IAE引擎&#xff1a; DFI和DPI技术&#xff1a;深度检测技术 DPI——深度包检测技术&#xff1a;主要针对完整的数据包&#xff08;数据包分片&#xff0c;分段需要重组&#xff09;&#xff0c;之…

2024年阿里云服务器优惠价格表和活动整理

2024阿里云服务器优惠活动政策整理&#xff0c;轻量2核2G3M服务器61元一年、2核4G4M带宽165元1年&#xff0c;云服务器4核16G10M带宽26元1个月、149元半年&#xff0c;阿里云ECS云服务器2核2G3M新老用户均可99元一年续费不涨价&#xff0c;企业用户2核4G5M带宽199元一年&#x…

Excel之index、MATCH面试题、VLOOKUP函数,

VLOOKUP() 在表格的首列查找指定的数值&#xff0c;并返回表格当前行中指定列处的数值。 结构&#xff1a;VLOOKUP(查找值,查找区域,列序数,匹配条件) 解释&#xff1a;VLOOKUP(找谁,在哪里找,第几列,0或1) 1.目的&#xff1a;根据【产品】查找【销量】 公式&#xff1a;V…

C++从入门到精通 第十二章(C++流)

写在前面&#xff1a; 本系列专栏主要介绍C的相关知识&#xff0c;思路以下面的参考链接教程为主&#xff0c;大部分笔记也出自该教程&#xff0c;笔者的原创部分主要在示例代码的注释部分。除了参考下面的链接教程以外&#xff0c;笔者还参考了其它的一些C教材&#xff08;比…

Vue 图片轮播第三方库 介绍

Vue图片轮播是一种在网页上以自动或手动方式展示图片的组件&#xff0c;常用于产品展示、网站banner等场景。有许多第三方库可以帮助Vue开发者轻松实现图片轮播功能。以下是一些流行的Vue图片轮播第三方库的介绍&#xff1a; 1. Vue-awesome-swiper - **简介**&#xff1a;V…

滚雪球学Java(70):深入理解Java中的PriorityQueue底层实现与源码分析

咦咦咦&#xff0c;各位小可爱&#xff0c;我是你们的好伙伴——bug菌&#xff0c;今天又来给大家普及Java SE相关知识点了&#xff0c;别躲起来啊&#xff0c;听我讲干货还不快点赞&#xff0c;赞多了我就有动力讲得更嗨啦&#xff01;所以呀&#xff0c;养成先点赞后阅读的好…

Linux之ACL权限管理

文章目录 1.ACL权限介绍二、操作步骤1. 添加测试目录、用户、组&#xff0c;并将用户添加到组2. 修改目录的所有者和所属组3. 设定权限4. 为临时用户分配权限5. 验证acl权限6. 控制组的acl权限 1.ACL权限介绍 每个项目成员有一个自己的项目目录&#xff0c;对自己的目录有完全…

【Django】Django自定义后台表单——对一个关联外键对象同时添加多个内容

以官方文档为例&#xff1a; 一个投票问题包含多个选项&#xff0c;基本的表单设计只能一个选项一个选项添加&#xff0c;效率较低&#xff0c;如何在表单设计中一次性添加多个关联选项&#xff1f; 示例代码&#xff1a; from django.contrib import adminfrom .models impo…

森林安全新保障:智能高压应急消防泵的应用

随着城市化进程的加快&#xff0c;森林资源的保护和利用日益受到重视。然而&#xff0c;森林火灾时有发生&#xff0c;给生态环境带来严重破坏。为了有效应对森林火灾&#xff0c;保障森林资源安全&#xff0c;智能高压森林应急消防泵应运而生&#xff0c;成为守护绿色生命的钢…

Python列表:灵活多变的数据结构

文章目录 一、列表1.创建列表2.访问列表元素3.修改列表元素4.添加元素5.删除元素 二、列表脚本操作符1.连接运算符 2.重复运算符 * 三、列表函数&方法1.函数1.1 len() 函数1.2 max() 函数1.3 min() 函数1.4 sum() 函数1.5 list() 函数 2.方法2.1 append() 方法2.2 extend()…

DSL Query基本语法

DSL Query基本语法 查询的基本语法如下&#xff1a; GET /indexName/_search {"query":{"查询类型":{"查询条件":"条件值"}} }查询所有 GET /indexName/_search {"query":{"match_all":{}} }match查询&#xf…

2、Web攻防-SQL注入-联合查询注入

用途&#xff1a;个人学习笔记&#xff0c;有所借鉴&#xff0c;欢迎指正&#xff01; 声明&#xff1a;只用于学习交流&#xff0c;点到为止&#xff0c;请勿非法测试。 概念&#xff1a; 联合查询注入&#xff1a;联合注入是回显注入的一种&#xff0c;也就是说联合注入的前…

Gemma模型论文详解(附源码)

原文链接&#xff1a;Gemma模型论文详解&#xff08;附源码&#xff09; 1. 背景介绍 Gemma模型是在2023.2.21号Google新发布的大语言模型, Gemma复用了Gemini相同的技术(Gemini也是Google发布的多模态模型)&#xff0c;Gemma这次发布了了2B和7B两个版本的参数&#xff0c;不…

嵌入式Linux中apt、apt-get命令用法汇总

在Linux环境开发过程中接触ubuntu虚拟机时&#xff0c;在安装软件或者更新软件时apt和apt-get命令使用相对较频繁&#xff0c;下面对这两个命令的用法进行汇总。 apt&#xff08;Advanced Package Tool&#xff09;和 apt-get 是用于在基于 Debian 的 Linux 发行版中进行软件包…

什么是favicon.ico图标?如何在线生成ICO图标?如何安装favicon.ico图标?

在本站首页的活跃博客中经常看到有部分博客网站没有 favicon.ico 图标&#xff0c;所以今天打算普及一下相关知识&#xff0c;希望还没有 favicon.ico 图标的博主们&#xff0c;能够制作出自己独特的图标。 那么到底什么是favicon.ico&#xff1f; 好搜百科给出的解释&#xf…