今微服务之间实现模块间的通信,最简单的一种就是使用Feign调用服务接口,使另一个服务可以访问到另一个服务的数据。

一、Feign简介

Feign是一个声明式的REST客户端,他能让REST调用更加简单。Feign提供了Http请求的模板,通过编写简单的接口和添加上注解,就可以定义好HTTP请求的参数、格式、地址等信息。
Feign会完全代理HTTP请求,调用Feign接口只需要想调用方法一样调用它就可以完成服务请求及相关处理。

二、Spring Cloud中集成Feign

  • 微服务项目是一个服务对应一个数据库,如果一个服务要调用另外一个项目的接口,可以使用Feign作为桥梁,打通两个服务之间的通信;
    在这里插入图片描述
    在这里插入图片描述
  • 在spring-demo项目中新建cloud-base-api模块,用于管理Feign接口
    在这里插入图片描述
  • 在cloud-base-api模块下新建cloud-user-api和cloud-order-api
    在这里插入图片描述
    在这里插入图片描述
  • 在cloud-common模块的pom文件中引入Feign的依赖
<!-- feign -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
  • 在cloud-base-api的pom文件中引入common模块的依赖
<dependency>
    <groupId>jin.li.yun.com</groupId>
    <artifactId>cloud-common</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>
  • 在启动类上加上注解@EnableFeignClients
/**
 * @author WangJiao
 * @since 2020/10/14
 */
@MapperScan({"jin.li.yun.com.**.mapper"})
@EnableEurekaClient
@SpringBootApplication
@EnableFeignClients
public class UserApplication {
  public static void main(String[] args) {
    SpringApplication.run(UserApplication.class, args);
  }
}
/**
 * @author WangJiao
 * @since 2020/10/14
 */
@MapperScan({"jin.li.yun.com.**.mapper"})
@EnableEurekaClient
@SpringBootApplication
@EnableFeignClients
public class OrderApplication {
  public static void main(String[] args) {
    SpringApplication.run(OrderApplication.class, args);
  }
}

三、使用Feign调用接口

  • 编写cloud-base-api模块,用于管理Feign的客户端接口
    在这里插入图片描述
  • user模块需要调用order模块的订单列表接口
    order模块就需要提供一个内部接口供其他模块调用,由于微服务的每个模块有各自独立的数据库,所以其他模块是不能直接反问订单模块的,所以需要提供一个Feign接口作为中间桥梁,其他模块就可以调用这个Feign接口。
    在这里插入图片描述
  • order模块的内部接口代码清单
/**
 * @author WangJiao
 * @since 2020/10/14
 */
@RequestMapping(value = "/inner/order")
@RestController("innerOrderC")
@Api("INNER OrderAPI")
@Slf4j
public class OrderController {
  @Resource private OrderService service;

  @GetMapping("/list")
  @ApiOperation("订单列表")
  public ApiResult listByUserId(@RequestParam(value = Constant.HeaderKey.USER_ID) long userId) {
    log.info("listByUserId:[userId:{}]",userId);
    List<OrderPoJo> list = service.listByUserId(userId);
    List<OrderResponse> responseList = new ArrayList<>();
    list.forEach(o -> responseList.add(OrderResponse.of(o)));
    return ApiResult.ok(responseList);
  }
}
  • 创建order的Feign接口
    在这里插入图片描述
  • order的Feign接口代码清单:
/**
 * @author WangJiao
 * @since 2020/12/31
 */
@FeignClient(value = Constant.ServerName.CLOUD_ORDER)
public interface OrderApiService {

  @GetMapping("/order/inner/order/list")
  @ApiOperation("设备查询订单列表")
  ApiResult listByUserId(@RequestParam(value = Constant.HeaderKey.USER_ID) final long userId);
}
  • 注意点:
    (1)Feign接口的方法名必须与inner方法名相同(listByUserId)
    (2)uri必须相同(/order/inner/order/list)
    (3)Feign接口的接口上加上注解@FeignClient(value = Constant.ServerName.CLOUD_ORDER),这个注解标识当前是一个Feign接口的客户端,value属性对应的是服务名称。
    在user模块编写一个接口调用order的Feign接口
  • 代码清单:
/**
 * @author WangJiao
 * @since 2020/12/15
 */
@Slf4j
@RequestMapping(value = "/mini/user")
@RestController(value = "miniUserC")
@Api("MINI 用户API")
public class UserController {
  @Resource private UserService service;
  @Resource private OrderApiService orderApiService;

  /**
   * 获取用户订单列表
   *
   * @param userId userId
   * @return res
   */
  @GetMapping("/order-list")
  @ApiOperation("获取用户订单列表")
  public ApiResult orderList(@RequestParam(Constant.HeaderKey.USER_ID) long userId) {
    log.info("orderList:[userId:{}]", userId);
    return orderApiService.listByUserId(userId);
  }
}
  • user模块需要调用order的Feign接口,user模块的pom文件需要引入依赖
<dependency>
    <groupId>jin.li.yun.com</groupId>
    <artifactId>cloud-order-api</artifactId>
    <version>1.0-SNAPSHOT</version>
    <scope>compile</scope>
</dependency>
  • 启动服务,使用postman或者swagger调用接口http://localhost:5070/user/mini/user/order-list
    在这里插入图片描述
    :- 到这里,相信你已经get带了喔!赶快动手练练吧!!!
    在这里插入图片描述
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐