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客户端。

  

posted @ 2019-03-05 21:22  SpringCore  阅读(281)  评论(0编辑  收藏  举报