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

相关推荐
bug菌30 分钟前
Java GUI编程进阶:多线程与并发处理的实战指南
java·后端·java ee
夜月行者2 小时前
如何使用ssm实现基于SSM的宠物服务平台的设计与实现+vue
java·后端·ssm
Yvemil72 小时前
RabbitMQ 入门到精通指南
开发语言·后端·ruby
猿java3 小时前
使用 Kafka面临的挑战
java·后端·kafka
碳苯3 小时前
【rCore OS 开源操作系统】Rust 枚举与模式匹配
开发语言·人工智能·后端·rust·操作系统·os
kylinxjd3 小时前
spring boot发送邮件
java·spring boot·后端·发送email邮件
杨荧3 小时前
【JAVA开源】基于Vue和SpringBoot的旅游管理系统
java·vue.js·spring boot·spring cloud·开源·旅游
2401_857439696 小时前
Spring Boot新闻推荐系统:用户体验优化
spring boot·后端·ux
进击的女IT7 小时前
SpringBoot上传图片实现本地存储以及实现直接上传阿里云OSS
java·spring boot·后端