【SpringCloud】OpenFeign服务接口调用快速入门

news/2024/9/23 21:02:28/

【SpringCloud】OpenFeign服务接口调用快速入门

文章目录

  • 【SpringCloud】OpenFeign服务接口调用快速入门
    • 1. 概述
    • 2. 引入依赖
    • 3. 配置、测试

1. 概述

官网地址:点击跳转

Feign是一个声明性web服务客户端。它使编写web服务客户端变得更容易。使用 Feign 创建一个接口并对其进行注释。它具有可插入的注释支持,包括Feign注释和 JAX-RS 注释。Feign 还支持可插拔编码器和解码器。Spring Cloud 添加了对 Spring MVC 注释的支持,以及对使用 Spring Web 中默认使用HttpMessageConverter 的支持。Spring Cloud 集成了 Eureka、Spring Cloud CircuitBreaker 以及 Spring Cloud LoadBalancer,以便在使用 Feign 时提供负载平衡的http客户端。

前面在使用 SpringCloud LoadBalancer + RestTemplate 时,利用 RestTemplate 对http请求的封装处理形成了一套模版化的调用方法。

但是在实际开发中,由于对服务依赖的调用可能不止一处,往往一个接口会被多处调用,所以通常都会针对每个微服务自行封装一些客户端类来包装这些依赖服务的调用。所以,OpenFeign 在此基础上做了进一步封装,由他来帮助我们定义和实现依赖服务接口的定义。在 OpenFeign 的实现下,我们只需创建一个接口并使用注解的方式来配置它(在一个微服务接口上面标注一个 @FeignClient 注解即可),即可完成对服务提供方的接口绑定,统一对外暴露可以被调用的接口方法,大大简化和降低了调用客户端的开发量,也即由服务提供者给出调用接口清单,消费者直接通过 OpenFeign 调用即可。

OpenFeign 同时还集成SpringCloud LoadBalancer,可以在使用OpenFeign时提供Http客户端的负载均衡,也可以集成阿里巴巴Sentinel来提供熔断、降级等功能。而与SpringCloud LoadBalancer不同的是,通过OpenFeign只需要定义服务绑定接口且以声明式的方法,优雅而简单的实现了服务调用。


2. 引入依赖

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

3. 配置、测试

1)配置文件如下:

server:port: 80spring:application:name: cloud-consumer-openfeign-order####Spring Cloud Consul for Service Discoverycloud:consul:host: localhostport: 8500discovery:prefer-ip-address: true #优先使用服务ip进行注册service-name: ${spring.application.name}

2)启动类上添加 @EnableFeignClients 注解:

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

3)在通用commons模块下编写client:

@FeignClient(value = "cloud-payment-service")
public interface PayFeignApi {@PostMapping(value = "/pay/add")public ResultData<String> addPay(@RequestBody PayDTO payDTO);@GetMapping(value = "/pay/get/{id}")public ResultData getPayInfo(@PathVariable("id") Integer id);@GetMapping(value = "/pay/get/info")public String mylb();
}

这三个接口在pay服务中的接口对应如下:

@PostMapping(value = "/pay/add")
@Operation(summary = "新增", description = "新增支付流水方法,json串做参数")
public ResultData<String> addPay(@RequestBody PayDTO payDTO) {Pay pay = new Pay();BeanUtils.copyProperties(payDTO, pay);System.out.println(pay.toString());int i = payService.add(pay);return ResultData.success("成功插入记录,返回值:" + i);
}@GetMapping(value = "/pay/get/{id}")
@Operation(summary = "按照ID查流水", description = "查询支付流水方法")
public ResultData<Pay> getById(@PathVariable("id") Integer id) {Pay pay = payService.getById(id);return ResultData.success(pay);
}@GetMapping(value = "/pay/get/info")
private String getInfoByConsul(@Value("${com.zhj}") String str) {return "com.zhj: " + str + "\t" + "port: " + port;
}

4)在order服务中调用这三个接口:

@RestController
@Slf4j
public class OrderController {@Resourceprivate PayFeignApi payFeignApi;@PostMapping("/feign/pay/add")public ResultData addOrder(@RequestBody PayDTO payDTO) {System.out.println("第一步:模拟本地addOrder新增订单成功(省略sql操作),第二步:再开启addPay支付微服务远程调用");ResultData resultData = payFeignApi.addPay(payDTO);return resultData;}@GetMapping("/feign/pay/get/{id}")public ResultData getPayInfo(@PathVariable("id") Integer id) {System.out.println("-------支付微服务远程调用,按照id查询订单支付流水信息");ResultData resultData = payFeignApi.getPayInfo(id);return resultData;}/*** openfeign天然支持负载均衡演示** @return*/@GetMapping(value = "/feign/pay/mylb")public String mylb() {return payFeignApi.mylb();}
}

调用第二个接口,结果如下:

image-20240425005414737

测试第三个结果,看负载均衡是否成功,结果如下:

image-20240425005338931

image-20240425005346998

说明 OpenFeign 默认集成了 LoadBalance。


http://www.ppmy.cn/news/1435263.html

相关文章

Swift-30-高级编程-类型扩展和协议扩展

类型扩展 Swift提供一个叫扩展&#xff08;extension&#xff09;的特性&#xff0c;该特性就是为这种情况设计的。扩展能让你给已有的类型添加功能&#xff0c;可以用来扩展结构体、枚举和类&#xff0c;比如&#xff1a; 添加计算属性添加新的初始化方法添加协议实现添加新…

s AbortController 接口取消多次请求 取消上次请求

AbortController 是一个 JavaScript API&#xff0c;它允许您在客户端中止一个或多个 Fetch 请求。这个 API 是 Fetch API 的一部分&#xff0c;并且与 AbortSignal 对象一起使用&#xff0c;以提供一种机制来控制请求的生命周期。 以下是 AbortController 的基本用法&#xf…

【数据结构】图(Graph)

文章目录 概念图的存储方式邻接矩阵邻接矩阵表示法邻接矩阵表示法的特点 邻接表邻接表表示法邻接表表示法的特点邻接表表示法的定义与实现查找插入删除其它构造函数析构函数创建图输出图 图的遍历深度优先遍历&#xff08;DFS&#xff09;广度优先遍历 图的连接分量和生成树生成…

《深入浅出.NET框架设计与实现》笔记6.1——ASP.NET Core应用程序多种运行模式之一——自宿主(Self-Hosting)

ASP.NET Core应用程序可以在多种运行模式下运行&#xff0c;包括自宿主&#xff08;Self-Hosting&#xff09;、IIS服务承载、桌面应用程序、服务承载。 因此选择和时的模式很重要。 自宿主&#xff08;Self-Hosting&#xff09; 自宿主是指 ASP.NET Core 应用程序独立运行&a…

「ChatGPT」掀起新一轮AI热潮!超越GPT-4 Turbo,商汤日日新大升级!

目录 拳打 GPT-4 Turbo &#xff0c;脚踢 DALLE 3 端侧大模型&#xff0c;唯快不破 AI 应用落地需要一个即插即用的大模型超市 并不存在 AI 这个行业&#xff0c;只有 AI行业&#xff0c;强调 AI 需要与传统产业合作&#xff0c;这种关系是结合与赋能&#xff0c;而不是颠覆…

【VueUse】重新定义状态管理在 Vue 中的体验

在 Vue 生态系统中&#xff0c;状态管理一直是开发者们关注的焦点之一。而随着 VueUse 的出现&#xff0c;我们迎来了一种全新的方式来处理状态管理&#xff0c;它让我们能够以更简单、更灵活的方式来管理应用程序的状态。 在本文中我们将深入探讨 VueUse 中与状态管理相关的内…

Chrome 侧边栏开发示例

前言 最近做项目&#xff0c;需要开发浏览器扩展&#xff0c;但是考虑页面布局兼容性问题&#xff0c;使用了Chrome114开始的侧边栏&#xff0c;浏览器自带的能力毕竟不会出现兼容性问题&#xff0c;不过Chrome123开始&#xff0c;侧边栏居然又可以选择固定右侧扩展栏了&#…

uniapp h5文件流下载pdf文件

今天遇到一个需求就是后端返回一个文件流&#xff0c;前端需要用户点击以后下载&#xff0c;那么怎么去做呢 请看下面代码 DownLoadDoc() {let url doc/api/downloadDocFulltext?id this.id //接口路径uni.request({url:uni.getStorageSync(baseUrl)url, //域名拼接response…