07 微服務專案的搭建
微服務專案的搭建
簡述一下:
會使用到 nacos openfegin sentinel
三個微服務模組 一個基礎服務模組 注意:文中所有的依賴都是引入到基礎服務模組 base中
三個微服務模組繼承與基礎服務模組 可以做到依賴共享
- service-base 基礎服務模組
- service-core 主服務模組
- service-oss 檔案儲存服務模組
- service-sms 簡訊服務模組
1 nacos的配置
1、Nacos下載和安裝
下載地址:https://github.com/alibaba/nacos/releases
2、Windows啟動Nacos
參考:https://github.com/alibaba/nacos
解壓:將下載的壓縮包解壓
啟動:startup.cmd -m standalone
3、訪問
使用者名稱密碼:nacos/nacos
4、引入依賴
<!--服務發現--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
5、新增服務配置資訊
在需要註冊到註冊中心的微服務放入配置檔案中新增配置
#spring:
cloud:
nacos:
discovery:
server-addr: localhost:8848 # nacos服務地址
6、啟動微服務
啟動已註冊的微服務,檢視 “服務管理 => 服務列表”,可就以看到已註冊的微服務
2 OpenFeign的引入
1、引入依賴
service-base模組中配置OpenFeign的依賴(實際是在服務消費者端需要OpenFeign的依賴)
<!--服務呼叫--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
2、啟動類添加註解
在service-sms的啟動類新增如下註解
因為service-sms是消費者 需要開啟feign的遠端呼叫
@EnableFeignClients
我們這裡以註冊業務為例 在傳送註冊驗證碼的時候 我們需要判斷使用者有沒有註冊過 所以需要在簡訊模組中遠端呼叫介面 判斷使用者是否註冊過 判斷使用者是否註冊過的介面處在另一模組中
-
服務提供者介面資訊
需要在消費者端建立一個介面 學過的都懂
-
服務消費者 也就是簡訊服務
需要向那個服務傳送遠端呼叫
@FeignClient(value = "service-core")// nacos中遠端呼叫的名稱 public interface CoreUserInfoClient { // 遠端呼叫的完整路徑 引數跟提供者一致 @GetMapping("/api/core/userInfo/checkMobile/{mobile}") boolean checkMobile(@PathVariable String mobile); }
這樣也大概實現的遠端呼叫 但是有沒有可能會發生這種情況
-
遠端呼叫超時了呢 解決辦法: 配置更大的超時時間
預設openFeign的超時時間只有1秒鐘
-
可以在配置檔案中新增如下配置:是消費端配置哦
feign: client: config: default: connectTimeout: 10000 #連線超時配置 readTimeout: 600000 #執行超時配置
-
遠端調用出錯了呢
配置容錯措施 用sentinel實現 後面會說
-
3、日誌
不知道你們會不會有這樣的疑問 我們怎麼知道遠端呼叫是否成功了呢 不能只看報錯資訊吧 openFeign也提供了日誌功能 下面看看吧
1、作用
OpenFeign提供了日誌列印功能,我們可以通過配置來調整日誌級別,從而瞭解OpenFeign中Http請求的細節。即對OpenFeign遠端介面呼叫的情況進行監控和日誌輸出。
2、日誌級別
- NONE:預設級別,不顯示日誌
- BASIC:僅記錄請求方法、URL、響應狀態及執行時間
- HEADERS:除了BASIC中定義的資訊之外,還有請求和響應頭資訊
- FULL:除了HEADERS中定義的資訊之外,還有請求和響應正文及元資料資訊
3、配置日誌bean
在service-base中建立配置檔案 也就是基礎服務模組
@Configuration
public class OpenFeignConfig {
@Bean
Logger.Level feignLoggerLevel(){
return Logger.Level.FULL;
}
}
4、開啟日誌
sms的application.yml中指定監控的介面,以及日誌級別
CoreUserInfoClient 傳送遠端呼叫的介面
logging:
level:
com.atguigu.srb.sms.client.CoreUserInfoClient: DEBUG #以什麼級別監控哪個介面
5、監控到的日誌
HTTP 是一種無狀態協議,客戶端向伺服器傳送一個 TCP 請求,服務端響應完畢後斷開連線。
如果客戶端向伺服器傳送多個請求,每個請求都要建立各自獨立的連線以傳輸資料。
HTTP 有一個 KeepAlive 模式,它告訴 webserver 在處理完一個請求後保持這個 TCP 連線的開啟狀態。
若接收到來自客戶端的其它請求,服務端會利用這個未被關閉的連線,而不需要再建立一個連線。
KeepAlive 在一段時間內保持開啟狀態,它們會在這段時間內佔用資源。佔用過多就會影響效能。
timeout 來指定 KeepAlive 的超時時間(timeout)。指定每個 TCP 連線最多可以保持多長時間。
3 sentinel 服務容錯
在服務傳送錯誤時 消費端的一種容錯模式
1、引入依賴
service-base中引入sentinel依賴
<!--服務容錯-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
2、開啟Sentinel支援
在service-sms的yml配置檔案中開啟Feign對Sentinel的支援
#開啟Feign對Sentinel的支援
#feign:
sentinel:
enabled: true
3、建立容錯類
fallback:當無法校驗手機號是否已註冊時,直接傳送簡訊
package com.atguigu.sms.client.fallback;
import com.atguigu.sms.client.CoreUserInfoClient;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
/**
* 對遠端服務呼叫的容錯措施
* @author : look-word
* @date : 2022-05-22 19:14
**/
@Slf4j
@Service
public class CoreUserInfoClientFallBack implements CoreUserInfoClient {
@Override
public boolean checkMobile(String mobile) {
log.info("遠端呼叫失敗 除法服務熔斷 service-core/api/core/userInfo/checkMobile/"+mobile);
return false;
}
}
4、指定熔斷類
為OpenFeign遠端呼叫介面新增fallback屬性值沒指定容錯類
CoreUserInfoClient 遠端呼叫介面哦
@FeignClient(value = "service-core", fallback = CoreUserInfoClientFallback.class)
public interface CoreUserInfoClient {
5、測試
停止core微服務測試
我們可以看到 服務容錯生效