微服务学习-OpenFeign 简化服务间调用

使用 OpenFeign 简化服务间调用

1. 作用

服务间的远程调用,比如通过 OpenFeign 可以实现订单服务调用远程的库存服务

已经有了 LoadBalancer 为什么还要用 OpenFeign?

在微服务架构中,LoadBalancer 和 OpenFeign 虽然都提供服务间调用的能力,但它们的设计目的和使用场景有所不同。

LoadBalancer 主要关注服务间的负载均衡,它可以帮助客户端在多个服务实例之间分配请求,以实现高可用性和性能优化。

OpenFeign 提供了一种声明式的 Web 服务客户端编程模型,它使得编写服务间调用的代码更加简洁和直观。

2. OpenFeign 是什么?

官网文档:Spring Cloud OpenFeign

OpenFeign 是 Spring Cloud 框架中集成声明式 HTTP客户端工具。

OpenFeign 可以让远程调用服务达到像本地调用方法一样的体验。

Feign 是 Netflix 开发的声明式、模板化的 HTTP 客户端,Feign 可帮助我们更加便捷、优雅地调用 HTTP API。Feign 可以做到使用 HTTP 请求远程服务时就像调用本地方法一样的体验,开发者完全感知不到这是远程方法,更感知不到这是个 HTTP 请求。

复制代码
//本地调用
Result<?> result = orderService.findOrderByUserId(id);
//openFeign远程调用 orderService为代理对象
Result<?> result = orderService.findOrderByUserId(id);

Spring Cloud OpenFeign 对 Feign 进行了增强,使其支持 Spring MVC 注解,从而使得 Feign 的使用更加方便。

3. 如何使用 OpenFeign ?

OpenFeign 在服务调用(消费)端使用,比如订单服务使用 OpenFeign 调用商品、库存、账户等服务。

3.1. 引入依赖

订单服务的 pom.xml 引入 OpenFeign 的依赖。

复制代码
<!-- openfeign 远程调用 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
3.2. 在订单服务启动类上添加 @EnableFeignClients 注解,开启 OpenFeign 功能。
复制代码
@EnableFeignClients
@EnableDiscoveryClient
@SpringBootApplication
public class OrderApplication {
3.3. 编写 OpenFeign 客户端,调用商品、库存、账户微服务。
复制代码
@FeignClient(name = "icoolkj-mall-account", path = "/api/account")
public interface AccountServiceFeignClient {

    @PostMapping("/reduce-balance")
    public Result<?> reduceBalance(@RequestBody AccountRequest accountRequest);

}


@FeignClient(name = "icoolkj-mall-inventory", path = "/api/inventory")
public interface InventoryServiceFeignClient {

    @PostMapping("/reduce-inventory")
    public Result<?> reduceInventory(@RequestBody InventoryRequest inventoryRequest);
}


@FeignClient(name = "icoolkj-mall-product", path = "/api/product")
public interface ProductServiceFeignClient {

    @GetMapping("/get-price-product")
    public Result<?> getPriceProduct(@RequestParam("productId") Long productId);

}
3.4. 订单服务发起调用,像调用本地方式一样远程调用商品、库存、账户服务。
复制代码
@Autowired
private AccountServiceFeignClient accountServiceFeignClient;

@Autowired
private ProductServiceFeignClient productServiceFeignClient;

@Autowired
private InventoryServiceFeignClient inventoryServiceFeignClient;

//OpenFeign 远程调用库存服务
int inventoryCode = inventoryServiceFeignClient.reduceInventory(inventoryRequest).getCode();

 //OpenFeign 远程调用商品服务
Result<ProductResponse> result = productServiceFeignClient.getPriceProduct(productId);

//OpenFeign 远程调用账户服务
Integer accountCode = accountServiceFeignClient.reduceBalance(accountRequest).getCode();
3.5. 重启订单服务,测试
3.5.1. Nacos 控制台查看服务注册情况
3.5.2. 下单,查看是否扣减库存,观察多个库存服务,是否都存在调用

4. 小结

通过 OpenFegin 可以实现微服务之间的远程调用。

相关推荐
茯苓gao12 小时前
嵌入式开发笔记:CANopen相关移位运算与通信协议术语详解
网络·嵌入式硬件·学习·信息与通信
万联WANFLOW12 小时前
SD-WAN 控制平面高可用怎么做?SDWAN 控制器挂了,全网会发生什么
运维·网络·分布式·架构
踩着两条虫12 小时前
可视化 vs 终端 vs 云端:VTJ.PRO、Claude Code、Codex 三强横评
前端·vue.js·人工智能·低代码·架构
Fabarta12 小时前
从 0 实现 ChatGPT 风格的流式对话 UI
算法·架构
搭贝13 小时前
低代码平台私有化部署架构与信创全栈适配实战
低代码·架构·rxjava
学渣超14 小时前
记一次分布式事务数据不一致的排查之旅:从超时到索引,层层剥茧
java·后端·架构
小短腿的代码世界14 小时前
Qt Bluetooth源码深度解析:从HCI协议到跨平台API的完整架构
开发语言·qt·架构
HERR_QQ15 小时前
强化学习的数学原理 学习笔记
人工智能·笔记·学习·自动驾驶
小短腿的代码世界15 小时前
Qt WebEngine多进程架构与IPC通信:从Chromium多进程到Qt信号槽融合
qt·架构·系统架构
谷雪_65815 小时前
Linux 网络命名空间:从内核原理到企业级容器网络架构全景实战
linux·网络·架构