摘要:多參請求使用使用使用構(gòu)建,不推薦注意這種方式不建議使用。主要是因為可讀性不好,而且如果參數(shù)為空的時候會有一些問題,例如會導致服務接收到的是,而不是。
# 客戶端遠程調(diào)用
Feign 什么是Feign?Feign是 Netflix 公司開源的聲明式HTTP客戶端
Github : Feign 源碼
為什么需要Feign?原代碼可讀性不高
復雜的URL難以維護(https://user-center/s?wd={userId}&rsv_spt=1&rsv_iqid=0x93bff3cd000cf3da&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=1&rsv_sug3=4&rsv_sug1=4&rsv_sug7=100&rsv_t=10c2risCimsUZC0RBruMerdnQRN1gRxFI%2BywuD0L3LwGGNd2dR8XE6x%2FyFOjHnR0oEi0&rsv_sug2=0&inputT=1535&rsv_sug4=1535&rsv_sug=2)
難以應對需求的快速變化
編碼體驗和我們寫JAVA差異較大
舉例重構(gòu)代碼//替換前 ResponseEntityuserEntity = restTemplate.getForEntity( "http://user-center/users/{userId}", UserDTO.class, userId ); UserDTO userDTO = new UserDTO(); if (null != userEntity) { userDTO = userEntity.getBody(); log.info("ShareService#findById userDTO: {}", userDTO); }
添加依賴
org.springframework.cloud spring-cloud-starter-openfeign
啟動類添加注解 @EnableFeignClients
添加配置
實現(xiàn)對應微服務的client
/** * IUserCenterFeignClient for 定義 user-center feign client * * @author Isaac.Zhang | 若初 * @since 2019/7/15 */ @FeignClient(name = "user-center") public interface IUserCenterFeignClient { /** * Feign client 會將請求轉(zhuǎn)換為 * http://user-center/users/{userId} * * @param userId 用戶id * @return 返回用戶對象 */ @GetMapping(path = "/users/{userId}") public UserDTO findById(@PathVariable Long userId); }
替換后代碼
//使用 FeignClient 來替換掉RestTemplate調(diào)用 UserDTO userDTO = this.userCenterFeignClient.findById(userId);Feign的組成 Feign的配置方式 Java Code
級別內(nèi)容
Tip : 有可能出現(xiàn)父子上下文重疊問題
在client添加配置
/** * IUserCenterFeignClient for 定義 user-center feign client * * @author Isaac.Zhang | 若初 * @since 2019/7/15 */ @FeignClient(name = "user-center",configuration = UserCenterFeignConfiguration.class) public interface IUserCenterFeignClient { ... }
編寫java配置文件
/** * UserCenterFeignConfiguration for 自定義user-center服務請求中,feign的配置信息 * {@link @Configuration} 不能添加該注解,否則會和ribbon一樣,出現(xiàn)上下文重疊問題,造成配置全局共享 * 如要添加該注解,需要將該類放在主程序啟動掃描不到的包下 * * @author Isaac.Zhang | 若初 * @since 2019/7/15 */ public class UserCenterFeignConfiguration { @Bean public Logger.Level level() { // 配置feign 日志級別,記錄請求和響應的header、body以及元數(shù)據(jù) return Logger.Level.FULL; } }
一定要在配置文件中添加該client 全路徑
logging: level: #com.sxzhongf: debug com.sxzhongf.sharedcenter.feignclients.IUserCenterFeignClient: debug
打印信息
2019-07-15 15:06:11.650 DEBUG 20286 --- [nio-8010-exec-1] c.s.s.f.IUserCenterFeignClient : [IUserCenterFeignClient#findById] <--- HTTP/1.1 200 (402ms) 2019-07-15 15:06:11.651 DEBUG 20286 --- [nio-8010-exec-1] c.s.s.f.IUserCenterFeignClient : [IUserCenterFeignClient#findById] content-type: application/json;charset=UTF-8 2019-07-15 15:06:11.651 DEBUG 20286 --- [nio-8010-exec-1] c.s.s.f.IUserCenterFeignClient : [IUserCenterFeignClient#findById] date: Mon, 15 Jul 2019 07:06:11 GMT 2019-07-15 15:06:11.651 DEBUG 20286 --- [nio-8010-exec-1] c.s.s.f.IUserCenterFeignClient : [IUserCenterFeignClient#findById] transfer-encoding: chunked 2019-07-15 15:06:11.652 DEBUG 20286 --- [nio-8010-exec-1] c.s.s.f.IUserCenterFeignClient : [IUserCenterFeignClient#findById] 2019-07-15 15:06:11.652 DEBUG 20286 --- [nio-8010-exec-1] c.s.s.f.IUserCenterFeignClient : [IUserCenterFeignClient#findById] {"id":1,"wxId":"","wxNickname":"IsaacZhang","roles":"","avatarUrl":"aaa","createTime":"2019-07-11T06:08:18.000+0000","updateTime":"2019-07-11T06:08:18.000+0000","bonus":100} 2019-07-15 15:06:11.652 DEBUG 20286 --- [nio-8010-exec-1] c.s.s.f.IUserCenterFeignClient : [IUserCenterFeignClient#findById] <--- END HTTP (173-byte body)Configuration
使用配置文件來定義log level
#logging: #level: #com.sxzhongf: debug #com.sxzhongf.sharedcenter.feignclients.IUserCenterFeignClient: debug feign: client: config: user-center: #單服務配置 loggerLevel: full --- feign: client: config: default: #全局配置日志級別 loggerLevel: fullFeign的繼承性
官方不建議使用
大多數(shù)公司使用?
架構(gòu)師需要根據(jù)自身業(yè)務情況來決定,是否需要將不同的微服務進行業(yè)務耦合,還是使用冗余代碼的方式來解放業(yè)務耦合性。Feign多參請求 Get
使用@SpringQueryMap
@FeignClient(name = "user-center") public interface ITestUserCenterFeignClient { @GetMapping("/users/q") public UserDTO query(@SpringQueryMap UserDTO userDTO); }
使用 @RequestParam
@FeignClient(name = "user-center") public interface ITestUserCenterFeignClient { @RequestMapping(value = "/users/q",method = RequestMethod.GET) public UserDTO query(@RequestParam("id") Long id,@RequestParam("name") String name); }
使用Map構(gòu)建,(不推薦)
@FeignClient(name = "user-center") public interface ITestUserCenterFeignClient { @RequestMapping(value = "/users/q",method = RequestMethod.GET) public UserDTO query(@RequestParam Mapconditions); }
注意:這種方式不建議使用。主要是因為可讀性不好,而且如果參數(shù)為空的時候會有一些問題,例如map.put("username", null); 會導致user-center 服務接收到的username是"" ,而不是null。Post
服務提供者方法
@PostMapping("/create") public User createUser(@RequestBody User user){ return null; }
服務調(diào)用者
@FeignClient(name = "user-center") public interface ITestUserCenterFeignClient { @RequestMapping(value = "/users/q",method = RequestMethod.POST) public UserDTO query(@RequestBody UserDTO user); }Feign脫離服務注冊/Ribbon調(diào)用
@FeignClient(name = "xxxxx",url = "http://www.baidu.com") public interface ITestBaiduFeignClient { @GetMapping("") public String getBaidu(); }Feign 性能優(yōu)化 使用連接池 httpClient
加依賴
io.github.openfeign feign-httpclient
加注解(不需要)
改配置
httpclient: # 為feign啟用 apache httpclient 做請求,而不使用默認的urlconection enabled: true # feign 最大連接數(shù) max-connections: 200 # feign 單個路徑請求的最大連接數(shù) max-connections-per-route: 50okHttp
加依賴
io.github.openfeign feign-okhttp
加注解(不需要)
改配置
httpclient: # 為feign啟用 apache httpclient 做請求,而不使用默認的urlconection #enabled: true # feign 最大連接數(shù) max-connections: 200 # feign 單個路徑請求的最大連接數(shù) max-connections-per-route: 50 okhttp: enabled: true合理使用Feign日志
生產(chǎn)環(huán)境使用Logger.Level.BASICRestTemplate RestTemplate VS. Feign
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/75465.html
摘要:添加電影微服務啟動類電影微服務接入進行客戶端負載均衡,通過調(diào)用遠程微服務。注解表示該電影微服務已經(jīng)接入模塊。 SpringCloud(第 012 篇)電影微服務接入 Feign 進行客戶端負載均衡,通過 FeignClient 調(diào)用遠程 Http 微服務 - 一、大致介紹 1、本章節(jié)主要介紹在 SpringCloud 生態(tài)圈中,使用一個類似于 Java HTTP 客戶端的工具 Feig...
摘要:實踐案例包括兩個項目,服務提供者項目名,調(diào)用服務項目名,主要給出兩個服務之間的調(diào)用過程,文件上傳功能不提供項目框架依賴一文件上傳服務控制層文件上傳控制文件上傳文件上傳開始文件上傳結(jié)束,耗時文件上傳失敗業(yè)務層上傳文件判 實踐案例包括兩個項目,服務提供者項目名:upload-service,調(diào)用服務項目名:upload-client,主要給出兩個服務之間的調(diào)用過程,文件上傳功能不提供 項目...
摘要:在艙壁模式中可以隔離每個遠程資源,并分配各自的線程池,使之互不影響。 springcloud 總集:https://www.tapme.top/blog/detail/2019-02-28-11-33 本次用到全部代碼見文章最下方。 一、為什么要有客戶端彈性模式 ??所有的系統(tǒng)都會遇到故障,分布式系統(tǒng)單點故障概率更高。如何構(gòu)建應用程序來應對故障,是每個軟件開發(fā)人員工作的關(guān)鍵部分。但是通...
摘要:公眾號樂園的中提供了兩個組件實現(xiàn)軟負載均衡調(diào)用,分別是和。是基于和的客戶端負載工具,它是基于實現(xiàn)的,它可以在客戶端配置服務端列表,然后輪詢請求以實現(xiàn)均衡負載。 公眾號:java樂園 spring cloud的Netflix中提供了兩個組件實現(xiàn)軟負載均衡調(diào)用,分別是Ribbon和Feign。上一篇和大家一起學習了Ribbon。Ribbon :Spring Cloud Ribbon是基于H...
摘要:此為的結(jié)構(gòu)圖上篇已注冊了,的服務,接下來用,實現(xiàn)負載均衡和的簡單客戶端,讓消費者調(diào)用服務。是發(fā)布的云中間層服務開源項目,其主要功能是提供客戶側(cè)軟件負載均衡算法,將的中間層服務連接在一起。對選定的負載均衡策略機上重試機制。 ??????????上篇已經(jīng)搭建好基礎demo,接下來繼續(xù)構(gòu)建項目并對spring cloud組件介紹描述。 showImg(https://segmentfault...
閱讀 3467·2023-04-26 00:39
閱讀 4076·2021-09-22 10:02
閱讀 2557·2021-08-09 13:46
閱讀 1108·2019-08-29 18:40
閱讀 1455·2019-08-29 18:33
閱讀 782·2019-08-29 17:14
閱讀 1523·2019-08-29 12:40
閱讀 2984·2019-08-28 18:07