Spring Cloud是Spring旗下的專案之一
Spring Cloud並不是一個元件 而是許多元件的集合
其將當下非常流行的一些技術整合到了一起 實現了多個分散式開發中的重要功能
協調了分散式環境中各個系統 並且為各類服務提供模板性的設定
其主要涉及的元件包括:
【在本篇中 將介紹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已經內建了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使用者端的註解也需要修改一下:
// @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種紀錄檔級別:
// 設定類
@Configuration
public class FeignConfig {
@Bean
Logger.Level feignLoggerLevel()
{
return Logger.Level.FULL;
}
}
最後 在Feign使用者端中進行設定即可:
// @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);
}
測試:
紀錄檔記錄成功