我们都知道RestTemplate可以实现REST API调用,代码如下:
public User findById(Long id) {
return this.ribbonRestTemplate.getForObject("http://localhost:8080/user/" + id,User.class);
}
这种方法的URL是通过字符串拼接的方式实现的,方法存在一个弊端。比如:这个URL中仅有一个参数,拼接起来比较简单,但往往在实际开发中一个接口中会包含多个参数,参数越多越麻烦,这时使用拼接的方法去构造URL就会显得很麻烦低效,并且难以维护,如下:
public User[] findById(String name,String username,Integer age) {
Map<String,Object> map = Maps.newHashMap();
map.put("name",name);
map.put("username",username);
map.put("age",age);
return this.restTemplate.getForObject("http://loacalhost:8080/search?name={name}&username={username}&age={age}",User[].class,parmMap);
}
1、Feign简介
- Feign是Netflix开发的声明式、模板化的HTTP客户端,可帮助我们更加便捷、优雅地调用HTTP API;
- feign的使用很简单-创建一个接口,并在接口上添加一些注解代码就完成了;
- feign支持多种注解,如:feign自带的注解或者JAX-RS注解等。
2、使用Feign实现声明式的restful API的调用
2.1 添加Feign依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
<version>1.4.7.RELEASE</version>
</dependency>
2.2 创建一个Feign接口,并添加@FeignClient注解
@FeignClient(name = "user")
public interface UserFeignClient{
@RequestMapping(value = “/{id}”,method = RequestMethod.GET)
public User findById(@PathVariable("id") Long id);
}
@FeignClient注解中name表示客户端名称;用于创建Ribbon负载均衡器;
其中
name的名称会被Ribbon解析成Eureka Server服务注册表中的服务,如果不想使用Eureka,可以使用service.ribbon,listOfService属性配置服务器列表,
2.3 修改Controller代码,让其调用Feign接口
@RestController
public class MovieController{
@Autowired
private UserFeignClient userFeignClient;
@GetMapping("/user/{id}")
public User findById(@PathVariable Long id) {
return this.userFeignClient.findById(id);
}
}
2.4 修改启动类,让其添加@EnableFeignClients注解
这样微服务就可以用Feign去调用用户微服务的API了