spring cloud 之 Feign 使用HTTP請求遠程服務(wù)的實現(xiàn)方法
一、Feign 簡介
在spring Cloud Netflix棧中,各個微服務(wù)都是以HTTP接口的形式暴露自身服務(wù)的,因此在調(diào)用遠程服務(wù)時就必須使用HTTP客戶端。我們可以使用JDK原生的URLConnection、Apache的Http Client、Netty的異步HTTP Client, Spring的RestTemplate。但是,用起來最方便、最優(yōu)雅的還是要屬Feign了。
Feign是一種聲明式、模板化的HTTP客戶端。在Spring Cloud中使用Feign, 我們可以做到使用HTTP請求遠程服務(wù)時能與調(diào)用本地方法一樣的編碼體驗,開發(fā)者完全感知不到這是遠程方法,更感知不到這是個HTTP請求。
二、feign的使用在spring cloud中的使用
1、添加依賴
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId> </dependency>
2、創(chuàng)建FeignClient
@FeignClient(name="SPRING-PRODUCER-SERVER/spring") public interface FeignUserClient { @RequestMapping( value = "/findAll/{name}",method = RequestMethod.GET) public List<SpringUser> findAll(@PathVariable("name") String name); @RequestMapping( value = "/findUserPost",method = RequestMethod.POST) public SpringUser findUserPost(@RequestBody SpringUser springUser);//復(fù)合類型好像默認是POST請求 }
@FeignClient(name="SPRING-PRODUCER-SERVER/spring"):用于通知Feign組件對該接口進行代理(不需要編寫接口實現(xiàn)),name屬性指定我們要調(diào)用哪個服務(wù)。使用者可直接通過@Autowired注入。
@RequestMapping表示在調(diào)用該方法時需要向/group/{groupId}發(fā)送GET請求。
@PathVariable與SpringMVC中對應(yīng)注解含義相同。
原理:Spring Cloud應(yīng)用在啟動時,F(xiàn)eign會掃描標有@FeignClient注解的接口,生成代理,并注冊到Spring容器中。生成代理時Feign會為每個接口方法創(chuàng)建一個RequetTemplate對象,該對象封裝了HTTP請求需要的全部信息,請求參數(shù)名、請求方法等信息都是在這個過程中確定的,F(xiàn)eign的模板化就體現(xiàn)在這里。
3、啟動類上添加注解
@Configuration @ComponentScan @EnableAutoConfiguration @EnableEurekaClient @EnableFeignClients public class SpringConsumerServerFeignApplication { public static void main(String[] args) { SpringApplication.run(SpringConsumerServerFeignApplication.class, args); } }
4、配置文件 application.yml
spring: application: name: spring-consumer-server-feign server: port: 8084 context-path: /spring #服務(wù)注冊中心的配置內(nèi)容,指定服務(wù)注冊中心的位置 eureka: client: serviceUrl: defaultZone: http://user:password@localhost:8761/eureka/
三、自定義Feign的 配置
1、自定義Configuration
@Configuration public class FooConfiguration { @Bean public Contract feignContract() { //這將SpringMvc Contract 替換為feign.Contract.Default return new feign.Contract.Default(); } }
2、使用自定義的Configuration
@FeignClient(name="SPRING-PRODUCER-SERVER/spring",configuration=FooConfiguration.class) public interface FeignUserClient { @RequestLine("GET /findAll/{name}") public List<SpringUser> findAll(@Param("name") String name); /* @RequestMapping( value = "/findAll/{name}",method = RequestMethod.GET) public List<SpringUser> findAll(@PathVariable("name") String name); @RequestMapping( value = "/findUserPost",method = RequestMethod.POST) public SpringUser findUserPost(@RequestBody SpringUser springUser);*/ }
@RequestLine:是feign的注解
四、Feign日志的配置
為每個創(chuàng)建的Feign客戶端創(chuàng)建一個記錄器。默認情況下,記錄器的名稱是用于創(chuàng)建Feign客戶端的接口的完整類名。Feign日志記錄僅響應(yīng)DEBUG級別。logging.level.project.user.UserClient: DEBUG
在配置文件application.yml 中加入:
logging: level: com.jalja.org.spring.simple.dao.FeignUserClient: DEBUG
在自定義的Configuration的類中添加日志級別
@Configuration public class FooConfiguration { /* @Bean public Contract feignContract() { //這將SpringMvc Contract 替換為feign.Contract.Default return new feign.Contract.Default(); }*/ @Bean Logger.Level feignLoggerLevel() { //設(shè)置日志 return Logger.Level.FULL; } }
PS:Feign請求超時問題
Hystrix默認的超時時間是1秒,如果超過這個時間尚未響應(yīng),將會進入fallback代碼。而首次請求往往會比較慢(因為Spring的懶加載機制,要實例化一些類),這個響應(yīng)時間可能就大于1秒了
解決方案有三種,以feign為例。
方法一
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: 5000
該配置是讓Hystrix的超時時間改為5秒
方法二
hystrix.command.default.execution.timeout.enabled: false
該配置,用于禁用Hystrix的超時時間
方法三
feign.hystrix.enabled: false
該配置,用于索性禁用feign的hystrix。該做法除非一些特殊場景,不推薦使用。
以上這篇spring cloud 之 Feign 使用HTTP請求遠程服務(wù)的實現(xiàn)方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java中char數(shù)組(字符數(shù)組)與字符串String類型的轉(zhuǎn)換方法
這篇文章主要介紹了Java中char數(shù)組(字符數(shù)組)與字符串String類型的轉(zhuǎn)換方法,涉及Java中toCharArray與valueOf方法的使用技巧,需要的朋友可以參考下2015-12-12解決IDEA springboot"spring-boot-maven-plugin"報紅問題
這篇文章主要介紹了解決IDEA springboot"spring-boot-maven-plugin"報紅問題,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-04-04Java中BeanUtils.copyProperties()詳解及應(yīng)用場景
BeanUtils.copyProperties()是Apache?Commons?BeanUtils提供的方法,用于Java對象間屬性的復(fù)制,特別適用于DTO、VO和Entity之間的數(shù)據(jù)傳遞,這篇文章主要介紹了Java中BeanUtils.copyProperties()詳解及應(yīng)用場景的相關(guān)資料,需要的朋友可以參考下2024-09-09SpringAOP實現(xiàn)日志收集管理功能(步驟詳解)
這篇文章主要介紹了SpringAOP實現(xiàn)日志收集管理功能,本文分步驟通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-03-03Java 最優(yōu)二叉樹的哈夫曼算法的簡單實現(xiàn)
這篇文章主要介紹了Java 最優(yōu)二叉樹的哈夫曼算法的簡單實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10