Spring Cloud之OpenFeign的具体实践

1 基本概念

OpenFeign基于Feign框架开发,而Feign是Netflix开源的一个声明式Web服务客户端。OpenFeign通过定义接口、注解和动态代理等方式,将服务调用的过程封装起来,使得开发者只需要定义服务接口,而无需关心底层的HTTP请求和序列化等细节。

2 主要作用

  1. 声明式服务调用:OpenFeign允许开发者通过注解的方式定义HTTP请求,无需手动编写底层的HTTP客户端代码。开发者可以像调用本地方法一样调用远程方法,无需感知操作远程HTTP请求。
  2. 支持多种编码格式:OpenFeign能够处理JSON、XML等多种数据格式,并支持自定义序列化和反序列化。
  3. 集成Spring Cloud:与Spring Cloud的集成使得OpenFeign可以与Eureka、Ribbon等组件无缝工作,实现服务发现和负载均衡。
  4. 熔断机制:OpenFeign支持Hystrix熔断器,当被调用的服务发生故障时,熔断器会暂时切断调用,防止错误蔓延。
  5. 日志记录:OpenFeign提供了内置的日志功能,可以帮助开发者调试和监控请求。

3 实现思路

这里有两种实现思路:

  • 思路1:抽取到微服务之外的公共module

  • 思路2:每个微服务自己抽取一个module

如图:

方案1抽取更加简单,工程结构也比较清晰,但缺点是整个项目耦合度偏高。

方案2抽取相对麻烦,工程结构相对更复杂,但服务之间耦合度降低。

这里我们采用方案1。

4 具体实现

4.1 Nacos注册中心

现在我们有两个服务,一个购物车服务cart-service,一个商品服务item-service,点击购物车时,需要查询商品信息。两个服务都进行服务注册。

4.1.1入依赖
java 复制代码
<!--nacos 服务注册发现-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
4.1.2 配置文件
java 复制代码
spring:
  application:
    name: item-service # 服务名称
  cloud:
    nacos:
      server-addr: 192.168.60.100:8848 # nacos地址
java 复制代码
spring:
  application:
    name: cart-service # 服务名称
  cloud:
    nacos:
      server-addr: 192.168.60.100:8848 # nacos地址

4.2 创建一个api服务

4.2.1 导入itemDTO
java 复制代码
package com.heima.domain;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

@Data
@ApiModel(description = "商品实体")
public class ItemDTO {
    @ApiModelProperty("商品id")
    private Long id;
    @ApiModelProperty("SKU名称")
    private String name;
    @ApiModelProperty("价格(分)")
    private Integer price;
    @ApiModelProperty("库存数量")
    private Integer stock;
    @ApiModelProperty("商品图片")
    private String image;
    @ApiModelProperty("类目名称")
    private String category;
    @ApiModelProperty("品牌名称")
    private String brand;
    @ApiModelProperty("规格")
    private String spec;
    @ApiModelProperty("销量")
    private Integer sold;
    @ApiModelProperty("评论数")
    private Integer commentCount;
    @ApiModelProperty("是否是推广广告,true/false")
    private Boolean isAD;
    @ApiModelProperty("商品状态 1-正常,2-下架,3-删除")
    private Integer status;
}
4.2.2 引入依赖
java 复制代码
  <!--openFeign-->
  <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-openfeign</artifactId>
  </dependency>
  <!--负载均衡器-->
  <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-loadbalancer</artifactId>
  </dependency>
4.2.3 编写Fegin接口

也就是上图的的ItemClient,cart-service需要调用里面的方法。

java 复制代码
@FeignClient("item-service")
public interface ItemClient {

    @GetMapping("/items")
    List<ItemDTO> queryItemByIds(@RequestParam("ids") Collection<Long> ids);
}
4.2.4 cart-service需要导入api服务
java 复制代码
  <!--feign模块-->
  <dependency>
      <groupId>com.heima</groupId>
      <artifactId>hm-api</artifactId>
      <version>1.0.0</version>
  </dependency>
4.2.5 在cart-service启动类上声明itemClient的位置

两种方式:

方式1:声明扫描包:

方式2:声明要用的FeignClient

相关推荐
Apifox8 分钟前
如何在 Apifox 中通过 CLI 运行包含云端数据库连接配置的测试场景
前端·后端·程序员
掘金一周16 分钟前
金石焕新程 >> 瓜分万元现金大奖征文活动即将回归 | 掘金一周 4.3
前端·人工智能·后端
uhakadotcom38 分钟前
构建高效自动翻译工作流:技术与实践
后端·面试·github
Asthenia041244 分钟前
深入分析Java中的AQS:从应用到原理的思维链条
后端
Asthenia04121 小时前
如何设计实现一个定时任务执行器 - SpringBoot环境下的最佳实践
后端
兔子的洋葱圈1 小时前
【django】1-2 django项目的请求处理流程(详细)
后端·python·django
Asthenia04121 小时前
如何为这条sql语句建立索引:select * from table where x = 1 and y < 1 order by z;
后端
ihgry1 小时前
SpringBoot+Mybatis实现Mysql分表
后端
Asthenia04121 小时前
令牌桶算法与惰性机制的应用
后端
lamdaxu2 小时前
02Tomcat 线程模型详解&性能调优
后端