SpringBoot應用整合微服務元件Nacos

2023-04-20 18:01:05

前情提要

當你看到此篇文章時,nacos目前最新穩定版本為:2.2.2 (Apr 11, 2023) Latest

版本不在於有多新,在於與當前場景環境匹配正常,穩中求快。萬一你用了比較新的版本,遇到問題怎麼辦?有問題,那就找李元芳吧!開個玩笑。你可以去 nacos 的github倉庫issues提問、追問選擇解決方案,促進開源社群的和諧發展。

第一篇基礎篇,可在部落格園搜尋:MySQL資料庫與Nacos搭建監控服務。

本篇是個人nacos系列文章第二篇springboot專案整合微服務元件nacos。

整體思路,個人nacos系列博文一共分為三篇

  • 基礎篇:《MySQL資料庫與Nacos搭建監控服務》,Nacos與MySQL基本介紹。
  • 開發篇:《開發篇:springboot與微服務元件nacos》,從程式碼開始構建,整合微服務元件。
  • 運維篇:《運維篇:nacos prometheus grafana》,服務監控篇,主要以Linux發行版為主。

騷話環節

一入程式設計深似海,從此節操是路人。脫髮已是常態,致富還需絕頂。

那天我聽說程式設計師之間還相互鄙視,其中不能忍的終極鄙視:有女朋友的程式設計師鄙視沒有女朋友的程式設計師。這不能忍,打不過怎麼辦,問就是加入吧。

由於是測試環境,使用版本比較新,學當然要學新知識吸收精華,羽化成仙,做那萬人敬仰韓天尊。啊,不好意思,扯遠了。開個玩笑,我們依舊使用穩定版本。此次在Linux發行版作業系統中全程使用root使用者進行測試避免許可權問題帶來的干擾,如果使用普通使用者請自行測試提權賦予所有者或者所屬組許可權。

騷話不多說,直接進入今天的主題springboot專案整合微服務元件nacos

springboot與微服務元件nacos

必備環境,前置條件儘量保持一致

  • JDK版本: JDK17
  • 開發工具和專案構建工具:STS4 & Maven3.6
  • Springboot版本:Springboot2.7.x
  • 服務監控三件套:Nacos2.x、Prometheus2.3.x、Grafana9.3.x
  • 開發測試環境:Linux(centos-stream-9)雲伺服器或者VMware搭建環境

你可以瞭解到的知識:從專案開發構建到線上測試釋出,不過,需要具備一點點Java或者其它程式語言基礎知識。

tips:做實驗時請檢查是否關安裝防火牆管理工具,關閉防火牆服務或者開啟相應埠,或者放通雲伺服器安全組。

企業中生產環境,唯穩,穩中求快

可以看到,我再次使用了這張流程圖,在第三篇會總結使用過程。

Nacos服務快速啟動

關於nacos2.2.0相關設定說明以及資料來源說明,遇到問題總結,可以參考如下文章:

https://blog.cnwangk.top/2023/03/30/MySQL資料庫與Nacos搭建監控服務/

使用hexo搭建靜態部落格網站,感興趣可以自己搭建一個,利用github pages和cloudflare pages等進行同步。之所以給出上面的連結,因為一篇優質的教學,會持續更新迭代。當然,在個人公眾號裡面同樣可以搜尋到相關教學。

根據個人或者團隊開發環境,可以選擇框架開發環境:spring、springboot以及springcloud整合nacos

值得注意的地方

伺服器部署nacos服務支援多種場景:

  1. Nacos原生形式部署。
  2. Nacos Docker形式部署。
  3. Nacos Kubernetes形式部署。

至於用哪種方式,根據實際業務場景分析,選擇符合個人或者公司業務場景的最佳方式。

Nacos支援三種部署模式

  • 單機模式:用於測試和單機試用。
  • 叢集模式:用於生產環境,確保高可用。
  • 多叢集模式:用於多資料中心場景。

高可用環境準備

  • 建議支撐環境:部署JDK,需要 1.8 及其以上版本
  • 建議硬體設定:2核 CPU / 4G 記憶體 及其以上
  • 建議軟體設定:生產環境 3 個節點 及其以上

Nacos 依賴 Java 環境來執行。如果您是從程式碼開始構建並執行Nacos,還需要為此設定 Maven環境,請確保是在以下版本環境中安裝使用:

1、預備環境準備

  • 64 bit OS,支援 Linux/Unix/Mac/Windows,推薦選用 Linux/Unix/Mac

  • 64 bit JDK 1.8+ 。

  • Maven 3.2.x+ 。

2、下載原始碼或者安裝包

你可以通過原始碼發行包兩種方式來獲取 Nacos。

個人推薦:下載發行包。關於版本,使用穩定版本(通常有GA標識),個人習慣使用官方推薦的上一個小版本。有特殊需求可以下載原始碼包,修改原始碼重新編譯。

從 Github 獲取原始碼方式,使用git clone命令,值得注意的是你需要部署Git環境

git clone https://github.com/alibaba/nacos.git
cd nacos/
mvn -Prelease-nacos -Dmaven.test.skip=true clean install -U  
ls -al distribution/target/
// change the $version to your actual path
cd distribution/target/nacos-server-$version/nacos/bin

nacos發行包下載地址

下載編譯後壓縮包方式,您可以從 最新穩定版本 下載 nacos-server-$version.zip 包。

unzip nacos-server-$version.zip 或者 tar -zxvf nacos-server-$version.tar.gz
cd nacos/bin
  • $version指具體nacos版本號,比如具體版本:nacos-server-2.1.1。

  • Windows平臺建議下載以 .zip結尾的壓縮包:nacos-server-2.1.1.zip。

  • Linux平臺建議下載以 .tar.gz 結尾的壓縮包:nacos-server-2.1.1.tar.gz。

3、修改組態檔

注意:修改conf目錄下的application.properties檔案。設定其中的nacos.core.auth.plugin.nacos.token.secret.key值,詳情可檢視鑑權-自定義金鑰:

https://nacos.io/zh-cn/docs/v2/plugin/auth-plugin.html

注意,檔案中的預設值SecretKey012345678901234567890123456789012345678901234567890123456789VGhpc0lzTXlDdXN0b21TZWNyZXRLZXkwMTIzNDU2Nzg=為公開預設值,可用於臨時測試,實際使用時請務必更換為自定義的其他有效值。

4、啟動伺服器

Linux/Unix/Mac:執行startup.sh指令碼
啟動命令(standalone代表著單機模式執行,非叢集模式):

sh startup.sh -m standalone

如果您使用的是ubuntu系統,或者執行指令碼報錯提示[[符號找不到,可嘗試如下執行:

bash startup.sh -m standalone

Windows平臺:執行startup.cmd指令碼
啟動命令(standalone代表著單機模式執行,非叢集模式):

startup.cmd -m standalone

5、關閉伺服器

Linux/Unix/Mac:執行shutdown.sh指令碼

sh shutdown.sh

Windows平臺:執行shutdown.cmd指令碼

shutdown.cmd

可以在Windows中使用terminal或者cmd命令列執行shutdown.cmd命令,也可以雙擊shutdown.cmd執行檔案。

以下為個人實戰總結,僅供參考

個人開發以及測試環境

  • Spring Tool Suite4
  • JDK17
  • Maven3.6
  • Springboot2.7.6
  • VMware16 & Linux(Centos-9-Stream)

關於IDE的選擇

有人喜歡使用 IntelliJ IDEA ,有人喜歡用 Vim,有人喜歡用VSCode,還有人就偏愛 eclipse 。開發工具 IDE 的選擇,不一定非要和我保持一致。個人開發者可以根據自己的喜好選擇,怎麼順手怎麼來,主打一個用的舒心。如果是團隊開發,最優質的方案是與團隊保持一致。

可能是入坑最開始接觸的 IDE 是eclipse,習慣了。個人小專案偶爾會用VSCode,大型專案更趨向於 eclipse 或者 IntelliJ IDEA。

STS4 開發工具

支援OS版本,彼時最新版本是4.17.1

  • Linux X86_64、Linux ARM_64
  • MACOS X86_64、MACOS ARM_64
  • WINDOWS X86_64

官網:https://spring.io/tools

下載地址:https://download.springsource.com/release/STS4/4.16.1.RELEASE/dist/e4.25/spring-tool-suite-4-4.16.1.RELEASE-e4.25.0-win32.win32.x86_64.self-extracting.jar

Maven 環境設定

STS4開發工具引入Maven設定

依次找到頂部選單欄:Window---> Preferences---> Maven--->User Settings--->Global Settings & User Settings--->Apply

設定完記得點選Apply或者Apply and Close

Maven Repo設定阿里雲映象源

本地maven環境設定conf\settings.xml(使用阿里雲映象地址),maven版本:apache-maven-3.6.3

設定本地repo倉庫儲存目錄

<localRepository>D:\Maven\repo</localRepository>	

設定mirrors

  <mirrors>
    <mirror>
          <id>aliyunmaven</id>
          <name>aliyun maven</name>
          <!-- 老版本url -->
          <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
          <!-- 新版本url -->
          <!--<url>https://maven.aliyun.com/repository/public/</url>-->
          <mirrorOf>central</mirrorOf>        
    </mirror>
  </mirrors>

阿里雲Maven中央倉庫為 阿里云云效 提供的公共代理倉庫,幫助研發人員提高研發生產效率,使用阿里雲Maven中央倉庫作為下載源,速度更快更穩定。

倉庫名稱 阿里雲倉庫地址 阿里雲倉庫地址(老版) 源地址
central https://maven.aliyun.com/repository/central https://maven.aliyun.com/nexus/content/repositories/central https://repo1.maven.org/maven2/
jcenter https://maven.aliyun.com/repository/public https://maven.aliyun.com/nexus/content/repositories/jcenter http://jcenter.bintray.com/
public https://maven.aliyun.com/repository/public https://maven.aliyun.com/nexus/content/groups/public central倉和jcenter倉的聚合倉
google https://maven.aliyun.com/repository/google https://maven.aliyun.com/nexus/content/repositories/google https://maven.google.com/
gradle-plugin https://maven.aliyun.com/repository/gradle-plugin https://maven.aliyun.com/nexus/content/repositories/gradle-plugin https://plugins.gradle.org/m2/
spring https://maven.aliyun.com/repository/spring https://maven.aliyun.com/nexus/content/repositories/spring http://repo.spring.io/libs-milestone/
spring-plugin https://maven.aliyun.com/repository/spring-plugin https://maven.aliyun.com/nexus/content/repositories/spring-plugin http://repo.spring.io/plugins-release/
grails-core https://maven.aliyun.com/repository/grails-core https://maven.aliyun.com/nexus/content/repositories/grails-core https://repo.grails.org/grails/core
apache snapshots https://maven.aliyun.com/repository/apache-snapshots https://maven.aliyun.com/nexus/content/repositories/apache-snapshots https://repository.apache.org/snapshots/

線上搜尋jar包依賴https://developer.aliyun.com/mvn/search

Springboot整合nacos服務

主要介紹Springboot專案以微服務形式整合nacos,如果使用springmvc或者是普通springboot專案整合nacos服務,可以參考官方檔案。關於版本問題,我將官方部分(個人感覺初次使用可能用得上,並非全部)檔案引入到本次教學。

tips:sts個性化註解設定,Window---> Preferences--->Java--->Code Style--->Code Templates--->Comments:Types method

在整合nacos服務之前,一步一步來,從構建第一個springboot專案開始。

springboot專案構建

可能你有疑問,springboot版本如何選擇,下圖支援最後維護時間可供參考:

目前Springboot官網最新穩定版本是Springboot3.0.5,實際工作中個人使用2.7.x版本,未來主流可能是3.X版本。目前主流依舊是Springboot2.x,更傾向於2.6.x或者2.7.x作為開發構建版本,當然也是以spring官網顯示維護時間作為參考。

專案構建方式有多種,總體上分官網腳手架構建和開發工具構建,此處以官網和STS4為範例。不必糾結,怎麼順手怎麼來。

如果官網存取速度緩慢,你還可以通過阿里雲腳手架網站構建https://start.aliyun.com/

springboot專案之官網構建

存取:https://start.spring.io/

第一步

  1. Project:選擇Maven作為專案構建方式
  2. Language:選擇Java作為開發語言
  3. Spring Boot:選擇springboot2.7.6穩定版本作為構建版本
  4. Dependencies:選擇pom依賴的jar包

第二步

  1. Project Metadata:專案後設資料,Group組名、Artifact工程名、Name專案名稱、Description專案描述、Package name包名。
  2. Packaging:選擇Jar作為預設打包方式。
  3. Java:選擇JDK17作為Java專案預設構建版本。
  4. GENERATE:生成構建專案demo並下載。
  5. EXPLORE:展示出構建專案結構清單以及檔案具體內容。

以下展示Project Metadata截圖以及EXPLORE截圖。

EXPLORE:展示專案層次結構

springboot專案之STS4工具構建

依次選擇File-->new-->Spring Starter Project,或者使用快捷鍵ALT+SHIFT+N。

設定Project步驟一

具體含義參考上面官網構建時說明。

設定Project步驟二

選擇springboot版本,以及設定所需要的pom.xml依賴。

如下圖所示,Spring Boot Version個人選擇的是springboot2.7.6穩定版本作為演示,目前最新穩定版本可選為springboot3.0.5。Frequently Used表示官方建議使用到的一些工具,講幾個個人使用過的。

Lombok用於簡化實體類(bean、entity、repository)get、set方法以及log紀錄檔列印,個人開發很實用,團隊中慎重使用。

MariaDB Driver是MariaDB資料庫驅動,可以看做是MySQL替代產品。Spring Data JPA是對ORM持久化框架Hibernate近一步封裝,簡化了SQL操作。Spring Data MongoDB是nosql資料庫中的一種,其它有Redis,主要用於做快取使用。Spring Data Redis是nosql資料庫中的一種,前面剛好介紹到了。

搜尋方塊Type to search dependencies,可以進行檢索需要的依賴,也可以展開下面小箭頭選擇依賴。比如展開下圖上的SQL選項,有多種資料庫驅動依賴可供選擇使用。

springboot整合微服務nacos

正式搭建之前,注意專案環境:使用Spring如何整合nacos?使用springboot如何整合nacos?使用springcloud微服務元件如何整合nacos?此處發出了三連問,也許你在使用時也會遇到。不同的環境,可能得到的結果不一樣。

**下面將演示 springboot 專案整合微服務元件 nacos 過程 **。

1、啟動範例

本地正常啟動場景,使用127.0.0.1或者localhost,預設埠:8080。特殊情況在組態檔指定了固定IP地址。例如在application.properties 或者 application.yml 指定IP和埠,兩種設定方式保留一種即可。

範例:application.properties

server.port=8081
server.address=192.168.1.111

範例:application.yml

server:
  port: 8081
  address: 192.168.1.111

springboot啟動過程:

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v2.7.6)

2022-10-26 20:13:06.902  INFO 16620 --- [           main] com.test.demo.Application                : Starting Application using Java 17.0.2 on kart with PID 16620 (...)
2022-10-26 20:13:08.091  INFO 16620 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
...
2022-10-26 20:13:10.260  INFO 16620 --- [           main] c.a.c.n.registry.NacosServiceRegistry    : nacos registry, DEFAULT_GROUP springboot-test 192.168.245.1:8080 register finished
2022-10-26 20:13:10.579  INFO 16620 --- [           main] com.test.demo.Application                : Started Application in 4.45 seconds (JVM running for 5.251)

2、設定pom.xml

springbot版本簡要說明:springboot GA(General Availability 表示穩定版本),各分支最新穩定版本2.3.12、2.4.13、2.5.14、2.6.14、2.7.10、3.0.5

	<!-- springboot GA(最新穩定版本):2.3.12、2.4.13、2.5.14、2.6.14、2.7.10、3.0.5 -->
	<!-- springboot pom.xml parent父類別 -->
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.7.6</version>
		<relativePath/> 
	</parent>

統一版本管理:JDK版本:17,spring-cloud-dependencies版本採用2021.0.4,spring-cloud-alibaba-dependencies版本採用:2021.0.4.0,和我保持一致,可以採用springboot2.7.x進行測試使用。目前,如果使用阿里雲腳手架構建,springboot版本推薦不高於2.6.13。在nacos系列博文第一篇《MySQL資料庫與Nacos搭建監控服務》中有寫到如何構建,這裡不在贅述。

	<properties>
		<java.version>17</java.version>
        <spring-cloud-dependencies.version>2021.0.4</spring-cloud-dependencies.version>
		<spring-cloud-alibaba-dependencies.version>2021.0.4.0</spring-cloud-alibaba-dependencies.version>
	</properties>	

pom依賴管理:dependency

主要注意版本對應:

  • 微服務:spring cloud依賴
  • 微服務:spring cloud alibaba依賴
  • 微服務:nacos config依賴、nacos discovery依賴、bootstrap依賴
<!-- 總包管理 -->
	<dependencyManagement>
		<dependencies>
			<!-- spring cloud依賴 -->
			<dependency>
			    <groupId>org.springframework.cloud</groupId>
			    <artifactId>spring-cloud-dependencies</artifactId>
			    <version>${spring-cloud-dependencies.version}</version>
			    <type>pom</type>
			    <scope>import</scope>
			</dependency>
			<!-- spring cloud alibaba依賴 -->
			<dependency>
			    <groupId>com.alibaba.cloud</groupId>
			    <artifactId>spring-cloud-alibaba-dependencies</artifactId>
			    <version>${spring-cloud-alibaba-dependencies.version}</version>
			    <type>pom</type>
			    <scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>	
<!-- 引入相關依賴 -->	
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		<!-- 微服務 nacos config依賴 -->
		<dependency>
   			<groupId>com.alibaba.cloud</groupId>
    		<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
		</dependency>
		<!-- 微服務 nacos discovery依賴 -->
		<dependency>
			<groupId>com.alibaba.cloud</groupId>
    		<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
		</dependency>
		<!-- 微服務 bootstrap依賴  -->
		<dependency>
		    <groupId>org.springframework.cloud</groupId>
		    <artifactId>spring-cloud-starter-bootstrap</artifactId>
		</dependency>
	</dependencies>	

3、設定application.properties & application.yml & bootstrap.properties

如果使用開發環境多組態檔設定,可以使用:dev、prod、test進行區分,使用引數 spring.profiles.active=dev 進行指定為開發環境。

# api port
server.port=8080
# 開發環境多組態檔設定:dev、prod、test
spring.profiles.active=dev
# 服務名稱
spring.application.name=springboot-test
###################################nacos設定#######################################
# nacos 開啟監控 配合普羅米修斯進行監控 官方提供了MySQL初始化sql檔案 在conf目錄下:nacos-mysql.sql
# 暴露metrics資料
management.endpoints.web.exposure.include=*
# nacos 設定註冊遠端服務地址{config.server-addr和server-addr}
#spring.cloud.nacos.config.server-addr=192.168.245.132:8848
# nacos 設定註冊與發現{discovery.server-addr}
spring.cloud.nacos.discovery.server-addr=192.168.245.132:8848
#spring.cloud.nacos.discovery.namespace=public
spring.cloud.nacos.config.file-extension=properties
###################################nacos設定#######################################

bootstrap.properties

#bootstrap.properties基礎設定
#服務名稱
spring.application.name=springboot-test
#暴露config設定服務地址(動態更新)
spring.cloud.nacos.config.server-addr=192.168.245.132:8848
#設定config副檔名(properties & yml)
spring.cloud.nacos.config.file-extension=properties

4、springboot入口:設定Application.java

  • @SpringBootApplication:sringboot啟動必備註解
  • @EnableDiscoveryClient:用於nacos發現使用者端註解
@SpringBootApplication	//sringboot啟動必備註解
@EnableDiscoveryClient  //用於nacos發現使用者端註解
public class Application {
	public static void main(String[] args) {
		SpringApplication.run(Application.class, args);
	}
}

TestController類引入測試程式碼:使用 Spring Cloud 原生註解,開啟自動更新。

單一設定場景,通過@Value註解,設定動態設定獲取測試。

多屬性設定場景,可以通過@Autowired 註解注入自定義設定類。

@RestController
@RefreshScope // Spring Cloud 原生註解 開啟自動更新
@RequestMapping(value = "/t")
public class TestController {
	/** 使用動態設定獲取測試 --BEGIN-- **/
	@Value("${alibaba.config.discovery}")
	private String discovery;
	
    @Value("${alibaba.config.name}")
	private String name;

	@GetMapping("/getConfig")
	public String getConfig() {
		log.info("getConfig>>>>>>>>>>>");
		return "getConfig>>>>>>>>>>>>" + "發現:" + discovery + ">>>服務名稱:" + name;
	}
	
	@Value("${custom.config.find}")
	private String find;
	
	@Value("${custom.config.say}")
	private String say;
	
	@GetMapping("/meet")
	public String meet() {
		log.info("meet>>>>>>>>>>>");
		return "meet>>>>>>>>>>>>" + "偶遇老溼:" + find + ">>>你好:" + say;
	}
	/** 使用動態設定獲取測試 --END-- **/
	}
}

可以根據業務情況而定,將多個設定封裝到一個類裡面,如下所示,新建CustomConf類:

/**
 * desc:物件設定類
 * @Value 
 * @Component @ConfigurationProperties
 */
@Component
@ConfigurationProperties(prefix = "custom")
public class CustomConf {
	private Integer one;
	private Integer two;
	private Integer three;
	private String description;

    // 此處省略掉了 get set 方法,實際需要補上
}

使用到註解:

  • @Value :通常情況,使用註解取值。
  • @Component :加入註解,便於被掃描到。
  • @ConfigurationProperties:引入設定,通過prefix指定設定字首。

在專案中注入:

@Autowired
private CustomConf custom;

@RequestMapping("/custom")
   public String custom() {
       return "[custom] " + custom;
   }

nacos 控制檯:新建設定:springboot-test.properties

nacos 控制檯:設定詳情:設定的比較隨意,參考看看就行

執行服務

  • nohup:代表脫離終端執行
  • &:代表放入後臺
  • -Dspring.profiles.active=prod:指定為生產環境
[root@Centos9-Stream test]# nohup java -jar -Dspring.profiles.active=prod /opt/workspace/test/springboot-nacos-cloud-0.0.1-SNAPSHOT.jar  > /opt/
workspace/test/springboot-nacos.log 2>&1 &
[1] 4628

測試介面

http://192.168.245.132:8082/t/getConfig

你也可以使用curl命令請求:

curl -X GET http://192.168.245.132:8082/t/getConfig

得到輸出結果

getConfig>>>>>>>>>>>>發現:設定>>>服務名稱:nacos服務

檢視紀錄檔驗證:

tail -n 5 springboot-nacos.log

驗證成功,getConfig紀錄檔列印出來了。

至此,springboot整合微服務元件nacos聯動完成,詳細說明可以參考上一篇文章,文初有說明,這裡不在贅述。

實際使用過程中,難免會遇到各種問題,此時不用慌,有詳細官方檔案可供參考。如下引入了nacos部分檔案,解決搭建過程中遇到的問題,提供參考

nacos版本問題

如果你使用nacos 1.x升級到nacos 2.x版本,建議參考官方相容性說明與升級檔案

nacos2.0.0版本相容性說明

相容性說明:https://nacos.io/zh-cn/docs/v2/upgrading/2.0.0-compatibility.html

目前官網推薦使用nacos2.1.1穩定版,推薦的上一個穩定版本是2.0.3。

Nacos2.0版本相比1.X新增了gRPC的通訊方式,因此需要增加2個埠。新增埠是在設定的主埠(server.port)基礎上,進行一定偏移量自動生成。

與主埠的偏移量 描述
9848 1000 使用者端gRPC請求伺服器端埠,用於使用者端向伺服器端發起連線和請求
9849 1001 伺服器端gRPC請求伺服器端埠,用於服務間同步等

使用VIP/nginx請求時,需要設定成TCP轉發,不能設定http2轉發,否則連線會被nginx斷開。

使用者端擁有相同的計算邏輯,使用者如同1.X的使用方式,設定主埠(預設8848),通過相同的偏移量,計算對應gRPC埠(預設9848)。

因此如果使用者端和伺服器端之前存在埠轉發或防火牆時,需要對埠轉發設定和防火牆設定做相應的調整

nacos升級檔案

升級檔案:https://nacos.io/zh-cn/docs/v2/upgrading/2.0.0-upgrading.html

nacos版本與spring cloud對應關係

由於 Spring Boot 3.0,Spring Boot 2.7~2.4 和 2.4 以下版本之間變化較大,目前企業級客戶老專案相關 Spring Boot 版本仍停留在 Spring Boot 2.4 以下,為了同時滿足存量使用者和新使用者不同需求,社群以 Spring Boot 3.0 和 2.4 分別為分界線,同時維護 2022.x、2021.x、2.2.x 三個分支迭代。 為了規避相關構建過程中的依賴衝突問題,我們建議可以通過 雲原生應用腳手架 進行專案建立。

2022.x 分支

適配 Spring Boot 3.0,Spring Cloud 2022.x 版本及以上的 Spring Cloud Alibaba 版本按從新到舊排列如下表(最新版本用*標記): (注意,該分支 Spring Cloud Alibaba 版本命名方式進行了調整,未來將對應 Spring Cloud 版本,前三位為 Spring Cloud 版本,最後一位為擴充套件版本,比如適配 Spring Cloud 2022.0.0 版本對應的 Spring Cloud Alibaba 第一個版本為:2022.0.0.0,第個二版本為:2022.0.0.1,依此類推)

Spring Cloud Alibaba Version Spring Cloud Version Spring Boot Version
2022.0.0.0-RC* Spring Cloud 2022.0.0 3.0.0

2021.x 分支

適配 Spring Boot 2.4,Spring Cloud 2021.x 版本及以上的 Spring Cloud Alibaba 版本按從新到舊排列如下表(最新版本用*標記): (注意,該分支 Spring Cloud Alibaba 版本命名方式進行了調整,未來將對應 Spring Cloud 版本,前三位為 Spring Cloud 版本,最後一位為擴充套件版本,比如適配 Spring Cloud 2021.0.1 版本對應的 Spring Cloud Alibaba 第一個版本為:2021.0.1.0,第個二版本為:2021.0.1.1,依此類推)

Spring Cloud Alibaba Version Spring Cloud Version Spring Boot Version
2021.0.5.0* Spring Cloud 2021.0.5 2.6.13
2021.0.4.0* Spring Cloud 2021.0.4 2.6.11
2021.0.1.0 Spring Cloud 2021.0.1 2.6.3
2021.1 Spring Cloud 2020.0.1 2.4.2

2.2.x 分支

適配 Spring Boot 為 2.4,Spring Cloud Hoxton 版本及以下的 Spring Cloud Alibaba 版本按從新到舊排列如下表(最新版本用*標記):

Spring Cloud Alibaba Version Spring Cloud Version Spring Boot Version
2.2.10-RC1* Spring Cloud Hoxton.SR12 2.3.12.RELEASE
2.2.9.RELEASE* Spring Cloud Hoxton.SR12 2.3.12.RELEASE
2.2.8.RELEASE Spring Cloud Hoxton.SR12 2.3.12.RELEASE
2.2.7.RELEASE Spring Cloud Hoxton.SR12 2.3.12.RELEASE
2.2.6.RELEASE Spring Cloud Hoxton.SR9 2.3.2.RELEASE
2.2.1.RELEASE Spring Cloud Hoxton.SR3 2.2.5.RELEASE
2.2.0.RELEASE Spring Cloud Hoxton.RELEASE 2.2.X.RELEASE
2.1.4.RELEASE Spring Cloud Greenwich.SR6 2.1.13.RELEASE
2.1.2.RELEASE Spring Cloud Greenwich 2.1.X.RELEASE
2.0.4.RELEASE(停止維護,建議升級) Spring Cloud Finchley 2.0.X.RELEASE
1.5.1.RELEASE(停止維護,建議升級) Spring Cloud Edgware 1.5.X.RELEASE

元件版本關係

版本說明https://github.com/alibaba/spring-cloud-alibaba/wiki/版本說明

每個 Spring Cloud Alibaba 版本及其自身所適配的各元件對應版本如下表所示(注意,Spring Cloud Dubbo 從 2021.0.1.0 起已被移除出主幹,不再隨主幹演進):

Spring Cloud Alibaba Version Sentinel Version Nacos Version RocketMQ Version Dubbo Version Seata Version
2021.0.5.0 1.8.6 2.2.0 4.9.4 ~ 1.6.1
2.2.10-RC1 1.8.6 2.2.0 4.9.4 ~ 1.6.1
2022.0.0.0-RC1 1.8.6 2.2.1-RC 4.9.4 ~ 1.6.1
2.2.9.RELEASE 1.8.5 2.1.0 4.9.4 ~ 1.5.2
2021.0.4.0 1.8.5 2.0.4 4.9.4 ~ 1.5.2
2.2.8.RELEASE 1.8.4 2.1.0 4.9.3 ~ 1.5.1
2021.0.1.0 1.8.3 1.4.2 4.9.2 ~ 1.4.2
2.2.7.RELEASE 1.8.1 2.0.3 4.6.1 2.7.13 1.3.0
2.2.6.RELEASE 1.8.1 1.4.2 4.4.0 2.7.8 1.3.0
2021.1 or 2.2.5.RELEASE or 2.1.4.RELEASE or 2.0.4.RELEASE 1.8.0 1.4.1 4.4.0 2.7.8 1.3.0
2.2.3.RELEASE or 2.1.3.RELEASE or 2.0.3.RELEASE 1.8.0 1.3.3 4.4.0 2.7.8 1.3.0
2.2.1.RELEASE or 2.1.2.RELEASE or 2.0.2.RELEASE 1.7.1 1.2.1 4.4.0 2.7.6 1.2.0
2.2.0.RELEASE 1.7.1 1.1.4 4.4.0 2.7.4.1 1.0.0
2.1.1.RELEASE or 2.0.1.RELEASE or 1.5.1.RELEASE 1.7.0 1.1.4 4.4.0 2.7.3 0.9.0
2.1.0.RELEASE or 2.0.0.RELEASE or 1.5.0.RELEASE 1.6.3 1.1.1 4.4.0 2.7.3 0.7.1

排查錯誤

啟動時報錯Connection is unregistered.Client not connected,current status:STARTING.

原因是使用者端gRPC無法和伺服器端建立連線,請先使用telnet ${nacos.server.address}:${nacos.server.grpc.port}進行測試,檢視網路是否暢通,伺服器端埠是否已經正確監聽。

Nacos2.0增加了9848,9849埠來進行GRPC通訊,我需要在application.properties中額外設定嗎?

不需要,這兩個埠在Nacos2.0內部是通過8848+1000以及8848+1001這種偏移量方式計算出來的,不需要使用者額外在組態檔中設定。但如果使用的是docker或存在埠轉發方式啟動,需要把這兩個埠進行設定。

啟動nacos2.0時希望用nginx 代理,9848這個埠怎樣處理,要通過nginx暴露出來麼?以及docker是否需要對映?

如果存在防火牆或者nginx埠轉發問題,需要進行相應的埠暴露設定。如在nginx中,在已經暴露8848(x)的基礎上,需要額外暴露9848(x+1000)。

解決版本衝突問題時遇到埠未開放

2022-12-07 20:08:13.792  INFO 17152 --- [t.remote.worker] com.alibaba.nacos.common.remote.client   : [236c02fe-157b-475e-9540-b11bf110f49e_config-0] Fail to connect server, after trying 2 times, last try server is {serverIp = '192.168.245.132', server main port = 8858}, error = unknown
2022-12-07 20:08:16.213 ERROR 17152 --- [           main] c.a.n.c.remote.client.grpc.GrpcClient    : Server check fail, please check server 192.168.245.132 ,port 9858 is available , error ={}

分析問題:檢查192.168.245.132伺服器的埠9858是否可用。如果參考了上面檔案,你會發現我預設埠為8858,nacos2.x使用gRPC通訊方式,+1000偏移量檢測9858是否可用,由於防火牆或埠轉發等原因,需要開發相應埠。

開放相應埠

firewall-cmd --zone=public --add-port=9858/tcp --permanent
firewall-cmd --zone=public --add-port=9859/tcp --permanent

過載firewall-cmd服務

firewall-cmd --reload

檢視開放的埠

[root@Centos9-Stream nacos-2.0.4]# firewall-cmd --list-all
public (active)
...
ports: 8848/tcp 9001-9010/tcp 8081/tcp 3000/tcp 8082/tcp 8083/tcp 8858/tcp 9858/tcp
...

啟動多個nacos server服務導致nacos-server.jar佔用 PID 問題

定位問題:檢視nacos.log紀錄檔檔案

2022-12-07 20:19:02,601 INFO Starting Nacos v2.0.3 on Centos9-Stream with PID 34970 (/usr/local/nacos/target/nacos-server.jar started by root in /usr/local/nacos-2.0.4)

參考資料

切記切記,以上總結,僅供參考!別人提供的是思考方向,具體實踐還需親自測試印證。

有不足的地方,還望各位大佬輕噴。

END----

靜下心來,才發現原來不會的還有很多。

一分耕耘,一分收穫。

多總結,你會發現,自己的知識寶庫越來越豐富。