這篇文章主要介紹了詳解Spring-Cloud2.0之Feign調用遠程服務指南,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
Feign是什麼
Feign是簡化Java HTTP客戶端開發的工具(java-to-httpclient-binder),它的靈感來自於Retrofit、JAXRS-2.0和WebSocket。Feign的初衷是降低統一綁定Denominator到HTTP API的複雜度,不區分是否爲restful。
爲什麼使用Feign
開發人員使用Jersey和CXF等工具可以方便地編寫java client,從而提供REST或SOAP服務;開發人員也可以基於Apache HC等http傳輸工具包編寫自己的java http client;而Feign的關注點在於簡化開發人員使用工具包的複雜度,以最少的代碼編寫代碼從而提供java http客服端。通過定製解碼器和異常處理,開發人員可以任意編寫文本化的HTTP API。
好了,上面是官方的,假如要我說Feign是什麼。
一句話解釋Feign
可以理解爲Feign是一個超級方便的調用Spring-Cloud遠程服務的框架/工具,幫助開發者以更少耦合更少代碼更快更兼容的方法進行遠程服務調用。
配置文件
調用的時候,雙方的application.yml一定要加上兩個配置,因爲雙方服務器是需要相互發現並獲取服務列表的。
不然會報錯提示“feign Load balancer does not have available server for client: xxxx”
eureka: client: #是否將自己註冊到eureka服務註冊中心,默認爲true register-with-eureka: true #是否從服務註冊中心獲取可用的服務清單,默認爲true fetch-registry: true serviceUrl: defaultZone: http://192.168.114.152:9091/eureka/
然後就是再pom.xml裏面加上最新出爐的feign包
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-feign --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId> <version>1.4.4.RELEASE</version> </dependency>
服務調用者
啓動器一定要加@EnableFeignClients,代表進行Feign調用,Feign會到Eureka拉取服務列表,供調用的。
@EnableEurekaClient @SpringBootApplication @EnableFeignClients public class CheckCollectSysApplication { public static void main(String[] args) { SpringApplication.run(CheckCollectSysApplication.class,args); } }
調用方業務方面。推薦是寫一個interface類,把方法封裝起來供其他Controller調用。
這裏要注意
1. @FeignClient裏面一定要指定是name,很久以前的版本指定的是serviceId,那個已經過時了。
2. 如果用到佔位符,@PathVariable也需要指定value,這是一個強制要求,不然會報錯,提示“Feign PathVariable annotation was empty on param 0.”
3. RequestParam也需要指定value,不然會提示”RequestParam.value() was empty on parameter 1”
另外,別人說什麼GetMapping啊PutMapping啊不行的,其實不會的,我試過都可以了
@FeignClient(name = "demo-checksys") public interface ChecysysRemoteClient { /** * 獲取基本信息 *(PutMapping的URL=遠程項目的Path+ControllerPath+MethodPath * 簡單的說,就是你直接postman可以訪問的項目路徑) */ @PutMapping("/checksys/register/info/{checkNum}") public ApiReturnObject updateCheckRegisterByBodyCheck(@PathVariable(value="checkNum") String checkNum,@RequestParam(value="bodyJson") String bodyJson); }
這裏的FeignClient的name是指註冊到Eureka的被調用者的ApplicationName,就是你應用的名字啦,application.yml裏面可以進行配置
spring: application: name: demo-checksys
PutMapping的URL=遠程項目的Path+ControllerPath+MethodPath,簡單的說,就是你直接postman可以訪問的項目路徑。
例如項目是http://127.0.0.1:8080/demo/user/getUser/{userId},
那麼這裏寫的就是”/demo/user/getUser/{userId}”
被調用者
至於被調用者,一如既往的code,沒什麼不同,畢竟是被別人調用,這種調用方式很安逸。
/** * 獲取基本信息 */ @PutMapping("/info/{checkNum}") public ApiReturnObject updateCheckRegisterByBodyCheck(@PathVariable String checkNum,String bodyJson) { //這裏可以打印一些日誌 outSystemService.updateCheckRegisterByBodyCheck(checkNum, bodyJson); return ApiReturnUtil.success("調用成功"); }
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持神馬文庫。