一、OpenFegin 介紹
Feign是一個聲明性的Web服務客戶端。 它使編寫Web服務客戶端變得更容易。 要使用Feign,請創建一個界面並對其進行注釋。 它具有可插入的注釋支持,包括Feign注釋和JAX-RS注釋。 Feign還支持可插拔編碼器和解碼器。 Spring Cloud增加了對Spring MVC注釋的支持,並使用了Spring Web中默認使用的相同HttpMessageConverters。 Spring Cloud集成了Ribbon和Eureka,在使用Feign時提供負載均衡的http客戶端。
二、將OpenFegin應用到項目中
添加依賴到項目中:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
新建一個FeignClient類
1 package com.zwjk.cloud.fegin; 2 3 import com.zwjk.cloud.entity.User; 4 import org.springframework.cloud.openfeign.FeignClient; 5 import org.springframework.web.bind.annotation.GetMapping; 6 import org.springframework.web.bind.annotation.PathVariable; 7 import org.springframework.web.bind.annotation.PostMapping; 8 import org.springframework.web.bind.annotation.RequestBody; 9 10 /** 11 * @author : Jixiaohu 12 * @Date : 2019-04-12. 13 * @Time : 16:50. 14 * @Description : 15 */ 16 @FeignClient("microservice-provider-user") 17 public interface UserFeignClient { 18 //@PathVariable得設置value 19 @GetMapping("/simple/{id}") 20 User findById(@PathVariable("id") Long id); //@PathVariable得設置value 21 22 @PostMapping("/user") 23 User postUser(@RequestBody User user); 24 25 // 該請求不會成功,只要參數是復雜對象,即使指定了是GET方法,feign依然會以POST方法進行發送請求。 26 @GetMapping("/get-user") 27 User getUser(User user); 28 }
在movie的controller中。使用feign調用user微服務提供的接口
1 package com.zwjk.cloud.controller; 2 3 import com.zwjk.cloud.entity.User; 4 import com.zwjk.cloud.fegin.UserFeignClient; 5 import org.springframework.beans.factory.annotation.Autowired; 6 import org.springframework.beans.factory.annotation.Value; 7 import org.springframework.web.bind.annotation.GetMapping; 8 import org.springframework.web.bind.annotation.PathVariable; 9 import org.springframework.web.bind.annotation.RestController; 10 import org.springframework.web.client.RestTemplate; 11 12 /** 13 * @author : Jixiaohu 14 * @Date : 2019-04-11. 15 * @Time : 9:38. 16 * @Description : 17 */ 18 @RestController 19 public class MovieController { 20 21 @Autowired 22 private UserFeignClient userFeignClient; 23 24 @GetMapping("/movie/{id}") 25 public User findById(@PathVariable Long id) { 26 return this.userFeignClient.findById(id); 27 } 28 29 @GetMapping("/test") 30 public User testPost(User user) { 31 return this.userFeignClient.postUser(user); 32 } 33 34 @GetMapping("/test-get") 35 public User testGet(User user) { 36 return this.userFeignClient.getUser(user); 37 } 38 39 40 }
1 package com.zwjk.cloud.controller; 2 3 import com.zwjk.cloud.entity.User; 4 import com.zwjk.cloud.repository.UserRepository; 5 import org.springframework.beans.factory.annotation.Autowired; 6 import org.springframework.web.bind.annotation.*; 7 8 /** 9 * @author : Jixiaohu 10 * @Date : 2019-04-11. 11 * @Time : 9:08. 12 * @Description : 13 */ 14 @RestController 15 public class UserController { 16 17 @Autowired 18 private UserRepository userRepository; 19 20 @GetMapping("/simple/{id}") 21 public User findById(@PathVariable Long id) { 22 return this.userRepository.getUserById(id); 23 } 24 25 @PostMapping("/user") 26 public User postUser(@RequestBody User user) { 27 return user; 28 } 29 30 // 該請求不會成功 31 @GetMapping("/get-user") 32 public User getUser(User user) { 33 return user; 34 } 35 }
訪問地址:http://localhost:8010/movie/1
查看結果返回:
這邊需要注意的是,在feignClient中,注釋表明的說明。
這里,就簡單實現了使用feignClient調用服務接口。
下面看一下,如何復寫默認的FeignClientsConfihuration
https://cloud.spring.io/spring-cloud-static/spring-cloud-openfeign/2.1.0.RELEASE/single/spring-cloud-openfeign.html#spring-cloud-feign-overriding-defaults
官方文檔中,有這樣的說明
Spring Cloud的Feign支持的核心概念是指定客戶端的概念。 每個feign客戶端都是一組組件的一部分,這些組件一起工作以按需聯系遠程服務器,並且該集合具有一個名稱,您可以使用@FeignClient注釋將其作為應用程序開發人員提供。 Spring Cloud使用FeignClientsConfiguration按需為每個命名客戶端創建一個新的集合作為ApplicationContext。 這包含(除其他外)feign.Decoder,feign.Encoder和feign.Contract。 可以使用@FeignClient批注的contextId屬性覆蓋該集合的名稱。
Spring Cloud允許您通過使用@FeignClient聲明其他配置(在FeignClientsConfiguration之上)來完全控制假裝客戶端。 例:
@FeignClient(name = "stores", configuration = FooConfiguration.class) public interface StoreClient { //.. }
這邊有個警告,跟ribbon的自定義配置一樣,自定義的配置,需要放在掃描包的外部,查看一下怎么寫,https://github.com/OpenFeign/feign
下面看一下代碼:
1 package com.zwjk.cloud.fegin; 2 3 import com.zwjk.cloud.entity.User; 4 import com.zwjk.config.UserConfiguration; 5 import feign.Param; 6 import feign.RequestLine; 7 import org.springframework.cloud.openfeign.FeignClient; 8 9 /** 10 * @author : Jixiaohu 11 * @Date : 2019-04-12. 12 * @Time : 16:50. 13 * @Description : 14 */ 15 @FeignClient(name = "microservice-provider-user", configuration = UserConfiguration.class) 16 public interface UserFeignClient { 17 //@PathVariable得設置value 18 @RequestLine("GET /simple/{id}") 19 User findById(@Param("id") Long id); //@PathVariable得設置value 20 21 }
1 package com.zwjk.config; 2 3 import feign.Contract; 4 import feign.Logger; 5 import org.springframework.context.annotation.Bean; 6 import org.springframework.context.annotation.Configuration; 7 8 /** 9 * @author : Jixiaohu 10 * @Date : 2019-04-13. 11 * @Time : 10:20. 12 * @Description : 13 */ 14 @Configuration 15 public class UserConfiguration { 16 17 @Bean 18 public Contract feignContract() { 19 return new feign.Contract.Default(); 20 } 21 22 @Bean 23 Logger.Level feignLoggerLevel() { 24 return Logger.Level.FULL; 25 } 26 }
其他的不需要修改,下面看一下目錄結構:
UserConfiguretion需要放在外面。