Spring Cloud Feign

news2024/11/24 6:31:19

序言

本文给大家介绍一下 Spring Cloud Feign 的基础概念以及使用方式。

一、远程调用

在传统的单体系统中,我们通常是客户端去请求服务端的接口。但是在分布式的系统中,常常需要一个服务去调用另外一个服务的接口。在服务端如何去调用另外一个服务端的接口呢?实现的方式有许多,例如:Spring 提供了一个 RestTemplate 类。

// 向容器注入 RestTemplate
@Bean
public RestTemplate restTemplate() {
    return new RestTemplate();
}

// 引入 RestTemplate
@Resource
private RestTemplate restTemplate;

// 测试 RestTemplate
@Test
public void test() {
    String str = restTemplate.getForObject("http://www.baidu.com", String.class);
    System.out.println(str);
}

似乎,RestTemplate 能够实现 http 的远程调用,可以满足我们的需求了。但是这里有几个问题:

  1. 请求如果需要加上一些特殊的请求头呢
  2. 如果是 post 请求,数据如何传递呢
  3. 请求失败如何处理呢

我们发现:尽管 RestTemplate 能将上述问题都处理掉,但编码量会陡增,并且代码结构也会不太清晰。

二、Spring Cloud Feign

Spring Cloud Feign 是 Spring Cloud 生态系统中的一个组件,用于简化基于 RESTful 服务的客户端开发。它通过声明式的方式定义了对 REST 服务的接口,使得开发者可以像调用本地方法一样调用远程服务,而不需要手动构建 HTTP 请求和处理响应。Feign 还集成了 Ribbon 负载均衡和 Hystrix 断路器等功能,为微服务架构提供了更便捷的服务调用和容错机制。

Spring Cloud Feign 的主要特点包括:

  1. 声明式 REST 客户端:通过注解方式定义 REST 服务的接口,将远程服务的调用视为本地方法调用,降低了调用远程服务的复杂性。
  2. 集成 Ribbon 负载均衡:Feign 默认集成了 Ribbon,可以通过服务名进行服务发现和负载均衡,实现对多个服务实例的自动选择和负载分配。
  3. 集成断路器:Feign 可以集成 Hystrix 实现对服务调用的熔断、降级和容错处理,增强了系统的稳定性和可靠性。
  4. 支持 Spring Boot 自动配置:Feign 可以与 Spring Boot 无缝集成,提供自动配置和自定义配置的功能。
  5. 支持拦截器和解码器:Feign 支持自定义拦截器和解码器,用于实现请求和响应的增强处理。
  6. 支持与注册中心集成:Feign 可以与 Spring Cloud 的注册中心(如 Eureka、Consul 等)集成,实现动态的服务发现和调用。

Spring Cloud Feign 提供了一种简洁而强大的方式来进行微服务间的通信,使得开发者可以更加专注于业务逻辑的实现,而无需过多关注底层的通信细节。

三、快速入门

3.1 引入依赖

// 引入 openfeign 依赖 
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

// 依赖版本
<properties>
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  <spring-boot.version>2.7.13</spring-boot.version>
  <spring-cloud.version>2021.0.9</spring-cloud.version>
</properties>

<dependencyManagement>
  <dependencies>
    <dependency>
      <!-- Import dependency management from Spring Boot -->
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-dependencies</artifactId>
      <version>${spring-boot.version}</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>

    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-dependencies</artifactId>
      <version>${spring-cloud.version}</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>

3.2 开启 openfeign 功能

@SpringBootApplication
// 注解开启 openfeign 功能
@EnableFeignClients
public class App {
    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }
}

3.3 使用 openfeign

  1. 定义调用的接口

    // 定义调用的地址和服务的名称
    @FeignClient(name = "test", url = "http://127.0.0.1:8080")
    public interface TestClient {
    
        // 定义调用的接口
        @GetMapping("/test/hello")
        String getInfo();
    }
    
  2. 测试接口

    @Autowired
    private TestClient testClient;
    
    @Test
    public void test0() {
        String str = testClient.getInfo();
        System.out.println(str);
    }
    
  3. 测试效果

    image.png

四、使用方式

openfeign 的使用方式和 Spring MVC 的使用方式基本一样。部分使用方式如下:

  1. 传递参数

    @GetMapping("/stores")
    // 参数为 pageable
    Page<Store> getStores(Pageable pageable);
    
  2. post 请求

    // 可以使用 @PostMapping 表示 post 请求
    @PostMapping(value = "/stores")
    Store update(Store store);
    
  3. 添加头信息

    // 使用 @RequestHeader 表示头信息
    @PostMapping("/stores")
    Store update(@RequestHeader("Authorization") String header,
                 @RequestBody Store store);
    

五、断路器

在进行远程 http 调用的时候,并不能保证 100% 调用成功。为了解决调用接口时发生的异常,openfeign 提供了断路器。

5.1 引入断路器依赖

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

5.2 开启断路器

feign:
  circuitbreaker:
    enabled: true

5.3 定义断路器的 fallback

// 定义一个断路器的 fallback
// 实现 TestClient
// 使用 @Component 注入到容器
@Component
public class TestClientFallback implements TestClient {

    @Override
    public String getInfo() {
        return "发生了一个错误";
    }
}

// 使用 fallback = TestClientFallback.class 指定 fallback
@FeignClient(name = "test", url = "http://127.0.0.1:8080", fallback = TestClientFallback.class)
public interface TestClient {

    @GetMapping("/test/hello")
    String getInfo();
}

5.4 使用效果

image.png
调用结果:
image.png

六、注册中心

// 定义调用的地址和服务的名称
@FeignClient(name = "test", url = "http://127.0.0.1:8080")
public interface TestClient {

    // 定义调用的接口
    @GetMapping("/test/hello")
    String getInfo();
}

之前,我们直接配置了 url。如果是微服务,微服务在注册中心注册了,可以直接按如下方式使用:

// 直接使用要调用的服务名称
@FeignClient(name = "test-service")
public interface TestClient {

    // 定义调用的接口
    @GetMapping("/test/hello")
    String getInfo();
}

不过,在使用微服务调用时,新版本可能需要引入下面的依赖:

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

七、FAQ

  1. 若是在 @Configuration 注解的类上使用 @EnableFeignClients 注解,要明确扫描位置,例如: @EnableFeignClients(basePackages = “com.example.clients”) ,@EnableFeignClients(clients = InventoryServiceFeignClient.class) 。否则,可能导致 @FeignClient 注解不生效
  2. spring-cloud-starter-openfeign 支持 spring-cloud-starter-loadbalancer。然而,由于它是一个可选的依赖项,如果你想使用它,需要手动将其添加到项目中。

往期推荐

  1. 缓存神器-JetCache
  2. Mybatis 缓存机制
  3. 为什么 MySQL 单表数据量最好别超过 2000w
  4. IoC 思想简单而深邃
  5. ThreadLocal

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

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

相关文章

源码篇--Nacos服务--中章(8):Nacos服务端感知客户端实例变更-3

文章目录 前言一、客户端实例变更&#xff1a;二、实例变更感知&#xff1a;2.1 实例注册信息通知&#xff1a;2.1.1 接收DistroDataRequest 请求&#xff1a;2.1.2 onReceive 处理请求&#xff1a;2.1.3 processData 处理请求&#xff1a;2.1.4 handlerClientSyncData 处理数据…

C++学习第十四课:运算符类型与运算符重载

C学习第十四课&#xff1a;运算符类型与运算符重载 在C中&#xff0c;运算符重载是一种使得自定义类型&#xff08;如类对象&#xff09;能够使用C内建运算符的能力。运算符重载允许程序员定义运算符对用户定义类型的特殊行为&#xff0c;这增加了程序的可读性和自然表达能力。…

【介绍下Android开发环境的搭建】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

iOS ------ Method Swizzling (动态方法交换)

一&#xff0c;Method Swizzling 简介 Method&#xff08;方法&#xff09;对应的是objc_method结构体&#xff1b;而objc_method结构体中包含了SEL method_name(方法名&#xff09;&#xff0c;IMP method_imp&#xff08;方法实现&#xff09; // objc_method 结构体 typed…

【GESP】2023年09月图形化一级 -- 小鸡躲球

小鸡躲球 1. 准备工作 (1)删除默认小猫角色。 (2)添加角色Chick和Ball。 (3)删除默认白色背景,添加背景Blue Sky。 2. 功能实现 (1)点击绿旗,小鸡角色站在地面上,初始位置为(X=-140,Y=-120),初始方向为90,旋转方式为任意旋转。在小鸡角色中设置舞台的初始…

办公楼智慧公厕自发电门锁感应器无需电池供电,环保节能!

在当今科技高速发展的时代&#xff0c;办公楼智慧公厕的自发电门锁感应器成以其独特的优势&#xff0c;为办公楼的卫生设施管理带来了全新的变革。这款感应器无需电池供电&#xff0c;真正做到了环保节能&#xff0c;同时在免电池、免维护、信号稳定、门锁升级、把手设计、应用…

编译工具各版本与操作系统版本号兼容性冷知识 : JetBrains IntelliJ IDEA 各个主要版本及其对应的操作系统版本号的兼容情况

编译工具各版本与操作系统版本号兼容性冷知识 &#x1f9e0;: JetBrains IntelliJ IDEA 各个主要版本及其对应的操作系统版本号的兼容情况 文章目录 编译工具各版本与操作系统版本号兼容性冷知识 &#x1f9e0;: JetBrains IntelliJ IDEA 各个主要版本及其对应的操作系统版本号…

深入OceanBase分布式数据库:MySQL 模式下的 SQL 基本操作

码到三十五 &#xff1a; 个人主页 OceanBase与MySQL模式下兼容性序 在当今的大数据时代&#xff0c;数据库技术的选择对于企业的信息化发展至关重要。OceanBase作为一种高性能、高可用的分布式关系数据库&#xff0c;在与MySQL模式的兼容性方面展现出了显著的优势&#xff0c…

qt5-入门-2D绘图-基础

参考&#xff1a; QPainter_w3cschool https://www.w3cschool.cn/learnroadqt/k7zd1j4l.html C GUI Programming with Qt 4, Second Edition 本地环境&#xff1a; win10专业版&#xff0c;64位&#xff0c;Qt 5.12 代码已经测试通过。其他例子日后更新。 目录 基础知识penb…

微信小程序个人中心、我的界面(示例四)

微信小程序个人中心、我的界面&#xff0c;九宫格简单布局&#xff08;示例四&#xff09; 微信小程序个人中心、我的界面&#xff0c;超简洁的九宫格界面布局&#xff0c;代码粘贴即用。更多微信小程序界面示例&#xff0c;请进入我的主页哦&#xff01; 1、js代码 Page({…

gateway全局token过滤器

添加gateway依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency>创建一个tokenFilter 实现全局过滤器GlobalFilter,并且实现fitler方法 Value("${…

PDF高效编辑器,支持修改PDF文档并转换格式从PDF文件转换成图片文件,轻松管理你的文档世界!

PDF文件已成为我们工作、学习和生活中不可或缺的一部分。然而&#xff0c;传统的PDF阅读器往往只能满足简单的查看需求&#xff0c;对于需要频繁编辑、修改或转换格式的用户来说&#xff0c;就显得力不从心。现在&#xff0c;我们为您带来一款全新的PDF高效编辑器&#xff0c;让…

Vue 组件单元测试深度探索:细致解析与实战范例大全

Vue.js作为一款广受欢迎的前端框架&#xff0c;以其声明式的数据绑定、组件化开发和灵活的生态系统赢得了广大开发者的心。然而&#xff0c;随着项目规模的增长&#xff0c;确保组件的稳定性和可靠性变得愈发关键。单元测试作为软件质量的守护神&#xff0c;为Vue组件的开发过程…

开源AI智能名片商城小程序:深度解读IMC(IP、MarTech、Content)视角

在数字化浪潮中&#xff0c;私域流量的运营已成为企业不可或缺的增长引擎。而开源AI智能名片商城小程序&#xff0c;则是以一种全新的视角——IMC&#xff08;IP、MarTech、Content&#xff09;&#xff0c;为企业打开私域流量运营的新篇章。今天&#xff0c;我们就来一起深入解…

mac安装软件遇到无法验证开发者的解决方法

现象 无法打开“”&#xff0c;因为无法验证开发者。这种情况说明正在安装的软件里面有的包被系统判定为不安全的。 解决方法 1、点击取消按钮 2、系统设置-隐私与安全性&#xff0c;点击打开按钮

python可视化图表

1.测试数据准备 2011年1月销售数据.txt 2011-01-01,4b34218c-9f37-4e66-b33e-327ecd5fb897,1689,湖南省 2011-01-01,5b6a6417-9a16-4243-9704-255719074bff,2353,河北省 2011-01-01,ae240260-68a9-4e59-b4c9-206be4c08a8d,2565,湖北省 2011-01-02,c833e851-880f-4e05-9de5-b5…

第6篇:创建Nios II工程之控制LED<一>

Q&#xff1a;还记得第1篇吗&#xff1f;设计简单的逻辑电路&#xff0c;控制DE2-115开发板上LED的亮与熄灭&#xff0c;一行Verilog HDL的assign赋值语句即可实现。本期开始创建Nios II工程&#xff0c;用C语言代码控制DE2-115开发板上的LED实现流水灯效果。 A&#xff1a;在…

力扣141.环形链表142.环形链表Ⅱ 附证明

题目链接&#xff1a; 141. 环形链表 - 力扣&#xff08;LeetCode&#xff09; 142. 环形链表 II - 力扣&#xff08;LeetCode&#xff09; 141.环形链表 方法思路&#xff1a;快慢指针 代码: class Solution { public:bool hasCycle(ListNode *head) {if(!head){return fa…

基于uniapp vue3.0 uView 做一个点单页面(包括加入购物车动画和左右联动)

1、实现效果&#xff1a; 下拉有自定义组件&#xff08;商品卡片、进步器、侧边栏等&#xff09;源码 2、左右联动功能 使用scroll-view来做右边的菜单页&#xff0c;title的id动态绑定充当锚点 <scroll-view :scroll-into-view"toView" scroll-with-animation…

vue+element之解决upload组件上传文件失败后仍显示在列表上、自动上传、过滤、findIndex、splice、filter

MENU 前言错误案例(没有用)正确方法结束语 前言 el-upload上传失败后&#xff0c;文件仍显示在列表上。 这个pdf文件上传失败&#xff0c;仍显示在列表&#xff0c;给人错觉是上传成功&#xff0c;所以要把它去掉。 在element中&#xff0c;file-list和v-model:file-list是用于…