利用RestTemplate发起远程调用的代码:

1
2
3
4
//2.远程查询user
//String url="http://localhost:8081/user/"+order.getUserId();
String url="http://userservice/user/"+order.getUserId();
User user = restTemplate.getForObject(url, User.class);

存在下面的问题:

•代码可读性差,编程体验不统一

•参数复杂URL难以维护

Feign替代RestTemplate

Fegin的使用步骤如下:

1)引入依赖

在服务的pom文件中引入feign的依赖:

1
2
3
4
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

2)添加注解

在启动类添加@EnableFeignClients

3)编写Feign的客户端

在order-service中新建一个接口,内容如下:

1
2
3
4
5
6
7
package com.muieay.order.client;

@FeignClient("userservice")
public interface UserClient {
@GetMapping("/user/{id}")
User findById(@PathVariable("id") Long id);
}

这个客户端主要是基于SpringMVC的注解来声明远程调用的信息,比如:

  • 服务名称:userservice
  • 请求方式:GET
  • 请求路径:/user/{id}
  • 请求参数:Long id
  • 返回值类型:User

这样,Feign就可以帮助我们发送http请求,无需自己使用RestTemplate来发送了。

4)测试

用Feign客户端代替RestTemplate:

1
2
3
4
5
6
7
8
//String url="http://userservice/user/"+order.getUserId();
//User user = restTemplate.getForObject(url, User.class);

//2.远程查询user
User user = userClient.findById(order.getUserId());

//3.存入
order.setUser(user);

5)总结

使用Feign的步骤:

① 引入依赖

② 添加@EnableFeignClients注解

③ 编写FeignClient接口

④ 使用FeignClient中定义的方法代替RestTemplate