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

相关推荐
2401_8827275725 分钟前
BY组态-低代码web可视化组件
前端·后端·物联网·低代码·数学建模·前端框架
心仪悦悦40 分钟前
Scala中的集合复习(1)
开发语言·后端·scala
代码小鑫1 小时前
A043-基于Spring Boot的秒杀系统设计与实现
java·开发语言·数据库·spring boot·后端·spring·毕业设计
真心喜欢你吖1 小时前
SpringBoot与MongoDB深度整合及应用案例
java·spring boot·后端·mongodb·spring
激流丶1 小时前
【Kafka 实战】Kafka 如何保证消息的顺序性?
java·后端·kafka
uzong2 小时前
一个 IDEA 老鸟的 DEBUG 私货之多线程调试
java·后端
飞升不如收破烂~3 小时前
Spring boot常用注解和作用
java·spring boot·后端
何遇mirror3 小时前
云原生基础-云计算概览
后端·云原生·云计算
岁岁岁平安3 小时前
springboot实战(15)(注解@JsonFormat(pattern=“?“)、@JsonIgnore)
java·spring boot·后端·idea
颜淡慕潇4 小时前
【K8S系列】kubectl describe pod显示ImagePullBackOff,如何进一步排查?
后端·云原生·容器·kubernetes