SpringCloud簡介
Spring Cloud是Spring旗下的專案之一
Spring Cloud并不是一個組件 而是許多組件的集合
其將當下非常流行的一些技術整合到了一起 實作了多個分布式開發中的重要功能
協調了分布式環境中各個系統 并且為各類服務提供模板性的配置
其主要涉及的組件包括:
- Eureka:注冊中心
- Zuul或Spring Cloud Gateway:服務網關
- Ribbon:負載均衡
- Feign:服務呼叫
- Hystrix或Resilience4j:熔斷器
【在本篇中 將介紹Feign服務呼叫】
Feign服務呼叫
Feign意即偽裝
Feign可以將Rest的請求進行隱藏 然后偽裝成類似于SpringMVC的Controller一樣的形式
無需自己進行指定服務名稱 拼接url 拼接引數等繁瑣操作 一切都可以交給Feign去做
一、使用步驟
注:在服務消費端進行操作 因為是服務消費端需要使用Feign進行便捷的服務呼叫
1、添加Feign的Maven依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2、在啟動類上添加/@EnableFeignClients注解以開啟Feign服務呼叫功能
@SpringCloudApplication
// 開啟Feign服務呼叫功能
@EnableFeignClients
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class,args);;
}
}
3、撰寫Feign客戶端
在介面上添加@FeignClient注解 用于宣告當前類為Feign客戶端 然后并且指定服務名稱即可
需要注意的是 Feign客戶端其實是一個介面
// @FeignClient注解宣告了當前類為Feign客戶端 并且指定服務名稱 這樣即可自動拼接了
@FeignClient("user-service")
public interface UserClient {
// 自動拼接成http://user-service/user/{id}
@GetMapping("/user/{id}")
User queryById(@PathVariable Long id);
}
4、撰寫控制器
在控制器中引入寫好的Feign客戶端 然后直接呼叫Feign客戶端中的方法即可
@RestController
@RequestMapping("/consumerfeign")
public class ConsumerFeignController {
// 引入寫好的Feign客戶端
@Autowired
private UserClient userClient;
@GetMapping("/{id}")
public User queryById(@PathVariable Long id)
{
// 直接呼叫Feign客戶端中的方法即可
return userClient.queryById(id);
}
}
二、Feign的負載均衡和熔斷器
Feign已經內置了Ribbon負載均衡和Hystrix熔斷器
其實包括負載均衡 服務熔斷 請求壓縮 日志級別 這些功能都可通過配置項在Feign中開啟以使用
1、Ribbon負載均衡配置:
ribbon:
# 連接超時時長 單位為毫秒
ConnectTimeout: 1000
# 資料通信超時時長 單位為毫秒
ReadTimeout: 2000
# 當前服務器的重試次數
MaxAutoRetries: 0
# 重試多少次服務
MaxAutoRetriesNextServer: 0
# 是否對所有的請求方式都重試
OkToRetryOnAllOperations: false
2、Hystrix熔斷器配置:
Feign集成的Hystrix默認情況下是關閉的 需要手動在配置中開啟:
feign:
hystrix:
# 開啟Feign的熔斷功能
enabled: true
然后再配置熔斷方法Fallback
指定在Feign客戶端中當某個方法請求失敗 需要呼叫哪個回呼方法
因此 方法名需要一致 即實作該介面即可
// 作為一個組件 記得要加上@Component注解
@Component
public class UserClientFallback implements UserClient {
@Override
public User queryById(Long id) {
User user=new User();
user.setId(id);
user.setName("用戶例外,查詢失敗,");
return user;
}
}
最后 Feign客戶端的注解也需要修改一下:
- value屬性代表要自動呼叫的服務名稱
- fallback屬性代表服務降級類的class
// @FeignClient注解宣告了當前類為Feign客戶端 并且指定服務名稱 這樣即可自動拼接了
@FeignClient(value = "user-service",fallback = UserClientFallback.class)
public interface UserClient {
// 自動拼接成http://user-service/user/{id}
@GetMapping("/user/{id}")
User queryById(@PathVariable Long id);
}
測驗成功:

三、請求壓縮
Feign支持對請求和回應進行GZIP壓縮以減少通信程序中的性能損耗
通過以下引數即可開啟請求與回應的壓縮功能:
feign:
compression:
request:
# 開啟GZIP請求壓縮
enabled: true
# 設定壓縮的資料型別
mime-types: text/html,application/xml,application/json
# 設定觸發壓縮的大小下限
min-request-size: 2048
response:
# 開啟GZIP回應壓縮
enabled: true
四、日志級別
首先 在組態檔中開啟日志記錄:
# 開啟日志記錄
logging:
level:
# 這里的屬性名為包名 意為記錄該包下的所有日志
net.zjitc: debug
然后撰寫配置類 在配置類中設定日志級別:
Feign支持4種日志級別:
- NONE:不記錄任何日志資訊(默認)
- BASIC:僅記錄請求的方法 URL以及回應狀態碼和執行時間
- HEADERS:在BASIC日志級別的基礎上額外記錄了請求和回應的頭資訊
- FULL:記錄所有請求和回應的明細 包括頭資訊 請求體 元資料
// 配置類
@Configuration
public class FeignConfig {
@Bean
Logger.Level feignLoggerLevel()
{
return Logger.Level.FULL;
}
}
最后 在Feign客戶端中進行設定即可:
- configuration屬性代表Feign配置類的class
// @FeignClient注解宣告了當前類為Feign客戶端 并且指定服務名稱 這樣即可自動拼接了
@FeignClient(value = "user-service",fallback = UserClientFallback.class,configuration = FeignConfig.class)
public interface UserClient {
// 自動拼接成http://user-service/user/{id}
@GetMapping("/user/{id}")
User queryById(@PathVariable Long id);
}
測驗:
日志記錄成功

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/112503.html
標籤:其他
