Spring Cloud Feign

序言

本文给大家介绍一下 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

docker compose mysql主从复制及orchestrator高可用使用

1.orchestrator 功能演示&#xff1a; 1.1 多级级联&#xff1a; 1.2 主从切换&#xff1a; 切换成功后&#xff0c;原来的主库是红色的&#xff0c;需要在主库的配置页面点击“start replication ”&#xff0c;重新连接上新的主库。 1.3 主从故障&#xff0c;从库自动切换新…

pyqt字体选择器

pyqt字体选择器 pyqt字体选择器效果代码 pyqt字体选择器 pyqt中QFontDialog 类是一个预定义的对话框&#xff0c;允许用户选择一个字体并设置其样式、大小等属性。 效果 代码 from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QLabel, QPushButton, QFontD…

信息收集。

信息收集 接着使用cs进行信息收集 发现域内管理员账号。 然后查看pc信息&#xff0c; 查看进程。 发现域为god.org 尝试定位域控。 提权 使用cs的功能进行权限提权 成功获取管理员权限。 hash抓取 接着抓hash 成功抓到管理员账号、密码。 接着进行横向传递 成功获取AD和…

从曝光到安装:App传参安装的关键步骤与数据指标

随着移动互联网的普及&#xff0c;手游市场日益繁荣&#xff0c;手游推广方式也日新月异。在这个竞争激烈的市场中&#xff0c;如何有效地推广手游&#xff0c;吸引更多的用户&#xff0c;成为了开发者和广告主关注的焦点。而Xinstall作为国内专业的App全渠道统计服务商&#x…

Android Widget开发代码示例详细说明

因为AppWidgetProvider扩展自BroadcastReceiver, 所以你不能保证回调函数完成调用后&#xff0c;AppWidgetProvider还在继续运行。 a. AppWidgetProvider 的实现 /*** Copyright(C):教育电子有限公司 * Project Name: NineSync* Filename: SynWidgetProvider.java * Author(S…

ORACLE 11G RAC 访问SQLSERVER

平时都是单机&#xff0c;RAC有点不一样&#xff0c;其实也一样。 目录 1.操作环境信息 2.安装GATEWAY 3.配置实例信息 4.配置监听 5.配置网络别名 6.创建到SQLSERVER的DBLINK 7.测试DBLINK有效性 1.操作环境信息 HIS PACS 数据库版本 ORACLE 11.2.0.4 RAC MS SQLSE…

C++多态(全)

多态 概念 调用函数的多种形态&#xff0c; 多态构成条件 1&#xff09;父子类完成虚函数的重写&#xff08;三同&#xff1a;函数名&#xff0c;参数&#xff0c;返回值相同&#xff09; 2&#xff09;父类的指针或者引用调用虚函数 虚函数 被virtual修饰的类成员函数 …

Llama images - 记录我看到的那些羊驼

来自 &#xff1a; DREAM: Distributed RAG Experimentation Framework

73、栈-柱状图中最大的矩形

思路&#xff1a; 矩形面积&#xff1a;宽度*高度 高度如何确定呢&#xff1f;就是在宽度中最矮的元素。如何确定宽度&#xff0c;就是要确定左右边界。 当我们在处理直方图最大矩形面积问题时&#xff0c;遇到一个比栈顶柱子矮的新柱子时开始计算面积的原因关键在于如何确定…

Hotcoin Research|玩赚WEB3:Seraph零成本赚取技巧

在《Seraph》这款游戏里&#xff0c;要提升自己的游戏技能和体验&#xff0c;了解如何免费赚取游戏货币灵魂晶石并挑战游戏主线是非常重要的。你可以通过卖东西、参加虚空异界地图和混沌秘境来在游戏里赚更多的钱&#xff0c;并更享受游戏的乐趣。最酷的是&#xff0c;得到的灵…

低功耗数字IC后端设计实现典型案例| UPF Flow如何避免工具乱用Always On Buffer?

下图所示为咱们社区低功耗四核A7 Top Hierarchical Flow后端训练营中的一个案例&#xff0c;设计中存在若干个Power Domain&#xff0c;其中Power Domain2(简称PD2)为default Top Domain&#xff0c;Power Domain1&#xff08;简称PD1&#xff09;为一个需要power off的domain&…

三星电子与蔡司达成新合作 | 百能云芯

近日&#xff0c;三星电子会长李在镕的欧洲之行备受瞩目&#xff0c;他特别造访了德国光学巨擘蔡司的总部&#xff0c;并与其高层进行了深入的会谈。 据韩国前锋报报道&#xff0c;三星电子在28日宣布&#xff0c;李在镕在26日与蔡司执行长兰普瑞特&#xff08;Karl Lamprecht&…

企业智能名片小程序:AI智能跟进功能助力精准营销新篇章

在数字化浪潮的推动下&#xff0c;企业营销手段不断迭代升级。如今&#xff0c;一款集手机号授权自动获取、智能提醒、访客AI智能跟进及客户画像与行为记录于一体的企业智能名片小程序&#xff0c;正以其强大的AI智能跟进功能&#xff0c;助力企业开启精准营销的新篇章。 通过深…

SQL提升

1. SQL TOP 子句 TOP 子句用于规定要返回的记录的数目。 对于拥有数千条记录的大型表来说&#xff0c;TOP 子句是非常有用的。 **注释&#xff1a;**并非所有的数据库系统都支持 TOP 子句。 1.1 SQL TOP 语法 SQL Server 的语法&#xff1a; SELECT TOP number|percent c…

期权交割对股市是好是坏?2024期权交割日一览表

期权交割是指期权买方在期权合约到期日或之前行使期权&#xff0c;卖方履行义务&#xff0c;按照约定的价格和数量与期权卖方进行标的物的买卖或现金结算的过程。 交割方式 期权交割可以分为实物交割和现金交割&#xff0c;具体取决于合约规定。 实物交割 实物交割是指期权买…

【Threejs】获取相交网格相交线

BVH-INTER 1 导入threejs-mesh-bvh库 import * as THREE from "three"; import { SAH, acceleratedRaycast, computeBoundsTree, disposeBoundsTree } from "three-mesh-bvh"; import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader.j…

photoshop如何使用PS中的吸管工具吸取软件外部的颜色?

第一步&#xff0c;打开PS&#xff0c;随意新建一个画布&#xff0c;或打开一个图片。 第二步&#xff0c;将PS窗口缩小&#xff0c;和外部窗口叠加放置&#xff0c;以露出后面的其它页面。 第三步&#xff0c;选中吸管工具&#xff0c;在PS窗口内单击一点吸取颜色&#xff0c;…

变电站自动化控制系统应用案例分析

变电站自动化控制系统介绍 变电站自动化控制系统用于大中型企业变电站项目&#xff0c;这类企业变压器多&#xff0c;日耗电量大。把多个变压器集中到一个电器平台上&#xff0c;集中管理分析&#xff0c;优化厂区用电管理&#xff0c;从而达到集中控制、集中分析、集中管理的…

【网络原理】以太网协议 | 以太网数据帧格式 | DNS域名解析系统

文章目录 一、以太网协议1.以太网数据帧格式MAC地址IP地址和MAC地址各自的用途 二、DNS 一、以太网协议 通过网线、光纤来通信&#xff0c;使用的就是以太网协议。 以太网协议&#xff0c;横跨了数据链路层和物理层。 1.以太网数据帧格式 由帧头载荷&#xff08;IP数据报&…

简单谈谈URL过滤在网络安全中的作用

用户花在网络上的时间越来越多&#xff0c;浏览他们最喜欢的网站&#xff0c;点击电子邮件链接&#xff0c;或利用各种基于网络的 SaaS 应用程序供个人和企业使用。虽然这种不受约束的网络活动对提高企业生产力非常有用&#xff0c;但也会使组织面临一系列安全和业务风险&#…