spring cloud 之 Feign 使用HTTP請(qǐng)求遠(yuǎn)程服務(wù)的實(shí)現(xiàn)方法
一、Feign 簡(jiǎn)介
在spring Cloud Netflix棧中,各個(gè)微服務(wù)都是以HTTP接口的形式暴露自身服務(wù)的,因此在調(diào)用遠(yuǎn)程服務(wù)時(shí)就必須使用HTTP客戶(hù)端。我們可以使用JDK原生的URLConnection、Apache的Http Client、Netty的異步HTTP Client, Spring的RestTemplate。但是,用起來(lái)最方便、最優(yōu)雅的還是要屬Feign了。
Feign是一種聲明式、模板化的HTTP客戶(hù)端。在Spring Cloud中使用Feign, 我們可以做到使用HTTP請(qǐng)求遠(yuǎn)程服務(wù)時(shí)能與調(diào)用本地方法一樣的編碼體驗(yàn),開(kāi)發(fā)者完全感知不到這是遠(yuǎn)程方法,更感知不到這是個(gè)HTTP請(qǐng)求。
二、feign的使用在spring cloud中的使用
1、添加依賴(lài)
<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ù)合類(lèi)型好像默認(rèn)是POST請(qǐng)求
}
@FeignClient(name="SPRING-PRODUCER-SERVER/spring"):用于通知Feign組件對(duì)該接口進(jìn)行代理(不需要編寫(xiě)接口實(shí)現(xiàn)),name屬性指定我們要調(diào)用哪個(gè)服務(wù)。使用者可直接通過(guò)@Autowired注入。
@RequestMapping表示在調(diào)用該方法時(shí)需要向/group/{groupId}發(fā)送GET請(qǐng)求。
@PathVariable與SpringMVC中對(duì)應(yīng)注解含義相同。
原理:Spring Cloud應(yīng)用在啟動(dòng)時(shí),F(xiàn)eign會(huì)掃描標(biāo)有@FeignClient注解的接口,生成代理,并注冊(cè)到Spring容器中。生成代理時(shí)Feign會(huì)為每個(gè)接口方法創(chuàng)建一個(gè)RequetTemplate對(duì)象,該對(duì)象封裝了HTTP請(qǐng)求需要的全部信息,請(qǐng)求參數(shù)名、請(qǐng)求方法等信息都是在這個(gè)過(guò)程中確定的,F(xiàn)eign的模板化就體現(xiàn)在這里。
3、啟動(dòng)類(lèi)上添加注解
@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ù)注冊(cè)中心的配置內(nèi)容,指定服務(wù)注冊(cè)中心的位置 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日志的配置
為每個(gè)創(chuàng)建的Feign客戶(hù)端創(chuàng)建一個(gè)記錄器。默認(rèn)情況下,記錄器的名稱(chēng)是用于創(chuàng)建Feign客戶(hù)端的接口的完整類(lèi)名。Feign日志記錄僅響應(yīng)DEBUG級(jí)別。logging.level.project.user.UserClient: DEBUG
在配置文件application.yml 中加入:
logging: level: com.jalja.org.spring.simple.dao.FeignUserClient: DEBUG
在自定義的Configuration的類(lèi)中添加日志級(jí)別
@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請(qǐng)求超時(shí)問(wèn)題
Hystrix默認(rèn)的超時(shí)時(shí)間是1秒,如果超過(guò)這個(gè)時(shí)間尚未響應(yīng),將會(huì)進(jìn)入fallback代碼。而首次請(qǐng)求往往會(huì)比較慢(因?yàn)镾pring的懶加載機(jī)制,要實(shí)例化一些類(lèi)),這個(gè)響應(yīng)時(shí)間可能就大于1秒了
解決方案有三種,以feign為例。
方法一
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: 5000
該配置是讓Hystrix的超時(shí)時(shí)間改為5秒
方法二
hystrix.command.default.execution.timeout.enabled: false
該配置,用于禁用Hystrix的超時(shí)時(shí)間
方法三
feign.hystrix.enabled: false
該配置,用于索性禁用feign的hystrix。該做法除非一些特殊場(chǎng)景,不推薦使用。
以上這篇spring cloud 之 Feign 使用HTTP請(qǐng)求遠(yuǎn)程服務(wù)的實(shí)現(xiàn)方法就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
實(shí)踐講解SpringBoot自定義初始化Bean+HashMap優(yōu)化策略模式
本篇講解了SpringBoot自定義初始化Bean+HashMap優(yōu)化策略模式,通過(guò)實(shí)踐的方式更通俗易懂,對(duì)此不了解的同學(xué)跟著小編往下看吧2021-09-09
Java如何利用CompletableFuture描述任務(wù)之間的關(guān)系
Java如何根據(jù)線程的執(zhí)行結(jié)果執(zhí)行下一步動(dòng)作呢,F(xiàn)uture的另一個(gè)實(shí)現(xiàn)類(lèi)CompletableFuture能夠優(yōu)雅的解決異步化問(wèn)題,下面就跟隨小編一起了解一下吧2023-07-07
EntityWrapper如何在and條件中嵌套o(hù)r語(yǔ)句
這篇文章主要介紹了EntityWrapper如何在and條件中嵌套o(hù)r語(yǔ)句,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
如何把本地jar包導(dǎo)入maven并pom添加依賴(lài)
這篇文章主要介紹了如何把本地jar包導(dǎo)入maven并pom添加依賴(lài),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11

