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

相关推荐
随心Coding31 分钟前
【零基础入门Go语言】错误处理:如何更优雅地处理程序异常和错误
开发语言·后端·golang
m0_7482345232 分钟前
【Spring Boot】Spring AOP动态代理,以及静态代理
spring boot·后端·spring
咸甜适中2 小时前
go语言gui窗口应用之fyne框架-动态添加、删除一行控件(逐行注释)
开发语言·后端·golang
梁雨珈2 小时前
Groovy语言的安全开发
开发语言·后端·golang
十二同学啊2 小时前
Spring Boot 中的 InitializingBean:Bean 初始化背后的故事
java·spring boot·后端
沈霁晨3 小时前
Perl语言的语法糖
开发语言·后端·golang
DevOpsDojo3 小时前
HTML语言的数据结构
开发语言·后端·golang
谦行3 小时前
前端视角 Java Web 入门手册 1.3:Java 世界的规则
java·后端
时韵瑶4 小时前
Scala语言的云计算
开发语言·后端·golang
Jerry Lau4 小时前
大模型-本地化部署调用--基于ollama+openWebUI+springBoot
java·spring boot·后端·llama