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”
1
2
3
4
5
6
7
8
|
eureka: client: #是否將自己注冊到eureka服務注冊中心,默認為 true register-with-eureka: true #是否從服務注冊中心獲取可用的服務清單,默認為 true fetch-registry: true serviceurl: defaultzone: http: //192.168.114.152:9091/eureka/ |
然后就是再pom.xml里面加上最新出爐的feign包
1
2
3
4
5
6
|
<!-- 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拉取服務列表,供調用的。
1
2
3
4
5
6
7
8
|
@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啊不行的,其實不會的,我試過都可以了
1
2
3
4
5
6
7
8
9
10
|
@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里面可以進行配置
1
2
3
|
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,沒什么不同,畢竟是被別人調用,這種調用方式很安逸。
1
2
3
4
5
6
7
8
9
|
/** * 獲取基本信息 */ @putmapping ( "/info/{checknum}" ) public apireturnobject updatecheckregisterbybodycheck( @pathvariable string checknum,string bodyjson) { //這里可以打印一些日志 outsystemservice.updatecheckregisterbybodycheck(checknum, bodyjson); return apireturnutil.success( "調用成功" ); } |
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:https://blog.csdn.net/moshowgame/article/details/80616624