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

相关推荐
Every exam must be5 分钟前
12.2 vue学习02
学习
jgyzl9 分钟前
2026.1.7 tlias三层架构
java·mysql·架构
sunfove10 分钟前
照度 (E) 与亮度 (L) 的关系
学习
HL_风神20 分钟前
设计原则之单一职责原则
c++·学习·设计模式·单一职责原则
CS创新实验室1 小时前
正态分布的深入学习:从数学发现到自然法则的演变
学习·数据挖掘·数据分析·统计学·正态分布
半夏知半秋1 小时前
rust学习-Option与Result
开发语言·笔记·后端·学习·rust
王夏奇1 小时前
Python库学习-标准库
学习
wenxin-1 小时前
NS3学习-Packet数据包结构
网络·学习·ns3·ns3内核
Century_Dragon2 小时前
特斯拉Model3智能网联汽车自动驾驶虚拟教学实训软件
学习
wdfk_prog2 小时前
[Linux]学习笔记系列 -- [fs]read_write
linux·笔记·学习