SpringCloudFeign远程调用

文章目录

  • 1. Feign 是什么
  • 2. Feign 的使用
    • 2.1 引入依赖
    • 2.2 写接口
    • 2.3 服务调用方
    • 2.4 启动测试
  • 3. Feign 日志配置
  • 4. Feign 使用优化
  • 5. 注意包扫描问题
  • 6. 注意的问题
    • 6.1 参数问题
    • 6.2 Feign 自动装配


在这里插入图片描述

1. Feign 是什么

Feign 是一个声明式、模板化的 HTTP 客户端,它是由 Netflix 开发并开源的。Feign 极大地简化了基于 HTTP 的服务间通信的开发过程,并与 Spring Cloud 进行了深度集成。

以下是 Feign 的一些特点和优势:

  • 声明式 API 定义:Feign 使用接口的方式定义服务调用的 API,使得声明和使用 API 更加直观和简洁。你只需要定义接口,并使用注解来描述 API 的细节,如请求方法、请求路径、请求参数等信息。

  • 整合了负载均衡:在 Spring Cloud 环境下,Feign 可以与 Ribbon 负载均衡进行集成。它可以自动将请求分发到后端的多个服务实例中,以实现负载均衡和服务发现。

  • 集成了 Hystrix 断路器:Feign 直接集成了 Hystrix 断路器,可以提供服务降级和容错能力。当服务调用失败或延迟过高时,Feign 可以快速启动断路器,避免雪崩效应。

  • 支持多种编码器和解码器:Feign 支持多种数据格式的编码和解码,例如 JSON、XML 等。你可以通过配置和注解来指定请求和响应的编码方式。

  • 支持自定义拦截器:Feign 提供了拦截器的扩展机制,你可以在请求发出前或响应返回后对请求进行处理。这些拦截器可以用于日志记录、认证授权、请求重试等逻辑。

Feign 提供了一种简单、高效的方式来定义和使用 HTTP 客户端。它基于接口和注解,使得服务之间的调用更加直观和易于维护。同时,Feign 还集成了负载均衡和断路器等功能,可以帮助开发者构建高可用和可靠的微服务架构。


微服务之间的远程调用可以用 RestTemplate 来发起远程调用. 但是存在下面的几个问题:

•代码可读性差,编程体验不统一

•参数复杂URL难以维护

Feign 的作用就是帮助我们优雅的实现 http 请求的发送,解决上面提到的问题。


2. Feign 的使用

在实际的项目开发中我们会把各个微服务提供的供其他服务远程调用的接口 封装在一个单独的服务里.

在这里插入图片描述

2.1 引入依赖

在 API 服务;里引入依赖

 <!--feign客户端依赖--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>

2.2 写接口

参照 服务提供的接口 写 API 中的接口
在这里插入图片描述

@FeignClient("user-server")
public interface UserApi {@GetMapping("user/{userId}")String hello(@PathVariable("userId") Integer userId);}

user-server 是微服务的服务名


2.3 服务调用方

服务调用方要做如下改动:

  1. 引入依赖

     <dependency><groupId>com.snow</groupId><artifactId>api</artifactId><version>1.0-SNAPSHOT</version></dependency>
    
  2. 启动类加配置
    启动类上加一行配置

    @EnableFeignClients(basePackages = {"com.snow.api"})
    

    com.snow.api 表示 API 的包

  3. 实际调用
    在这里插入图片描述


2.4 启动测试

略…


3. Feign 日志配置

基于配置文件修改feign的日志级别可以针对单个服务:

feign:  client:config: user-server: # 针对某个微服务的配置loggerLevel: FULL #  日志级别 

也可以针对所有服务:

feign:  client:config: default: # 这里用default就是全局配置,如果是写服务名称,则是针对某个微服务的配置loggerLevel: FULL #  日志级别 

而日志的级别分为四种:

  • NONE:不记录任何日志信息,这是默认值。
  • BASIC:仅记录请求的方法,URL以及响应状态码和执行时间
  • HEADERS:在BASIC的基础上,额外记录了请求和响应的头信息
  • FULL:记录所有请求和响应的明细,包括头信息、请求体、元数据。

4. Feign 使用优化

Feign 底层发起 http 请求,依赖于其它的框架。其底层客户端实现包括:

• URLConnection:默认实现,不支持连接池

• Apache HttpClient :支持连接池

• OKHttp:支持连接池

因此提高 Feign 的性能主要手段就是使用 连接池 代替默认的 URLConnection。

这里我们用 Apache 的 HttpClient 来演示。

1)引入依赖

在 order-server 的 pom 文件中引入 Apache 的 HttpClient 依赖:

<!--httpClient的依赖 -->
<dependency><groupId>io.github.openfeign</groupId><artifactId>feign-httpclient</artifactId>
</dependency>

2)配置连接池

在 order-server 的 application.yml 中添加配置:

feign:client:config:default: # default全局的配置loggerLevel: BASIC # 日志级别,BASIC就是基本的请求和响应信息httpclient:enabled: true # 开启feign对HttpClient的支持max-connections: 200 # 最大的连接数max-connections-per-route: 50 # 每个路径的最大连接数

接下来,在 FeignClientFactoryBean 中的 loadBalance 方法中打断点:

在这里插入图片描述

Debug方式启动order-service服务,可以看到这里的client,底层就是Apache HttpClient:

在这里插入图片描述


5. 注意包扫描问题

服务调用方的启动类上.

方式一:

指定 Feign 应该扫描的包:

@EnableFeignClients(basePackages = "com.snow.api")

方式二:

指定需要加载的 Client 接口:

@EnableFeignClients(clients = {UserApi.class})

6. 注意的问题

6.1 参数问题

通过 Feign 调用的接口, 方法的参数需要明确告诉参数的名称,像下面的方式是不行滴!

Integer get(Integer age, String name){
}

改为下面的方式

Integer get(@RequestParam("age") Integer age, @RequestParam("name") String name){
}

6.2 Feign 自动装配

(注意 该方法可能在 SpringBoot2.7 及其高版本失效)

在之前的实践中, 我们的消费者启动类加了 @EnableFeignClients(basePackages = {"com.snow.api"}) 注解, 其非常的不雅观, 并且耦合性有点强.

我们可以用 Feign 自动装配 来代替之前的做法.

  1. 首先我们在 API 微服务下的 resource 包下面创建一个文件夹 META-INF ,然后在其下面建 spring.factories 配置文件 . 如下图:

在这里插入图片描述

  1. 在 配置类上 加注解
@Configuration
@EnableFeignClients(basePackages = {"com.snow.api"})
  1. 在 spring.factories 文件里编辑
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.snow.api.conf.ApiConfig

在这里插入图片描述

其中 com.snow.api.conf.ApiConfig 就是配置类全路径.

4 .启动,测试

效果很 OK.


如此以来,我们有新的 API 发布,都不会再去 API 使用方的启动类上加东西了.


在这里插入图片描述



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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【SQL】185. 部门工资前三高的所有员工(窗口函数dense_rank();区分rank()、row_number())

前述 推荐阅读&#xff1a;通俗易懂的学会&#xff1a;SQL窗口函数 题目描述 leetcode题目 185. 部门工资前三高的所有员工 思路 先按照departmentId分组&#xff0c;再按照salary排序 >窗口函数dense_rank() over() select B.name as Department,A.name as Employee,A…

Web题记

[CISCN 2019华北Day2]Web1 告诉我们想要的东西在flag表和flag字段&#xff0c;那应该是sql注入&#xff0c;先试试 试了一些发现会被检查到&#xff0c;随便传数字 除了1和2有返回结果&#xff0c;其余的都报错&#xff0c;应该是数字型注入&#xff0c;抓包看看过滤了哪些 这个…

Gradle模块化最佳实践

一&#xff0c;模块化的原因及意义 模块化是一种将大型的软件系统拆分成相互独立的模块的方法。具有以下优势&#xff1a; 代码复用&#xff1a;不同的模块可以共享相同的代码。这样可以避免重复编写相同的代码&#xff0c;提高开发效率。模块独立性&#xff1a;每个模块都可…

Elastic Stack--07--JavaAPI----文档(新增 、修改 、 查询 、 删除)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 JavaAPI-文档1.新增 Insert2.修改 Update3.查询 Get4.删除 Delete5.批量操作 BulkRequest批量新增批量删除 高级查询1.查询所有索引数据2.条件查询3.分页查询4.查询…

华容道问题求解_详细设计(五)之hash值和回放功能

&#xff08;续上文&#xff09; 布局的hash 值计算 笔者也参考了之前的一些文章&#xff0c;很多文章提到了怎么节省存贮空间来查找最优解&#xff0c;这不是笔者的目的。笔者的目的比较单一&#xff0c;就是找到最优解就行了。因此并没有在存贮上面进行过多的优化&#xff…

网络学习:数据的封装与解封装

目录 一、数据的封装与解封装 1. 数据的封装过程 2. 数据的解封装过程 二、数据的传输过程 1. 相关概念 2. 网络传输过程中数据封装和解封装模拟 一、数据的封装与解封装 1. 数据的封装过程 数据封装过程&#xff0c;在这里我们举例说明&#xff0c;以两台主机的通信为…

阿里云2核4G服务器支持人数并发测试,2核4G主机测评

阿里云2核4G服务器多少钱一年&#xff1f;2核4G配置1个月多少钱&#xff1f;2核4G服务器30元3个月、轻量应用服务器2核4G4M带宽165元一年、企业用户2核4G5M带宽199元一年。可以在阿里云CLUB中心查看 aliyun.club 当前最新2核4G服务器精准报价、优惠券和活动信息。 阿里云官方2…

记录西门子:IO隔离SCL编程

在PLC变量中创建IO输入输出 在PLC类型中创建输入和输出&#xff0c;并将PLC变量的输入输出名称复制过来 创建一个FC块或者FB块 创建一个DB块 MAIN主程序中&#xff1a;

C语言程序与设计——函数(二)递归练习

在上一篇文章中接触到了递归这种编程方法&#xff0c;下面我们将用几个程序加深以下对递归的理解。 递归实际上就是程序调用自身的编程技巧 递归程序的组成&#xff1a; 边界条件处理针对于问题的处理过程和递归过程结果返回 二分查找 首先分析二分查找的查找逻辑&#xff1a; …

深入理解操作系统Operator System(2)

目录 操作系统对上的管理 系统调用接口 用户操作接口&#xff08;库函数&#xff09; 系统调用和库函数的概念 结构层次示意图 总结 为什么要有操作系统❓ 上次主要介绍了操作系统的"管理"和操作系统对下的管理。本篇主要是对上的管理。 操作系统对上的管理 …

【最新版】ChatGPT/GPT4科研应用与AI绘图论文写作(最新增加Claude3、Gemini、Sora、GPTs技术及AI领域中的集中大模型的最新技术)

2023年随着OpenAI开发者大会的召开&#xff0c;最重磅更新当属GPTs&#xff0c;多模态API&#xff0c;未来自定义专属的GPT。微软创始人比尔盖茨称ChatGPT的出现有着重大历史意义&#xff0c;不亚于互联网和个人电脑的问世。360创始人周鸿祎认为未来各行各业如果不能搭上这班车…

9. 内核、文件系统加载工具

内核、文件系统加载工具 内核、文件系统加载工具是嵌入式开发必备的工具 1. 烧写BootLoader 1.1 通过超级终端方式 烧写 Bootloader 可以使用超级终端的“传送” |“发送文件”命令进入发送文件对话框&#xff0c;使用 Xmodem 协议和 Kermit 协议发送 Bootloader 的各个文件…