SpringCloud?OpenFeign概述與使用教程
Feign
它是聲明性(注解)web服務客戶端
- 要使用Feign,需創(chuàng)建一個接口并對其進行注解
- 它是一個遠程調用的組件(接口,注解)http調用的
Feign集成了ribbon ribbon里集成了eureka
使用
與上篇文章ribbon的案例相似,也是客戶端互相訪問、互相幫助
實現:兩個商家,一個中介,一個提供商,用戶訪問中介的接口,中介向提供商發(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
需要調用提供商(order-service)的doOrder的接口即向下方代碼編寫即可
/**
* 下方注解:
* value就是提供者的應用名稱
*/
@FeignClient(value="order-service")
public interface UserOrderfeign {
/**
* 你需要調用哪個controller就寫它的方法簽名
* @return
*/
@GetMapping("doOrder")
String doOrder();
}
編寫controller實現類
直接引入編寫的userOrderfeign即可直接調用提供商的接口
@RestController
public class UserControll {
@Autowired
public UserOrderfeign userOrderfeign;
@GetMapping("userDoOrder")
public String userDoOrder(){
System.out.println("來客人了...");
//發(fā)起遠程調用
String str=userOrderfeign.doOrder();
return str;
}
}
運行最終訪問localhost:8081/userDoOrder頁面就會顯示提供商返回的內容了~
傳參
需確保參數列表一致,返回值一致,方法簽名一致
- URL傳參:參數列表使用
@PathVariable - GET傳參:參數列表使用
@RequestParam - POST傳參:參數列表使用
@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傳遞一個參數
@GetMapping("oneParam")
public String oneParam(@RequestParam String name){
System.out.println(name);
return "ok";
}
//url傳遞多個參數
@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實現自動添加有參無參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請求傳遞一個對象一個參數
@PostMapping("oneObjOneParam")
public String oneObjOneParam(@RequestBody Order order,@RequestParam("name")String name){
System.out.println(order);
System.out.println(name);
return "ok";
}
調用
user-service的feign接口中編寫控制類的傳參方法
/url拼接傳參
@GetMapping("testUrl/{name}/and/{age}")
public String testUrl(@PathVariable("name")String name, @PathVariable("age")Integer age);
//url傳遞一個參數
@GetMapping("oneParam")
public String oneParam(@RequestParam String name);
//url傳遞多個參數
@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請求傳遞一個對象一個參數
@PostMapping("oneObjOneParam")
public String oneObjOneParam(@RequestBody Order order,@RequestParam("name")String name);
user-service控制器中編寫方法調用
@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";
}
以上即可實現傳參~
拓展
feign的默認等待時間是1s,超過1s就直接報錯超時
配置超時、連接時間
Tip:feign只是封裝了遠程調用的功能 底層還是ribbon 所以需要修改ribbon的時間
#feign只是封裝了遠程調用的功能 底層還是ribbon 所以需要修改ribbon的時間
ribbon:
ReadTimeout: 3000 #3s超時時間
ConnectTimeout: 3000 #連接服務的超時時間
日志打印
編寫日志功能有利于錯誤排查
日志級別
NONE:默認的,不顯示任何日志;
BASIC:僅記錄請求方法、URL、響應狀態(tài)碼及執(zhí)行時間;
HEACIERS:除了BASIC中定義的信息之外,還有請求和響應的頭信息
FULL:除了HEADERS中定義的信息之外,還有請求和響應的正文及元數據。
在啟動類application中編寫
/**
* 打印日志信息
*/
@Bean
public Logger.Level level(){
return Logger.Level.FULL;
}
配置文件中yml開啟日志客戶端
logging:
level:
com.pengke.userservice02.feign.UserOrderfeign: debug # 需要打印請求該接口的日志...
level下是feign接口的路徑
這樣即可實現用戶訪問該接口實現對應的日志打印相關信息
到此這篇關于SpringCloud OpenFeign概述與使用的文章就介紹到這了,更多相關SpringCloud Feign內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
java實現微信公眾平臺自定義菜單的創(chuàng)建示例
這篇文章主要介紹了java實現微信公眾平臺自定義菜單的創(chuàng)建示例,需要的朋友可以參考下2014-04-04
如何在SpringBoot中使用Spring-AOP實現接口鑒權
這篇文章主要介紹了如何在SpringBoot中使用Spring-AOP實現接口鑒權,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,感興趣的小伙伴可以參考一下2022-09-09
使用mybatis-plus報錯Invalid bound statement (not found)錯誤
這篇文章主要介紹了使用mybatis-plus報錯Invalid bound statement (not found)錯誤,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-09-09

