微服务调用组件Feign

news2024/11/27 2:19:30

目录

JAVA 项目中如何实现接口调用?

Httpclient

Okhttp

HttpURLConnection

RestTemplate WebClient

什么是Feign

优势

Spring Cloud Alibaba快速整合OpenFeign

引入依赖

编写调用接口+@FeignClient注解

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

发起调用

Spring Cloud Feign的自定义配置及使用

日志配置

​编辑

契约配置

自定义拦截器

超时时间配置

客户端组件配置

配置 OkHttp

GZIP 压缩配置(不建议,会导致传输过程出现数据错误等....)


JAVA 项目中如何实现接口调用?

Httpclient

HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持 Http 协议的客户端编程工具包,并且它支持 HTTP 协议最新版本和建议。HttpClient 相比传统 JDK 自带的 URLConnection,提升了易用性和灵活性,使客户端发送 HTTP 请求变得容易,提高了开发的效率。

Okhttp

一个处理网络请求的开源项目,是安卓端最火的轻量级框架,由 Square 公司贡献,用于替代 HttpUrlConnection 和 Apache HttpClient。OkHttp 拥有简洁的 API、高效的性能,并支持多种协议(HTTP/2 和 SPDY)。

HttpURLConnection

HttpURLConnection 是 Java 的标准类,它继承自 URLConnection,可用于向指定网站发送 GET 请求、POST 请求。HttpURLConnection 使用比较复杂,不像 HttpClient 那样容易使用。

RestTemplate WebClient

RestTemplate 是 Spring 提供的用于访问 Rest 服务的客户端,RestTemplate 提供了多种便捷访问远程 HTTP 服务的方法,能够大大提高客户端的编写效率。

上面介绍的是最常见的几种调用接口的方法,我们下面要介绍的方法比上面的更简单、方便,它就是 Feign。

什么是Feign

Feign是Netflix开发的声明式、模板化的HTTP客户端,其灵感来自Retrofit、JAXRS-2.0以及WebSocket。Feign可帮助我们更加便捷、优雅地调用HTTP API。

Feign支持多种注解,例如Feign自带的注解或者JAX-RS注解等。

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

优势

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

Spring Cloud Alibaba快速整合OpenFeign

引入依赖

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

编写调用接口+@FeignClient注解

应该是调用方里面,写上需要调用的是哪个服务,找到那个机子,然后根据你配的路径以及方法名入参,找到对应的方法进行调用

@FeignClient(value = "mall-order",path = "/order")
public interface OrderFeignService {

    @RequestMapping("/findOrderByUserId/{userId}")
    public R findOrderByUserId(@PathVariable("userId") Integer userId);
}

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

@SpringBootApplication
@EnableFeignClients
public class MallUserFeignDemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(MallUserFeignDemoApplication.class, args);
    }
}

发起调用

像调用本地方式一样调用远程服务

@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    OrderFeignService orderFeignService;

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

Spring Cloud Feign的自定义配置及使用

Feign 提供了很多的扩展机制,让用户可以更加灵活的使用。

日志配置

有时候我们遇到 Bug,比如接口调用失败、参数没收到等问题,或者想看看调用性能,就需要配置 Feign 的日志了,以此让 Feign 把请求信息输出来。

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

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

上面库存和商品都是有日志的,包括请求头和连接时间等等信息 。老师举的例子是一个服务同时调用商品和库存服务

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

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

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

logging:
  level:
    com.tuling.mall.feigndemo.feign: debug

测试:BASIC级别日志

补充:局部配置可以在yml中配置

对应属性配置类: org.springframework.cloud.openfeign.FeignClientProperties.FeignClientConfiguration

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

备注:

修改为debug级别,这里面是只修改了feign的日志级别

契约配置

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

Spring Cloud 1 早期版本就是用的原生Fegin. 随着netflix的停更替换成了Open feign 

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: FULL
        contract: feign.Contract.Default   #指定Feign原生注解契约配置

你在哪个服务下配的,就要修改哪个服务下的注解

自定义拦截器

springMVC的拦截器是客户端到服务端的拦截器

feign的拦截器是调用方向被调用方调用的时候起作用,每次对服务方进行请求的时候,可以对请求头,啥的做一些事情,一般都是在网关层做的

实现认证逻辑(只有请求拦截, 没有响应拦截,有点扯, 响应拦截需要对源码进行重构)

public class FeignAuthRequestInterceptor implements RequestInterceptor {
    @Override
    public void apply(RequestTemplate template) {
        // 业务逻辑
        String access_token = UUID.randomUUID().toString();
        template.header("Authorization",access_token);
    }
}

@Configuration  // 全局配置
public class FeignConfig {
    @Bean
    public Logger.Level feignLoggerLevel() {
        return Logger.Level.FULL;
    }
    /**
     * 自定义拦截器
     * @return
     */
    @Bean
    public FeignAuthRequestInterceptor feignAuthRequestInterceptor(){
        return new FeignAuthRequestInterceptor();
    }
}

测试

补充:可以在yml中配置

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

mall-order端可以通过 @RequestHeader获取请求参数

建议在filter,interceptor中处理

超时时间配置

restTemplate也可以设置超时时间,只不过有ribbon就不用restTemplate了

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

全局配置

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

yml中配置

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

补充说明: Feign的底层用的是Ribbon,但超时时间以Feign配置为准

测试超时情况:

返回结果

客户端组件配置

Feign 中默认使用 JDK 原生的 URLConnection 发送 HTTP 请求,我们可以集成别的组件来替换掉 URLConnection,比如 Apache HttpClient,OkHttp。

Feign发起调用真正执行逻辑:feign.Client#execute (扩展点)

配置Apache HttpClient

引入依赖

<!-- Apache HttpClient -->
<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.7</version>
</dependency>
<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-httpclient</artifactId>
    <version>10.1.0</version>
</dependency>

然后修改yml配置,将 Feign 的 Apache HttpClient启用 :

feign:
  #feign 使用 Apache HttpClient  可以忽略,默认开启
  httpclient:
    enabled: true  

关于配置可参考源码: org.springframework.cloud.openfeign.FeignAutoConfiguration

测试:调用会进入feign.httpclient.ApacheHttpClient#execute

配置 OkHttp

引入依赖

<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-okhttp</artifactId>
</dependency>

然后修改yml配置,将 Feign 的 HttpClient 禁用,启用 OkHttp,配置如下:

feign:
  #feign 使用 okhttp
  httpclient:
    enabled: false
  okhttp:
    enabled: true

关于配置可参考源码: org.springframework.cloud.openfeign.FeignAutoConfiguration

测试:调用会进入feign.okhttp.OkHttpClient#execute

GZIP 压缩配置(不建议,会导致传输过程出现数据错误等....)

开启压缩可以有效节约网络资源,提升接口性能,我们可以配置 GZIP 来压缩数据:

feign:
  # 配置 GZIP 来压缩数据
  compression:
    request:
      enabled: true
      # 配置压缩的类型
      mime-types: text/xml,application/xml,application/json
      # 最小压缩值
      min-request-size: 2048
    response:
      enabled: true

注意:只有当 Feign 的 Http Client 不是 okhttp3 的时候,压缩才会生效,配置源码在FeignAcceptGzipEncodingAutoConfiguration

核心代码就是 @ConditionalOnMissingBean(type="okhttp3.OkHttpClient"),表示 Spring BeanFactory 中不包含指定的 bean 时条件匹配,也就是没有启用 okhttp3 时才会进行压缩配置。

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

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

相关文章

【送书活动】学Vue核心技术和uni-app跨平台实战项目就来看看这本书

本节目录1、书籍介绍2、推荐理由2.1 有充足的配套资源图书页内展示。2.2 PPT示例代码讲解演示2.3 内容由浅入深&#xff0c;渐进式学习3、参与方式1、书籍介绍 本书共分为14个章节&#xff0c;包括Vue.js核心基础、Vue.js高级进阶、Axios发送HTTP请求&#xff0c;Vuex状态管理…

牛客 面试必刷TOP101 题解(3、二叉树)

23 二叉树的前序遍历 /*** struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* };*/ #include <vector> class Solution { public:vector<int> ans;void show(TreeNode…

腾讯架构师极力推荐:Java多线程与Socket实战微服务框架

在这个技术不断更新的年代&#xff0c;跟不上时代变化的速度就会被刷掉&#xff0c;特别是咱们程序员这一群体&#xff0c;技术不断更新的同时也要同时进步&#xff0c;不然长江后浪推前浪&#xff0c;前浪… 一个程序员从一个什么都不懂的小白在学到有一定的Java基础的时候肯…

WebDAV之葫芦儿·派盘+可达漫画

可达漫画 支持WebDAV方式连接葫芦儿派盘。 这是一款专为阅读你的漫画收藏而设计的阅读器。 热爱漫画的你肯定收藏了不少各种类型的漫画,它们可能有各种各样的格式,zip,rar,cbz,cbr,epub, mobi 或 pdf,也可能只是单纯的文件夹。 可达漫画支持「流式阅读」

数据推荐 | 手势识别训练数据集

多样化&#xff0c;有按键、语音等&#xff0c;也由于整个疫情的大环境下&#xff0c;一种更方便更卫生更符合人们的非接触式交互方式—手势识别正大步发展&#xff0c;极富图像化和具备行动性的手势操作将会与人们的生活息息相关。 手势识别应用场景广泛&#xff0c;常见应用…

【微电网】并网微电网运行经济性研究(Python代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

面试官问我:说说你对JMM内存模型的理解?为什么需要JMM?

点个关注&#xff0c;必回关 随着CPU和内存的发展速度差异的问题&#xff0c;导致CPU的速度远快于内存&#xff0c;所以现在的CPU加入了高速 缓存&#xff0c;高速缓存一般可以分为L1、L2、L3三级缓存。基于上面的例子我们知道了这导致了缓存一致 性的问题&#xff0c;所以加入…

字符串常量池

1.创建对象的思考下面两种创建字符串的方式一样吗&#xff1f;public static void main(String[] args) {//两者一样吗String s1 "hello";String s2 "hello";String s3 new String("hello");String s4 new String("hello");System…

11 Advanced CNN

文章目录GoogLeNetInception Module1x1 Conv计算效果代码实现总结ResNet (残差网络)问题引入梯度消失与传统神经网络的比较代码实现课程来源&#xff1a; 链接对于前篇中所提到问题&#xff0c;设计出的是一种类似于LeNet5的线性结构&#xff0c;而对于大多数问题&#xff0c;简…

postgresql 数据库小版本更新

postgresql 数据库小版本更新 记录一次pg小版本更新 文章目录postgresql 数据库小版本更新前言一.下载最新的pg版本 pg11&#xff08;11.18&#xff09;二 pg11.5 升级 pg11.18过程1. 查看当前数据库版本&#xff1a;2. 关闭pg11.5数据库3. 安装pg11.184.修改 配置文件5. 重新…

【yolov5】yolov5训练自己的数据集全流程----包含本人设计的快速数据处理脚本

关于yolo应用时能用到的脚本集合&#xff0c;推荐收藏&#xff1a; https://chenlinwei.blog.csdn.net/article/details/127299428 1. 工程化快速yolo训练流程指定版&#xff08;无讲解&#xff09; 1.1 抽样数据集xml转txt输出量化分析 python make_dataset.pymake_dataset…

Little Fighter:旺角——NFT 系列来袭!

《小朋友齐打交 2 (LF2) 》是一款流行的格斗游戏&#xff0c;由 Marti Wong 和 Starsky Wong 于 1999 年创作。这是一款非常容易上瘾的游戏&#xff0c;具有多种游戏模式、横向卷轴格斗系统以及 24 个具有复杂动作和连击的不同角色。这款游戏在世界范围内非常受欢迎&#xff0c…

Debain安装命令

目录 一、安装sudo命令 二、安装jdk8 三、更换软件源 四、Debian 安装 yum 五、安装zip、unzip、curl、lrzsz、NUMA 六、安装Maven 五、问题 一、安装sudo命令 1&#xff09;执行sudo命令&#xff0c;提示 -bash: sudo: command not found的解决方法 apt-get install s…

图像分割方法与问题思考

前言图像分割就是预测图像中每一个像素所属的类别或者物体。图像分割有两个子问题&#xff0c;一个是只预测类别层面的分割&#xff0c;对每个像素标出一个位置。第二个是区分不同物体的个体。应用场景&#xff0c;比如自动驾驶&#xff0c;3D 地图重建&#xff0c;美化图片&am…

Docker-compose 容器集群的快速编排

目录 一、Docker-compose 简介 二、compose 部署 2.1、Docker Compose 环境安装 三、YAML 文件格式及编写注意事项 四、Docker Compose配置常用字段 五、Docker compose 常用命令 六、案例&#xff1a;编写Docker Compose搭建lnmp论坛 6.1、配置nginx 6.2、配置mysql …

Linux查看JVM FULL GC频率

查看系统的full gc频率&#xff0c;可以使用jstack命令一、采用top命令定位进程登录服务器&#xff0c;执行top命令&#xff0c;查看CPU占用情况&#xff0c;找到进程的pid二、使用jstack命令统计垃圾回收jstat -gc pid 5000即会每5秒一次显示进程号为pid的java进程的GC情况以上…

PyTorch学习笔记:nn.ReLU——ReLU激活函数

PyTorch学习笔记&#xff1a;nn.ReLU——ReLU激活函数 torch.nn.ReLU(inplaceFalse)功能&#xff1a;逐元素应用ReLU函数对数据进行激活 函数方程&#xff1a; ReLU(x)(x)max⁡(0,x)ReLU(x)(x)^\max(0,x) ReLU(x)(x)max(0,x) 输入&#xff1a; inplace&#xff1a;是否改变输…

C++004-C++选择与分支1

文章目录C004-C选择与分支1条件表达式条件表达式条件表达式返回值条件语句C实现单if语句题目描述 判断奇数还是偶数题目描述 判断是否及格题目描述 判断是否为0if else语句连续if与if else的差别题目描述 输出绝对值逻辑运算符题目描述 判断程序的输出题目描述 真值表判断题目描…

ElasticSearch-学习笔记04【Java客户端操作索引库】

Java后端-学习路线-笔记汇总表【黑马程序员】ElasticSearch-学习笔记01【ElasticSearch基本介绍】【day01】ElasticSearch-学习笔记02【ElasticSearch索引库维护】ElasticSearch-学习笔记03【ElasticSearch集群】ElasticSearch-学习笔记04【Java客户端操作索引库】【day02】Ela…

一看就会 超简单详细 ChatGPT 注册与使用攻略

OpenAI 新上线的 ChatGPT 可谓是火爆出圈&#xff0c;这个语言对话模型可以回答问题&#xff0c;承认错误&#xff0c;挑战不正确的前提&#xff0c;还能帮你修改代码中的 bug…… ChatGPT 的应用场景很广泛。它可以用于处理多种类型的对话&#xff0c;包括对话机器人、问答机器…