SpringCloud Feign
⒈Feign是什么?
Feign是Netflix开发的声明式、模板化的HTTP客户端, Feign可以帮助我们更快捷、优雅地调用HTTP API。
SpringCloud微服务项目之间调用是通过Rest请求来进行服务调用的,之前我们用到RestTemplate来进行服务请求,Spring通过Feign将RestTemplate封装成了可声明式的web客户端,使得编写web客户端更加简单。
在Spring Cloud中,使用Feign非常简单——创建一个接口,并在接口上添加一些注解,代码就完成了。Spring Cloud对Feign进行了增强,使Feign支持了Spring MVC注解和HttpmessageConverters、Feign注解或者JAX-RS注解等。Feign还支持可插拔的编码器和解码器,SpringCloud还对Feign集成了注册中心(Eureka)和客户端负载均衡(Ribbon),使得我们拥有一个客户端负载均衡的web请求客户端。
⒉示例
①在服务消费者项目工程中添加Feign依赖
1 <dependency> 2 <groupId>org.springframework.boot</groupId> 3 <artifactId>spring-boot-starter-web</artifactId> 4 </dependency> 5 <dependency> 6 <groupId>org.springframework.cloud</groupId> 7 <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> 8 </dependency> 9 <dependency> 10 <groupId>org.springframework.cloud</groupId> 11 <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> 12 </dependency> 13 <dependency> 14 <groupId>org.springframework.cloud</groupId> 15 <artifactId>spring-cloud-starter-openfeign</artifactId> 16 </dependency>
②创建一个Feign接口,并添加@FeignClient注解
1 package cn.coreqi.feign; 2 3 import cn.coreqi.entities.User; 4 import org.springframework.cloud.openfeign.FeignClient; 5 import org.springframework.web.bind.annotation.GetMapping; 6 import java.util.List; 7 8 @FeignClient(value = "USER-PROVIDER") //指定微服务实例名称 9 public interface UserFeignClient { 10 @GetMapping("/users") //指定调用微服务的服务地址 11 public List<User> getList(); 12 }
③修改Controller代码,让其调用Feign接口
1 package cn.coreqi.controller; 2 3 import cn.coreqi.entities.User; 4 import cn.coreqi.feign.UserFeignClient; 5 import org.springframework.beans.factory.annotation.Autowired; 6 import org.springframework.web.bind.annotation.GetMapping; 7 import org.springframework.web.bind.annotation.RestController; 8 import org.springframework.web.client.RestOperations; 9 import java.util.List; 10 11 @RestController 12 public class UserController { 13 @Autowired 14 private RestOperations restTemplate; 15 16 @Autowired 17 private UserFeignClient userFeignClient; 18 19 @GetMapping("/userno1") 20 public User getUsersFirst(){ 21 User[] users = restTemplate.getForObject("http://user-provider/users",User[].class); 22 return users[0]; 23 } 24 25 @GetMapping("/userno2") 26 public User getUsersFirst1(){ 27 List<User> users = userFeignClient.getList(); 28 return users.get(0); 29 } 30 }
④修改主程序启动类,为其添加@EnableFeignClients注解
1 package cn.coreqi; 2 3 import org.springframework.boot.SpringApplication; 4 import org.springframework.boot.autoconfigure.SpringBootApplication; 5 import org.springframework.cloud.client.discovery.EnableDiscoveryClient; 6 import org.springframework.cloud.client.loadbalancer.LoadBalanced; 7 import org.springframework.cloud.openfeign.EnableFeignClients; 8 import org.springframework.context.annotation.Bean; 9 import org.springframework.web.client.RestOperations; 10 import org.springframework.web.client.RestTemplate; 11 12 @SpringBootApplication 13 @EnableDiscoveryClient //开启服务发现功能 14 @EnableFeignClients(basePackages = {"cn.coreqi"}) 15 public class SpringbootcloudserviceconsumerApplication { 16 17 public static void main(String[] args) { 18 SpringApplication.run(SpringbootcloudserviceconsumerApplication.class, args); 19 } 20 21 @Bean 22 @LoadBalanced //使用负载均衡机制 23 public RestOperations restTemplate(){ 24 return new RestTemplate(); 25 } 26 27 }
⒊总结
其实通过Feign封装了HTTP调用服务方法,使得客户端像调用本地方法那样直接调用方法,类似Dubbo中暴露远程服务的方式,区别在于Dubbo是基于私有二进制协议,而Feign本质上还是个HTTP客户端。