简介
Feign是Netflix开发的声明式、模板化的HTTP客户端, Feign可以帮助我们更快捷、优雅地调用HTTP API。在Spring Cloud中,使用Feign非常简单——创建一个接口,并在接口上添加一些注解,代码就完成了。Feign支持多种注解,例如Feign自带的注解或者JAX-RS注解等。Spring Cloud对Feign进行了增强,使Feign支持了Spring MVC注解,并整合了Ribbon和Eureka,从而让Feign的使用更加方便。
Spring Cloud Feign是基于Netflix feign实现,整合了Spring Cloud Ribbon和Spring Cloud Hystrix,除了提供这两者的强大功能外,还提供了一种声明式的Web服务客户端定义的方式。Spring Cloud Feign具备可插拔的注解支持,支持Feign注解、JAX-RS注解和Spring MVC的注解。
实例
微服务microservice-consumer-movie
在pom.xml中引入Feign的依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
<version>1.4.5.RELEASE</version>
</dependency>
使用Spring MVC注解 (Spring MVC注解和Feign注解可以选一个)
创建接口文件UserFeignClient
@FeignClient("microservice-provider-user")
public interface UserFeignClient {
@RequestMapping(value="/simple/{id}",method=RequestMethod.GET)
public User getUserById(@PathVariable("id") Long id);
@RequestMapping(value="/getUserById",method=RequestMethod.POST)
public User postUserById(@RequestBody User user);
}
使用Feign注解
创建Feign配置类FeignConfig
@Configuration
public class FeignConfig {
@Bean
public Contract feignConfiguration(){
return new feign.Contract.Default();
}
}
创建接口文件UserFeignClient
@FeignClient(name="microservice-provider-user",configuration=FeignConfig.class)
public interface UserFeignClient {
@RequestLine("GET /simple/{id}")
public User getUserById(@Param("id") Long id);
@RequestLine("POST /getUserById")
public User postUserById(@RequestBody User user);
}
Controller中的内容
@RestController
public class MovieController {
@Autowired
private UserFeignClient userFeignClient;
@GetMapping("/getUserById/{id}")
public User getUserById(@PathVariable Long id) {
return userFeignClient.getUserById(id);
}
@GetMapping("/postUserById/{id}")
public User postUserById(@PathVariable Long id) {
User user = new User();
user.setId(id);
return userFeignClient.postUserById(user);
}
}
在启动类上加上@EnableFeignClients注解
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class MicroserviceSimpleConsumerMovieApplication {
public static void main(String[] args) {
SpringApplication.run(MicroserviceSimpleConsumerMovieApplication.class, args);
}
}
microservice-provider-user微服务
Controller中的内容
@RestController
public class UserController {
@Autowired
private UserRepository userRepository;
@GetMapping("/simple/{id}")
public User findById(@PathVariable Long id) {
return userRepository.findById(id).orElse(null);
}
@PostMapping(value="/getUserById")
public User findById(@RequestBody User user) {
return userRepository.findById(user.getId()).orElse(null);
}
}
测试
启动项目后用在postman中输入http://localhost:8011/getUserById/1,成功输出结果
在postman中输入http://localhost:8011/postUserById/3,成功输出结果