使用Feign调用服务接口
一看就会的使用Feign调用服务接口,使微服务的各个模块相互之间可以进行数据访问。赶快动动小手练练吧。
·
微服务跨模块调用接口之Feign接口
今微服务之间实现模块间的通信,最简单的一种就是使用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带了喔!赶快动手练练吧!!!
更多推荐
已为社区贡献4条内容
所有评论(0)