服務遠程調用-Open Feign-微服務核心組件【分散式微服務筆記04】 服務遠程調用-Open Feign Open Feign最大的價值就是,在不同的微服務中可以相互調用對方的介面 基本介紹 OpenFeign 是個聲明式WebService 客戶端,使用OpenFeign 讓編寫Web Se ...
服務遠程調用-Open Feign-微服務核心組件【分散式微服務筆記04】
服務遠程調用-Open Feign
- Open Feign最大的價值就是,在不同的微服務中可以相互調用對方的介面
基本介紹
- OpenFeign 是個聲明式WebService 客戶端,使用OpenFeign 讓編寫Web Service 客戶端更簡單
- 使用方法: 定義一個服務介面然後在上面添加註解
- OpenFeign 也支持可拔插式的編碼器和解碼器。
- Spring Cloud 對OpenFeign 進行了封裝使其支持了Spring MVC 標準註解和HttpMessageConverters【消息轉換器】
- OpenFeign 可以與Eureka 和Ribbon 組合使用以支持負載均衡
Feign和Open Feign的區別
- OpenFeign 就是在Feign 基礎上做了加強, 有些程式員為了方便,說Feign就是指的OpenFeign
Feign
- Feign是Spring Cloud組件中的一個輕量級RESTful的HTTP服務客戶端
- Feign內置了Ribbon,用來做客戶端負載均衡,去調用服務註冊中心的服務。
- Feign的使用方式是:使用Feign的註解定義介面,調用服務註冊中心的服務
- Feign本身不支持Spring MVC的註解,它有一套自己的註解
OpenFeign
- OpenFeign是Spring Cloud 在Feign的基礎上支持了Spring MVC的註解,如@RequesMapping等等。
- OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping註解下的介面
- OpenFeign通過動態代理的方式產生實現類,實現類中做負載均衡並調用其他服務
OpenFeign代碼實現
1.添加依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2.開發OpenFeign介面
@Component
@FeignClient(value = "MEMBER-SERVICE-PROVIDER") //指定調用的服務是哪個【可以是集群】
public interface MemberFeignService {
//定義方法【就是遠程調用的介面】
/*
解析:
1.遠程調用的方式 : get
2.遠程調用的url :http://MEMBER-SERVICE-PROVIDER/member/get/{id}
3.MEMBER-SERVICE-PROVIDER就是服務提供方在eureka-server註冊的服務【遠程對接時MEMBER-SERVICE-PROVIDER會由eureka來獲取 】
4.openfeign 會根據負載均衡來決定調用集群中的哪個【預設時輪詢】
*/
@GetMapping("/member/get/{id}") //這裡就是提供方的介面
Result getMemberById(@PathVariable("id") Long id);
}
- MEMBER-SERVICE-PROVIDER 就是服務提供方在eureka-server 註冊的服務,@FeignClient(value = "MEMBER-SERVICE-PROVIDER") 用於指定調用的服務是哪個【可以是集群】
3.編寫主啟動類
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients//啟動 OpenFeignClient
public class MemberConsumerOpenfeignApplication {
public static void main(String[] args) {
SpringApplication.run(MemberConsumerOpenfeignApplication.class, args);
}
}
4.編寫Controller
@RestController
@RequestMapping("/member/consumer/openfeign")
public class MemberConsummerFeignController {
@Autowired
private MemberFeignService memberFeignService;
@GetMapping("/get/{id}")
public Result getMemberById(@PathVariable("id") Long id){
return memberFeignService.getMemberById(id);
}
}
5.訪問介面 http://localhost/member/consumer/openfeign/get/1 遠程調用成功
OpenFeign日誌配置
Feign 提供了日誌列印功能,可以通過配置來調整日誌級別,從而對Feign 介面的調用情況進行監控和輸出
日誌級別 | 描述 |
---|---|
NONE | 預設的,不顯示任何日誌 |
BASIC | 僅記錄請求方法、URL、響應狀態碼及執行時間 |
HEADERS | 除了BASIC中定義的信息之外,還有請求和響應的頭信息 |
FULL | 除了HEADERS中定義的信息之外,還有請求和響應的正文及元數據 |
常見的日誌輸出級別有5 種,分別是error、warn、info、debug、trace
日誌輸出級別 | 描述 |
---|---|
error | 錯誤日誌,指比較嚴重的錯誤,對正常業務有影響,需要運維配置監控的 |
warn | 警告日誌,一般的錯誤,對業務影響不大,但是需要開發關註 |
info | 信息日誌,記錄排查問題的關鍵信息,如調用時間、出參入參等等 |
debug | 用於開發DEBUG 的,關鍵邏輯裡面的運行時數據 |
trace | 最詳細的信息,一般這些信息只記錄到日誌文件中 |
OpenFeign日誌配置示例:
-
編寫配置類
@Configuration public class OpenFeignConfig { @Bean public Logger.Level loggerLevel(){ return Logger.Level.FULL; } }
-
編寫application.yml
server: port: 80 spring: application: name: e-commerce-consumer-openfeign-80 #配置應用的名稱 #配置eureka-client [略]...... # OpenFeign日誌配置 logging: level: #這裡com.zy88.springcloud.service.MemberFeignService 表示對應的介面;debug 表示日誌級別 com.zy88.springcloud.service.MemberFeignService: debug
-
訪問介面 http://localhost/member/consumer/openfeign/get/1 OpenFeign日誌配置 成功
OpenFeign調用超時
- OpenFeign 預設超時時間1 秒鐘,即等待返回結果1 秒
修改預設超時時間
在application.yml修改即可
server:
port: 80
spring:
application:
name: e-commerce-consumer-openfeign-80 #配置應用的名稱
#配置eureka-client【略】......
# 修改預設超時時間
ribbon:
#設置feign 客戶端超時時間(openFeign 預設支持ribbon)
# ReadTimeout: 8000 表示 指的是建立連接後從伺服器讀取到可用資源所用的時間【時間單位是毫秒】
ReadTimeout: 8000
#指的是建立連接所用的時間,適用於網路狀況正常的情況下,
#兩端連接所用的時間
ConnectTimeout: 8000