介绍
利用RestTemplate发起远程调用的代码:
String url = "http://userservice/user/" + order.getUserId();
User user = restTemplate.getForObject(url, User.class);
存在下面的问题:
- 代码可读性差,编程体验不统一
- 参数复杂URL难以维护
Feign是一个声明式的http客户端,官方地址:https://github.com/OpenFeign/feign
其作用就是帮助我们优雅的实现http请求的发送,解决上面提到的问题。
定义和使用Feign客户端
1.引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2.在order-service的启动类添加注解开启Feign的功能:
@EnableFeignClients
@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
@Bean
public IRule iRule(){
//默认为轮询规则,这里自定义为随机规则
return new NacosRule();
}
}
3.请求接口
在 order-service 中新建一个接口,内容如下
@FeignClient("userservice")
public interface UserClient {
@GetMapping("/user/{id}")
User findById(@PathVariable("id") Long id);
}
@FeignClient("userservice")
:
其中参数填写的是微服务名
@GetMapping("/user/{id}")
:
其中参数填写的是请求路径
这个客户端主要是基于 SpringMVC 的注解 @GetMapping
来声明远程调用的信息
Feign 可以帮助我们发送 http 请求,无需自己使用 RestTemplate 来发送了。
测试
@Autowired
private UserClient userClient;
public Order queryOrderAndUserById(Long orderId) {
// 1.查询订单
Order order = orderMapper.findById(orderId);
// TODO: 2021/8/20 使用feign远程调用
User user = userClient.findById(order.getUserId());
// 3. 将用户信息封装进订单
order.setUser(user);
// 4.返回
return order;
}