Spring Cloud Feign的使用案例詳解
Feign簡介
Feign是Netflix開發(fā)的?個輕量級RESTful的HTTP服務客戶端(?它來發(fā)起請求,遠程調(diào)?的),是以Java接?注解的?式調(diào)?Http請求,?不?像Java中通過封裝HTTP請求報?的?式直接調(diào)?,F(xiàn)eign被?泛應?在Spring Cloud 的解決?案中。類似于Dubbo,服務消費者拿到服務提供者的接?,然后像調(diào)?本地接??法?樣去調(diào)?,實際發(fā)出的是遠程的請求。
Feign可幫助我們更加便捷,優(yōu)雅的調(diào)?HTTP API:不需要我們?nèi)テ唇觰rl然后調(diào)?restTemplate的api,在SpringCloud中,使?Feign?常簡單,創(chuàng)建?個接?(在消費者–服務調(diào)??這?端),并在接?上添加?些注解,代碼就完成了。
SpringCloud對Feign進?了增強,使Feign?持了SpringMVC注解(OpenFeign),本質(zhì):封裝了Http調(diào)?流程,更符合?向接?化的編程習慣,類似于Dubbo的服務調(diào)?,Dubbo的調(diào)??式其實就是很好的?向接?編程。
??它是聲明性(注解)web服務客戶端
要使用Feign,需創(chuàng)建一個接口并對其進行注解它是一個遠程調(diào)用的組件(接口,注解)http調(diào)用的??Feign集成了ribbon ribbon里集成了eureka
使用
與上篇文章ribbon的案例相似,也是客戶端互相訪問、互相幫助
實現(xiàn):兩個商家,一個中介,一個提供商,用戶訪問中介的接口,中介向提供商發(fā)送請求去制作
同樣是創(chuàng)建兩個client,之前創(chuàng)過就不走流程了
我這里創(chuàng)建了一個order-service-01
和一個user-service-02
order-service-01: 提供商
配置文件配置:
server: port: 8080 spring: application: name: order-service eureka: client: service-url: defaultZone: 你的遠程eureka地址
啟動類開啟客戶端
@EnableEurekaClient
編寫一個出訂單的controller
@RestController public class OrderControll { @GetMapping("doOrder") public String doOrder(){ return "正在制作面條"; } }
啟動即可
user-service-02: 中介
關鍵依賴:
<!-- 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: 你的遠程eureka地址
啟動類開啟服務
@EnableFeignClients:開啟feign
@EnableDiscoveryClient @EnableFeignClients
關鍵:創(chuàng)建接口類UserOrderfeign
需要調(diào)用提供商(order-service)的doOrder的接口即向下方代碼編寫即可
/** * 下方注解: * value就是提供者的應用名稱 */ @FeignClient(value="order-service") public interface UserOrderfeign { /** * 你需要調(diào)用哪個controller就寫它的方法簽名 * @return */ @GetMapping("doOrder") String doOrder(); }
編寫controller
實現(xiàn)類
直接引入編寫的userOrderfeign即可直接調(diào)用提供商的接口
@RestController public class UserControll { @Autowired public UserOrderfeign userOrderfeign; @GetMapping("userDoOrder") public String userDoOrder(){ System.out.println("來客人了..."); //發(fā)起遠程調(diào)用 String str=userOrderfeign.doOrder(); return str; } }
運行最終訪問localhost:8081/userDoOrder頁面就會顯示提供商返回的內(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傳遞一個參數(shù) @GetMapping("oneParam") public String oneParam(@RequestParam String name){ System.out.println(name); return "ok"; } //url傳遞多個參數(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傳參
編寫實體類order
這里用到了
lambok
實現(xiàn)自動添加有參無參set、get等方法
@Data @AllArgsConstructor @NoArgsConstructor @Builder public class Order { private Integer id; private String name; private Double price; private Date time; }
//Post請求傳遞一個對象 @PostMapping("oneObj") public String oneObj(@RequestBody Order order){ System.out.println(order); return "ok"; } //Post請求傳遞一個對象一個參數(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傳遞一個參數(shù) @GetMapping("oneParam") public String oneParam(@RequestParam String name); //url傳遞多個參數(shù) @GetMapping("twoParam") public String twoParam(@RequestParam(required = false) String name,@RequestParam(required = false)Integer age); //Post請求傳遞一個對象 @PostMapping("oneObj") public String oneObj(@RequestBody Order order); //Post請求傳遞一個對象一個參數(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"; }
以上即可實現(xiàn)傳參~
拓展
feign的默認等待時間是1s,超過1s就直接報錯超時
配置超時、連接時間
Tip:
feign只是封裝了遠程調(diào)用的功能 底層還是ribbon 所以需要修改ribbon的時間
#feign只是封裝了遠程調(diào)用的功能 底層還是ribbon 所以需要修改ribbon的時間 ribbon: ReadTimeout: 3000 #3s超時時間 ConnectTimeout: 3000 #連接服務的超時時間
日志打印
編寫日志功能有利于錯誤排查
日志級別
NONE
:默認的,不顯示任何日志;
BASIC
:僅記錄請求方法、URL、響應狀態(tài)碼及執(zhí)行時間;
HEACIERS
:除了BASIC中定義的信息之外,還有請求和響應的頭信息
FULL
:除了HEADERS中定義的信息之外,還有請求和響應的正文及元數(shù)據(jù)。
在啟動類application
中編寫
/** * 打印日志信息 */ @Bean public Logger.Level level(){ return Logger.Level.FULL; }
配置文件中yml
開啟日志客戶端
logging: level: com.pengke.userservice02.feign.UserOrderfeign: debug # 需要打印請求該接口的日志...
level下是feign接口的路徑
這樣即可實現(xiàn)用戶訪問該接口實現(xiàn)對應的日志打印相關信息
到此這篇關于Spring Cloud Feign的使用的文章就介紹到這了,更多相關Spring Cloud Feign的使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
SpringBoot項目沒有把依賴的jar包一起打包的問題解決
這篇文章主要介紹了SpringBoot項目沒有把依賴的jar包一起打包的問題解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-09-09Spring?WebMVC初始化Controller流程詳解
這篇文章主要介紹了Spring?WebMVC初始化Controller流程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02java注解結(jié)合aspectj AOP進行日志打印的操作
這篇文章主要介紹了java注解結(jié)合aspectj AOP進行日志打印的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02springboot 運行 jar 包讀取外部配置文件的問題
這篇文章主要介紹了springboot 運行 jar 包讀取外部配置文件,本文主要描述linux系統(tǒng)執(zhí)行jar包讀取jar包同級目錄的外部配置文件,主要分為兩種方法,每種方法通過實例代碼介紹的非常詳細,需要的朋友可以參考下2021-07-07SpringBoot實現(xiàn)設置全局和局部時間格式化
本文主要介紹了SpringBoot實現(xiàn)設置全局和局部時間格式化,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-01-01淺析java中String類型中“==”與“equal”的區(qū)別
這篇文章主要介紹了淺析java中String類型中“==”與“equal”的區(qū)別,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-08-08