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