继文章 微服务系列之 Eureka 实现注册中心案例,可以发现,我们在远程调用时,使用以下的方式:
public class OrderService {
@Autowired
private OrderMapper orderMapper;
@Autowired
private RestTemplate restTemplate;
public Order queryOrderById(Long orderId) {
// 1.查询订单
Order order = orderMapper.findById(orderId);
// 2.查询用户信息,远程调用,放弃http请求
String url = "http://userservice/user/"+order.getUserId();
User user = restTemplate.getForObject(url, User.class);
// 3.封装User到Order
order.setUser(user);
// 4.返回
return order;
}
}
给人的第一感觉就是:不优雅,这种方式是使用RestTemplate
的方式来发起的远程调用,在代码中还存在"http://userservice/user/"
类似的请求地址,如果项目大了起来,或者说是url后面的参数多了起来,可以想象,代码中就会存在大量的url地址,不优雅。
以下,介绍Feign的用法来规避这种问题的出现。
Feign简介
Feign是一个声明式的http客户端,官方地址:https://github.com/OpenFeign/feign 其作用就是帮助我们优雅的实现http请求的发送,解决上面提到的问题。
使用
依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
<version>1.4.7.RELEASE</version>
</dependency>
功能开启
@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
@EnableFeignClients //开启Feign
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
}
定义一个接口
@FeignClient("userservice")//指定服务名称:userservice,将来要通过发送http请求
public interface UserClient {
@GetMapping("user/{id}")
User getUserById(@PathVariable("id") Long id);
}
使用,改变原来的OrderService写法
@Autowired
private UserClient userClient;
public Order queryOrderById(Long orderId) {
// 1.查询订单
Order order = orderMapper.findById(orderId);
// 2.使用Feign来远程调用
User user = userClient.getUserById(order.getUserId());
order.setUser(user);
// 4.返回
return order;
}
测试
总结
Feign的使用步骤
- 引入依赖
- 添加@EnableFeignClients注解
- 编写FeignClient接口
- 使用FeignClient中定义的方法代替RestTemplate