微服务学习-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 可以实现微服务之间的远程调用。

相关推荐
宇擎智脑科技几秒前
A2A Python SDK 源码架构解读:一个请求是如何被处理的
人工智能·python·架构·a2a
solicitous20 分钟前
遇到一个口头机遇
学习·生活
uzong36 分钟前
Harness Engineering 是什么?一场新的 AI 范式已经开始
人工智能·后端·架构
墨有66638 分钟前
FieldFormer:基于物理场论的极简AI大模型底层架构,附带源码
人工智能·架构·电磁场算法映射
观书喜夜长2 小时前
大模型应用开发学习-基于 LangChain 框架实现的交互式问答脚本
python·学习
FPGA小迷弟2 小时前
FPGA 时序约束基础:从时钟定义到输入输出延迟的完整设置
前端·学习·fpga开发·verilog·fpga
Kel2 小时前
深入剖析 openai-node 源码:一个工业级 TypeScript SDK 的架构之美
javascript·人工智能·架构
毛骗导演3 小时前
@tencent-weixin/openclaw-weixin 插件深度解析(四):API 协议与数据流设计
前端·架构
毛骗导演3 小时前
@tencent-weixin/openclaw-weixin 插件深度解析(二):消息处理系统架构
前端·架构
EllenLiu3 小时前
架构演进与性能压榨:在金融 RAG 中引入条款森林 (FoC)
人工智能·架构