做極速賽車(chē)網(wǎng)站公眾號(hào)推廣
1、項(xiàng)目中接口的調(diào)用方式
1.1 HttpClient
- HttpClient 是 Apache Jakarta Common 下的子項(xiàng)目,用來(lái)提供高效的、最新的、功能豐富的支持 Http 協(xié)議的客戶端編程工具包,并且它支持 HTTP 協(xié)議最新版本和建議。HttpClient 相比傳統(tǒng) JDK 自帶的 URLConnection,提升了易用性和靈活性,使客戶端發(fā)送 HTTP 請(qǐng)求變得容易,提高了開(kāi)發(fā)的效率。
1.2 OkHttp
- 一個(gè)處理網(wǎng)絡(luò)請(qǐng)求的開(kāi)源項(xiàng)目,是安卓端最火的輕量級(jí)框架,由 Square 公司貢獻(xiàn),用于替代 HttpUrlConnection 和 Apache HttpClient。OkHttp 擁有簡(jiǎn)潔的 API、高效的性能,并支持多種協(xié)議(HTTP/2 和 SPDY)。
1.3 HttpURLConnection
- HttpURLConnection 是 Java 的標(biāo)準(zhǔn)類(lèi),它繼承自 URLConnection,可用于向指定網(wǎng)站發(fā)送 GET 請(qǐng)求、POST 請(qǐng)求。HttpURLConnection 使用比較復(fù)雜,不像 HttpClient 那樣容易使用。
1.4 RestTemplate
- RestTemplate 是 Spring 提供的用于訪問(wèn) Rest 服務(wù)的客戶端,RestTemplate 提供了多種便捷訪問(wèn)遠(yuǎn)程 HTTP 服務(wù)的方法,能夠大大提高客戶端的編寫(xiě)效率。
1.5 WebClient
- WebClient 是 Spring WebFlux 模塊提供的一個(gè)非阻塞的基于響應(yīng)式編程的進(jìn)行 Http 請(qǐng)求的客戶端工具。
- WebFlux 對(duì)標(biāo) SpringMvc,WebClient 相當(dāng)于 RestTemplate,同時(shí)也是 Spring 官方的 Http 請(qǐng)求工具。
- 與RestTemplate相比,WebClient的優(yōu)勢(shì):
- 非阻塞響應(yīng)式IO,單位時(shí)間內(nèi)有限資源下支持更高的并發(fā)量。
- 支持使用Java8 Lambda表達(dá)式函數(shù)。
- 支持同步、異步、Stream流式傳輸。
以上是最常見(jiàn)的幾種調(diào)用接口的方式,下面介紹比上面更簡(jiǎn)單方便的方式---- Feign
2、什么是Feign
- Feign是Netflix開(kāi)發(fā)的聲明式、模板化的HTTP客戶端,其靈感來(lái)自Retrofit、JAXRS-2.0以及WebSocket。Feign可幫助我們更加便捷、優(yōu)雅地調(diào)用HTTP API。
- Feign支持多種注解,例如Feign自帶的注解或者JAX-RS注解等。
2.1 Feign的優(yōu)勢(shì)
- Feign可以做到使用 HTTP 請(qǐng)求遠(yuǎn)程服務(wù)時(shí)就像調(diào)用本地方法一樣的體驗(yàn),開(kāi)發(fā)者完全感知不到這是遠(yuǎn)程方法,更感知不到這是個(gè) HTTP 請(qǐng)求。
- 它像 Dubbo 一樣,consumer 直接調(diào)用接口方法調(diào)用 provider,而不需要通過(guò)常規(guī)的 Http Client 構(gòu)造請(qǐng)求再解析返回?cái)?shù)據(jù)。它解決了讓開(kāi)發(fā)者調(diào)用遠(yuǎn)程接口就跟調(diào)用本地方法一樣,無(wú)需關(guān)注與遠(yuǎn)程的交互細(xì)節(jié),更無(wú)需關(guān)注分布式環(huán)境開(kāi)發(fā)。
3、快速整合OpenFeign
3.1 導(dǎo)入依賴
<!--OpenFeign 遠(yuǎn)程調(diào)用--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>
3.2 編寫(xiě)調(diào)用接口
@FeignClient
:指定遠(yuǎn)程調(diào)用的服務(wù)和方法/*** name:指定調(diào)用的Rest接口的服務(wù)名* path:指定調(diào)用的Rest接口的請(qǐng)求路徑,即:StockController指定的@RequestMapping中的路徑* configuration:指定配置類(lèi)*/ @FeignClient(name = "StockService",path = "/stock/stockapi",configuration = FeignConfig.class) public interface StockFeignService {//聲明需要調(diào)用的Rest接口對(duì)應(yīng)的方法@RequestMapping("/handle")String getStock();}
3.3 在啟動(dòng)類(lèi)中開(kāi)啟遠(yuǎn)程調(diào)用的功能
@EnableFeignClients
:開(kāi)啟遠(yuǎn)程調(diào)用@SpringBootApplication @EnableFeignClients //這里設(shè)置要為哪個(gè)服務(wù)提供方選用指定的負(fù)載均衡的規(guī)則 @RibbonClients(value = {@RibbonClient(name = "StockService", configuration = RibbonConfig.class) }) public class OrderServiceApplication {public static void main(String[] args) {SpringApplication.run(OrderServiceApplication.class, args);} }
3.4 發(fā)起調(diào)用
- 像調(diào)用本地方法一樣調(diào)用遠(yuǎn)程服務(wù)
@RestController @RequestMapping("/orderapi") public class OrderController {@Autowiredprivate StockFeignService stockFeignService;@RequestMapping("/add")public String addOrder(){System.out.println("OpenFeign方式調(diào)用:下單成功");String stock = stockFeignService.getStock();return "下單成功:"+ stock;} }
4、Feign的自定義配置和使用
- Feign 提供了很多的擴(kuò)展機(jī)制,讓用戶可以更加靈活的使用。
4.1 日志配置
- 有時(shí)候我們遇到 Bug,比如接口調(diào)用失敗、參數(shù)沒(méi)收到等問(wèn)題,或者想看看調(diào)用性能,就需要配置 Feign 的日志了,以此讓 Feign 把請(qǐng)求信息輸出來(lái)。
- Feign的日志級(jí)別:
NONE
【性能最佳,適用于生產(chǎn)】:不記錄任何日志(默認(rèn)值)。BASIC
【適用于生產(chǎn)環(huán)境追蹤問(wèn)題】:僅記錄請(qǐng)求方法、URL、響應(yīng)狀態(tài)代碼以及執(zhí)行時(shí)間。HEADERS
:記錄BASIC級(jí)別的基礎(chǔ)上,記錄請(qǐng)求和響應(yīng)的header。FULL
【比較適用于開(kāi)發(fā)及測(cè)試環(huán)境定位問(wèn)題】:記錄請(qǐng)求和響應(yīng)的header、body和元數(shù)據(jù)。
4.1.1 通過(guò)配置類(lèi)的方式進(jìn)行配置
- 編寫(xiě)配置類(lèi):
/*** 全局配置:如果使用了@Configuration注解,將會(huì)對(duì)所有的服務(wù)提供方都執(zhí)行該配置* 局部配置:* 1、如果想針對(duì)某一個(gè)服務(wù)進(jìn)行配置,就不要加@Configuration注解* 2、通過(guò)配置文件進(jìn)行配置*/@Configuration public class FeignConfig {/*** 設(shè)置feign的日志級(jí)別* @return*/@Beanpublic Logger.Level feignLoggerLevel(){return Logger.Level.BASIC;}}
- 讓調(diào)用的服務(wù)使用指定的Feign配置
- 修改yml配置文件中(默認(rèn)是info)的日志級(jí)別,因?yàn)閒eign的日志級(jí)別是debug。
# SpringBoot默認(rèn)的日志級(jí)別是info,feign的日志級(jí)別是debug logging:level:root: infocom.example.order.feign: debug # 設(shè)置feign服務(wù)所在包下的日志級(jí)別
4.1.2 在配置文件中進(jìn)行配置
- 對(duì)應(yīng)屬性配置類(lèi): org.springframework.cloud.openfeign.FeignClientProperties.FeignClientConfiguration
# Feign日志局部配置 feign:client:config:StockService: # 對(duì)應(yīng)的服務(wù)名稱loggerLevel: FULL # 設(shè)置日志級(jí)別
4.2 超時(shí)配置
- 配置類(lèi)
@Configuration
public class FeignConfig {/*** 設(shè)置feign請(qǐng)求超時(shí)時(shí)間* @return*/@Beanpublic Request.Options options(){return new Request.Options(5000, 5000);}
- 配置文件
feign:client:config:StockService: # 對(duì)應(yīng)的服務(wù)名稱loggerLevel: FULL # 設(shè)置日志級(jí)別connect-timeout: 5000 # 設(shè)置連接超時(shí)時(shí)間 默認(rèn)2000(2秒)read-timeout: 3000 # 設(shè)置讀取超時(shí)時(shí)間 默認(rèn)5秒
4.3 自定義攔截器
- 自定義攔截器實(shí)現(xiàn)認(rèn)證邏輯(只有請(qǐng)求攔截,沒(méi)有響應(yīng)攔截)
public class FeignInterceptor implements RequestInterceptor {Logger logger = LoggerFactory.getLogger(FeignInterceptor.class);@Overridepublic void apply(RequestTemplate requestTemplate) {requestTemplate.header("token","123456789");requestTemplate.query("id","111");logger.info("feign攔截器");}
}
- 在配置類(lèi)中進(jìn)行配置
@Configuration
public class FeignConfig {/*** 自定義攔截器* @return*/@Beanpublic FeignInterceptor feignInterceptor(){return new FeignInterceptor();}
- 在配置文件中進(jìn)行配置
feign:client:config:StockService: # 對(duì)應(yīng)的服務(wù)名稱requestInterceptors[0]: #攔截器配置com.example.order.interceptor.FeignInterceptor