Spring Cloud Alibaba - Nacos
typora-root-url: E:\software\JAVA\springcloud-alibaba\document\動力節點spring cloud alibaba
SpringCloudAlibaba
EndPoint 服務端點
spring-cloud-starter-alibaba-nacos-discovery 在實現的時候提供了一個EndPoint 服務端點。可以通過訪問
http://localhost:port/actuator/nacos-discovery
獲得關於某個埠下的服務的相關資訊。
subscribe: 顯示了當前有哪些服務訂閱者
NacosDiscoveryProperties: 顯示了當前服務例項關於Nacos的基礎配置
Nacos客戶端資訊快取
Nacos關閉以後,繼續訪問服務仍然可以使用。Nacos不關閉,服務關閉。被呼叫過的服務也會存在在Nacos中一小會兒。
Nacos對於呼叫過的服務會有快取,快取到metadata的Map中。可以降低Nacos的壓力,後續的呼叫直接中快取中返回結果。實現高可用。
Nacos Config 配置中心
在Nacos中配置管理中的配置列表下,新建配置:
所有帶*號的必須填寫。Data ID :填寫服務的名字(也就是每個服務中配置檔案中的spring.application.name)
Group : 服務分組,預設為DEFAULT_GROUP。更改分組需要在改配置服務中的bootstrap.properties下使用配置更改名字(spring.cloud.nacos.config.group=xxx)。名字需要和Nacos中的Group中一致。
配置內容:根據上面選擇的格式,在Nacos中為服務新增相關的配置資訊。相當於把原來的寫在專案中的配置寫在Nacos中方便管理。
這樣的服務工程專案原來的基本配置(將服務註冊至Nacos的相關配置)寫入到bootstrap.properties中,springcloud專案啟動會優先讀取這個檔案中的配置。
使用Nacos Config需要匯入依賴:
檢視遠端配置的詳細資訊的方式
1.在啟動類中新增獲取相關屬性的程式碼段
public static void main(String[] args) throws InterruptedException { //配置容器 ConfigurableApplicationContext applicationContext = SpringApplication.run(NacosConfigApplication.class, args); //從application.properties中讀取相關的屬性 while(true){ //當動態配置重新整理時,會更新到Environment中,因此此處每隔一秒從Environment中獲取配置 String userName = applicationContext.getEnvironment().getProperty("user.name"); String userAge = applicationContext.getEnvironment().getProperty("user.age"); System.out.println(userName+" : "+userAge); //獲取當前部署的環境 String currentEnv = applicationContext.getEnvironment().getProperty("current.env"); //休眠一秒 TimeUnit.SECONDS.sleep(1); } }
2.在類的內部定義相關的屬性獲取
@RestController
public class ConfigController {
@Value("${user.name:}")
private String name;
@Value("${user.age:}")
private String age;
@GetMapping("/config")
public String config(){
return name+":"+age;
}
}
3.通過屬性對映的實體類進行呼叫
實體類:
@Data
@Component
@ConfigurationProperties(prefix = "user")//繫結字首為user的屬性欄位
public class UserEntity {
private String name;
private String age;
}
controller:
@Autowired
private UserEntity userEntity;
@GetMapping("/config2")
public String config2(){
return userEntity.getName()+":"+userEntity.getAge();
}
注意:@Autowired註解必須新增,在這裡UserEntity是從專案啟動後就存在容器中的對映。如果需要獲取配置中的詳細資訊,不能不加註解。不加註解為建立一個UserEntity的例項,其中所有屬性為空,呼叫會報空指標異常錯誤
如果更改Nacos config 配置中心中的配置資訊,無需重啟改服務模組。配置中心會自動動態配置資訊。
通過yaml方式進行遠端配置
首先需要在改模組的bootstrap.properties檔案中新增:
spring.cloud.nacos.config.file-extension=yaml
此配置項預設使用.properties檔案格式
然後在Nacos config的配置中心中新增相關的配置資訊,重啟該服務模組即可。
Nacos config 配置中心多環境配置
支援profile粒度的配置
在模組專案中的bootstrap.properties檔案中可以通過新增:
spring.profiles.active=develop #啟用使用哪一分配置檔案,代表原來的application-dev.properties
選擇遠端的哪一份配置檔案進行啟動。
在Nacos config中進行相關配置時,Data id 需要滿足格式:【name】-【環境名稱】.【遠端配置檔案型別】(例:nacos-config-develop.properties 或 nacos-config-develop.yaml)
Nacos config 配置中心資料模型
通過在 bootstrap.properties檔案中定義:
spring.cloud.nacos.config.namespace=xxxxxxxx
通過名稱空間的指定ID號,來確定使用哪個名稱空間
通過在 bootstrap.properties檔案中定義:
spring.coud.nacos.config.group=MY_GROUP
來選擇遠端配置環境中不同分組的環境配置
資料模型:
tips:遠端配置格式為properties的也可以使用text格式,官方文件中未提及
Nacos資料持久化
內嵌資料庫存於./data/derby-data資料夾中,使用java編寫。由於無法便捷的觀察資料儲存情況,我們使用mysql對它進行資料持久化操作。操作步驟為:
mysql資料庫指令碼存在conf資料夾下。
在mysql中執行nacos-mysql.sql指令碼建立相關的表格。建立表格如下:
修改conf/application.properties檔案,其中:
將這一部分的相關注釋去除,並且修改使用者名稱,密碼,連結。配置資料庫個數。db.num配置資料庫的個數,配置多少個,就要在db.url中.多少個連結(從0作為第一個開始),本機上修改為:
最後如果沒有Nacos叢集,則以單機方式啟動Nacos。當日志資訊中出現:
則代表使用了使用者額外的資料庫資料儲存,即mysql。訪問本機Nacos:
發現所有的資料都為空,開始新增新的配置,後在mysql中的nacos資料庫表config-info中發現增加了剛剛新增的配置資訊。至此資料持久化結束。
Nacos叢集部署
高可用架構:
3個或者3個以上的Nacos節點才可以構成叢集。VIP通過Nginx和Keepalived進行實現。在本機上,複製三分乾淨的Nacos,也就是去除data和log的Nacos
然後分別將三臺Nacos更改至對應埠(applcation.properties中server.port=880x)
我們這邊使用本地的mysql,生產環境每個nacos對應一個數據庫,資料庫之間進行資料同步即可。(本地環境採用:三個Nacos都連線到本地的同一個資料庫)
最後每個Nacos通過以叢集的方式啟動進行測試。訪問Nacos的叢集列表,檢視結果:
如果使用內部資料庫,資料也可以同步,內部資料庫含有同步演算法
加入Nginx
通過官網 www.nginx.org 下載對應版本的Nginx。解壓縮後,雙擊nginx.exe開啟Nginx,訪問localhost:80 檢視是否啟動成功。也可以通過在解壓縮後的目錄下的命令視窗中輸入:nignx -s stop 命令關閉nginx。
有可能,80埠被佔用導致Nginx啟動失敗
在命令視窗下輸入: netstat -aon|findstr :80 檢視80埠被什麼佔用
然後輸入:tasklist|findstr "4" 將第一行後面佔用號輸入檢視對應程序
然後把對應的程序刪去即可。像這種情況就是被IIS服務佔用,如果訪問localhost:80 會出現一下介面:
關閉方式如下:
但是如果如上圖被System佔用,則代表被ntoskrnl.exe佔用,這個程序是負責Windows核心操作部分是核心程序,不可以刪去!這種情況就只能改變nginx的埠號,具體操作歸併到下述配置中。
配置檔案 ./conf/nignx.conf完成對於nginx的配置:
修改監聽埠:
新增對於nacos叢集的連結配置:
新增對於/nacos 請求的攔截和處理(代理轉發):
訪問 localhost:81 :
啟動成功!!!
tips:Nginx負載均衡配置-----upstream
tips: Nginx常用負載均衡策略配置
hash演算法結果為0或者1
tips:Nginx負載均衡其他幾個配置
tips:Nginx靜態代理
tips:Nginx動靜分離
相關連結:https://www.bilibili.com/video/BV1Yb411p7wT?p=24
tips:Nginx虛擬主機
相關連結:https://www.bilibili.com/video/BV1Yb411p7wT?p=25&spm_id_from=pageDriver
通tips回到Nacos叢集,Nginx配置完畢並且成功執行之後,訪問的地址就從原本的三個不同的地址轉變為一個即Nginx地址加上相關連結的方式:
localhost:81/nacos
需要在springcloudalibaba的工程專案中修改對應的路徑:
spring.cloud.nacos.discovery.server-addr=localhost:81
spring.cloud.nacos.config.server-addr=localhost:81