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