1. 程式人生 > 其它 >Spring Cloud Alibaba - Nacos

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:

http://localhost:8848/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