SpringCloud?OpenFeign概述與使用教程
Feign
它是聲明性(注解)web服務(wù)客戶端
- 要使用Feign,需創(chuàng)建一個(gè)接口并對(duì)其進(jìn)行注解
- 它是一個(gè)遠(yuǎn)程調(diào)用的組件(接口,注解)http調(diào)用的
Feign集成了ribbon ribbon里集成了eureka
使用
與上篇文章ribbon的案例相似,也是客戶端互相訪問(wèn)、互相幫助
實(shí)現(xiàn):兩個(gè)商家,一個(gè)中介,一個(gè)提供商,用戶訪問(wèn)中介的接口,中介向提供商發(fā)送請(qǐng)求去制作
同樣是創(chuàng)建兩個(gè)client,之前創(chuàng)過(guò)就不走流程了
我這里創(chuàng)建了一個(gè)order-service-01
和一個(gè)user-service-02
order-service-01: 提供商
配置文件配置:
server:
port: 8080
spring:
application:
name: order-service
eureka:
client:
service-url:
defaultZone: 你的遠(yuǎn)程eureka地址
啟動(dòng)類開(kāi)啟客戶端
@EnableEurekaClient
編寫一個(gè)出訂單的controller
@RestController public class OrderControll { @GetMapping("doOrder") public String doOrder(){ return "正在制作面條"; } }
啟動(dòng)即可
user-service-02: 中介
關(guān)鍵依賴:
<!-- feign依賴--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
配置文件application.yml
:
server:
port: 8081
spring:
application:
name: user-service
eureka:
client:
service-url:
defaultZone: 你的遠(yuǎn)程eureka地址
啟動(dòng)類開(kāi)啟服務(wù)
@EnableFeignClients:開(kāi)啟feign
@EnableDiscoveryClient @EnableFeignClients
關(guān)鍵:創(chuàng)建接口類UserOrderfeign
需要調(diào)用提供商(order-service)的doOrder的接口即向下方代碼編寫即可
/** * 下方注解: * value就是提供者的應(yīng)用名稱 */ @FeignClient(value="order-service") public interface UserOrderfeign { /** * 你需要調(diào)用哪個(gè)controller就寫它的方法簽名 * @return */ @GetMapping("doOrder") String doOrder(); }
編寫controller
實(shí)現(xiàn)類
直接引入編寫的userOrderfeign即可直接調(diào)用提供商的接口
@RestController public class UserControll { @Autowired public UserOrderfeign userOrderfeign; @GetMapping("userDoOrder") public String userDoOrder(){ System.out.println("來(lái)客人了..."); //發(fā)起遠(yuǎn)程調(diào)用 String str=userOrderfeign.doOrder(); return str; } }
運(yùn)行最終訪問(wèn)localhost:8081/userDoOrder頁(yè)面就會(huì)顯示提供商返回的內(nèi)容了~
傳參
需確保參數(shù)列表一致,返回值一致,方法簽名一致
- URL傳參:參數(shù)列表使用
@PathVariable
- GET傳參:參數(shù)列表使用
@RequestParam
- POST傳參:參數(shù)列表使用
@RequestParam
或者Requestbody
基于上方案例繼續(xù)使用
order-service
控制器編寫方法
URL拼接傳參
//url拼接傳參 @GetMapping("testUrl/{name}/and/{age}") public String testUrl(@PathVariable("name")String name,@PathVariable("age")Integer age){ System.out.println(name+":"+age); return "ok"; }
GET傳參
//url傳遞一個(gè)參數(shù) @GetMapping("oneParam") public String oneParam(@RequestParam String name){ System.out.println(name); return "ok"; } //url傳遞多個(gè)參數(shù) @GetMapping("twoParam") public String twoParam(@RequestParam(required = false) String name,@RequestParam(required = false)Integer age){ System.out.println(name); System.out.println(age); return "ok"; }
POST傳參
編寫實(shí)體類order
這里用到了lambok
實(shí)現(xiàn)自動(dòng)添加有參無(wú)參set、get等方法
@Data @AllArgsConstructor @NoArgsConstructor @Builder public class Order { private Integer id; private String name; private Double price; private Date time; }
//Post請(qǐng)求傳遞一個(gè)對(duì)象 @PostMapping("oneObj") public String oneObj(@RequestBody Order order){ System.out.println(order); return "ok"; } //Post請(qǐng)求傳遞一個(gè)對(duì)象一個(gè)參數(shù) @PostMapping("oneObjOneParam") public String oneObjOneParam(@RequestBody Order order,@RequestParam("name")String name){ System.out.println(order); System.out.println(name); return "ok"; }
調(diào)用
user-service
的feign接口中編寫控制類的傳參方法
/url拼接傳參 @GetMapping("testUrl/{name}/and/{age}") public String testUrl(@PathVariable("name")String name, @PathVariable("age")Integer age); //url傳遞一個(gè)參數(shù) @GetMapping("oneParam") public String oneParam(@RequestParam String name); //url傳遞多個(gè)參數(shù) @GetMapping("twoParam") public String twoParam(@RequestParam(required = false) String name,@RequestParam(required = false)Integer age); //Post請(qǐng)求傳遞一個(gè)對(duì)象 @PostMapping("oneObj") public String oneObj(@RequestBody Order order); //Post請(qǐng)求傳遞一個(gè)對(duì)象一個(gè)參數(shù) @PostMapping("oneObjOneParam") public String oneObjOneParam(@RequestBody Order order,@RequestParam("name")String name);
user-service
控制器中編寫方法調(diào)用
@GetMapping("testParam") public String testParam(){ String zt = userOrderFeign.testUrl("zt", 21); System.out.println(zt); String xzl = userOrderFeign.oneParam("xzl"); System.out.println(xzl); String wf = userOrderFeign.twoParam("wf", 22); System.out.println(wf); Order order= Order.builder() .name("牛排") .price(188D) .time(new Date()) .id(1) .build(); String s = userOrderFeign.oneObj(order); System.out.println(s); String param = userOrderFeign.oneObjOneParam(order, "dqf"); System.out.println(param); return "ok"; }
以上即可實(shí)現(xiàn)傳參~
拓展
feign的默認(rèn)等待時(shí)間是1s,超過(guò)1s就直接報(bào)錯(cuò)超時(shí)
配置超時(shí)、連接時(shí)間
Tip:
feign只是封裝了遠(yuǎn)程調(diào)用的功能 底層還是ribbon 所以需要修改ribbon的時(shí)間
#feign只是封裝了遠(yuǎn)程調(diào)用的功能 底層還是ribbon 所以需要修改ribbon的時(shí)間
ribbon:
ReadTimeout: 3000 #3s超時(shí)時(shí)間
ConnectTimeout: 3000 #連接服務(wù)的超時(shí)時(shí)間
日志打印
編寫日志功能有利于錯(cuò)誤排查
日志級(jí)別
NONE
:默認(rèn)的,不顯示任何日志;
BASIC
:僅記錄請(qǐng)求方法、URL、響應(yīng)狀態(tài)碼及執(zhí)行時(shí)間;
HEACIERS
:除了BASIC中定義的信息之外,還有請(qǐng)求和響應(yīng)的頭信息
FULL
:除了HEADERS中定義的信息之外,還有請(qǐng)求和響應(yīng)的正文及元數(shù)據(jù)。
在啟動(dòng)類application
中編寫
/** * 打印日志信息 */ @Bean public Logger.Level level(){ return Logger.Level.FULL; }
配置文件中yml
開(kāi)啟日志客戶端
logging:
level:
com.pengke.userservice02.feign.UserOrderfeign: debug # 需要打印請(qǐng)求該接口的日志...
level下是feign接口的路徑
這樣即可實(shí)現(xiàn)用戶訪問(wèn)該接口實(shí)現(xiàn)對(duì)應(yīng)的日志打印相關(guān)信息
到此這篇關(guān)于SpringCloud OpenFeign概述與使用的文章就介紹到這了,更多相關(guān)SpringCloud Feign內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java判斷字符串是否是整數(shù)或者浮點(diǎn)數(shù)的方法
今天小編就為大家分享一篇Java判斷字符串是否是整數(shù)或者浮點(diǎn)數(shù)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07java實(shí)現(xiàn)微信公眾平臺(tái)自定義菜單的創(chuàng)建示例
這篇文章主要介紹了java實(shí)現(xiàn)微信公眾平臺(tái)自定義菜單的創(chuàng)建示例,需要的朋友可以參考下2014-04-04如何在SpringBoot中使用Spring-AOP實(shí)現(xiàn)接口鑒權(quán)
這篇文章主要介紹了如何在SpringBoot中使用Spring-AOP實(shí)現(xiàn)接口鑒權(quán),文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下2022-09-09使用mybatis-plus報(bào)錯(cuò)Invalid bound statement (not found)錯(cuò)誤
這篇文章主要介紹了使用mybatis-plus報(bào)錯(cuò)Invalid bound statement (not found)錯(cuò)誤,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09關(guān)于try 和 throw 簡(jiǎn)單使用示例
每過(guò)一段時(shí)間,就總是會(huì)對(duì)try有點(diǎn)生疏,特別寫了個(gè)程序來(lái)測(cè)試以下,有時(shí)候 throw是底層拋出來(lái)的,你不處理,默認(rèn)就throw了2013-08-08