Eureka、LoadBalance和Nacos
- 一.Eureka引入
- 1.注冊中心
- 2.CAP理論
- 3.常見的注冊中心
- 二.Eureka介紹
- 1.搭建Eureka Server 注冊中心
- 2.搭建服務注冊
- 3.服務發現
- 三.負載均衡LoadBalance
- 1.問題引入
- 2.服務端負載均衡
- 3.客戶端負載均衡
- 4.Spring Cloud LoadBalancer
- 1).快速上手
- 2)負載均衡策略
- 3)自定義負載均衡策略
- 4)LoadBalancer 原理
- 5)服務部署
- 四.Nacos
- 1.安裝
- 1)window環境
- 2)Linux環境
- 2.快速上手
- 五.Nacos負載均衡
- 1.服務器下線
- 修改權重報錯
- 2.同集群優先訪問
- 配置集群的名稱
- 3.健康檢查
- nacos服務器實例
- 4.環境隔離
- 創建環境
- 六.Nacos的配置中心
- 1.配置中心的需求
- 2.快速上手
- 3.配置中心詳解
- data id說明
- 4.部署nacos
- 七.Nacos與Eureka的區別
- 1.共同點
- 2.區別
一.Eureka引入
在環境搭建中,遠程調用使用的url是寫死的,當更換機器,或者新增機器時,這個URL就需要跟著變更,就需要去通知所有的相關服務去修改。隨之而來的就是各個項目的配置文件反復更新,各個項目的頻繁部署。
此時就引入了注冊中心和服務發現,服務啟動/變更時,向注冊中心報道。注冊中心記錄應用和IP的關系。調用方調用時,先去注冊中心獲取服務方的IP,再去服務方進行調用。
1.注冊中心
在最初的架構體系中,集群的概念還不那么流行,且機器數量也比較少,此時直接使用DNS+Nginx就可以滿足幾乎所有服務的發現。相關的注冊信息直接配置在Nginx。
但是隨著微服務的流行與流量的激增,機器規模逐漸變大,并且機器會有頻繁的上下線行為,這種時候需要運維?動地去維護這個配置信息是?個很麻煩的操作。
所以開發者們開始希望有這么?個東西,它能維護?個服務列表,哪個機器上線了,哪個機器宕機了,這些信息都會自動更新到服務列表上,客戶端拿到這個列表,直接進行服務調用即可。這個就是注冊中心。
注冊中心主要有三種角色:
- 服務提供者(Server):一次業務中,被其它微服務調用的服務。也就是提供接口給其它微服務.
- 服務消費者(Client):一次業務中,調用其它微服務的服務。也就是調?其它微服務提供的接口.
- 服務注冊中心(Registry):用于保存Server 的注冊信息,當Server 節點發生變更時,Registry 會同步變更。服務與注冊中心使用?定機制通信,如果注冊中心與某服務長時間無法通信,就會注銷該實例。
他們之間的關系以及工作內容,可以通過兩個概念來描述:
服務注冊:服務提供者在啟動時,向 Registry 注冊自身服務,并向 Registry 定期發送心跳匯報存活狀
態。
服務發現: 服務消費者從注冊中心查詢服務提供者的地址,并通過該地址調?服務提供者的接口。服務發現的?個重要作用就是提供給服務消費者?個可用的服務列表。
2.CAP理論
CAP理論是分布式系統設計中的核心原則,由計算機科學家Eric Brewer于2000年提出,用于描述分布式數據存儲系統在面臨網絡分區時需做出的權衡。其核心觀點為:在一致性(Consistency)、可用性(Availability)、分區容忍性(Partition Tolerance)三者中,最多只能同時滿足兩項。
- 一致性(Consistency) :CAP理論中的一致性,指的是強一致性。所有節點在同一時間具有相同的數據
- 可用性(Availability):保證每個請求都有響應(響應結果可能不對)
- 分區容錯性(Partition Tolerance):當出現網絡分區后,系統仍然能夠對外提供服務
舉一個栗子:一個部門全國各地都有崗位,這時候,總部下發了?個通知,由于通知需要開會周知全員,當有客戶咨詢時:
- 所有成員對客戶的回應結果都是一致的(一致性)
- 客戶咨詢時,?定有回應(可用性)
- 當其中?個成員休假時,這個部門的其他成員也可以對客戶提供咨詢服務(分區容錯性)
CAP 理論告訴我們:
一個分布式系統不可能同時滿足數據?致性。服務可用性和分區容錯性這三個基本需求,最多只能同時滿足其中的兩個.
CP架構:為了保證分布式系統對外的數據?致性,于是選擇不返回任何數據
AP架構:為了保證分布式系統的可用性,節點2返回V0版本的數據(即使這個數據不正確)
更多參考
在分布式系統中,系統間的網絡不能100%保證健康,服務?必須對外保證服務。因此Partition Tolerance不可避免。那就只能在C和A中選擇?個。也就是CP或者AP架構。
正常情況下:
網絡異常:
3.常見的注冊中心
- Zookeeper
Zookeeper的官方并沒有說它是一個注冊中心,但是國內Java體系,大部分的集群環境都是依賴
Zookeeper來完成注冊中心的功能。 - Eureka
Eureka是Netflix開發的基于REST的服務發現框架,主要用于服務注冊,管理,負載均衡和服務故障
轉移。
官方聲明在Eureka2.0版本停止維護,不建議使用。但是Eureka是SpringCloud服務注冊/發現的默認
實現,所以目前還是有很多公司在使用。 - Nacos
Nacos是Spring Cloud Alibaba架構中重要的組件,除了服務注冊,服務發現功能之外,Nacos還支持
配置管理,流量管理,DNS,動態DNS等多種特性。
Eureka 和Zookeeper區別
Eureka和Zookeeper都是用于服務注冊和發現的工具,區別如下:
- Eureka是Netflix開源的項目,而Zookeeper是Apache開源的項目。
- Eureka 基于AP原則,保證高可用,Zookeeper基于CP原則,保證數據?致性。
- Eureka 每個節點 都是均等的,Zookeeper的節點區分Leader 和Followe 或 Observer,也正因為這
個原因,如果Zookeeper的Leader發生故障時,需要重新選舉,選舉過程集群會有短暫時間的不可用
二.Eureka介紹
Eureka是Netflix OSS套件中關于服務注冊和發現的解決方案。Spring Cloud對Eureka進行了集成,并
作為優先推薦方案進行宣傳,雖然目前Eureka 2.0已經停止維護,新的微服務架構設計中,也不再建議使用,但是目前依然有大量公司的微服務系統使用Eureka作為注冊中心。官方文檔
Eureka主要分為兩個部分:
- Eureka Server:作為注冊中心Server端向微服務應用程序提供服務注冊,發現,健康檢查等能力.
- Eureka Client:服務提供者,服務啟動時,會向Eureka Server 注冊自己的信息(IP,端口,服務信息等),Eureka Server 會存儲這些信息
1.搭建Eureka Server 注冊中心
環境搭建和之前類似,就繼續使用上次的文件進行搭建Eureka Server:
*手動添加依賴:
添加配置文件:
server:port: 10010
spring:application:name: eureka-server
eureka:instance:hostname: localhostclient:fetch-registry: false # 表?是否從Eureka Server獲取注冊信息,默認為true.因為這是 ?個單點的Eureka Server,不需要同步其他的Eureka Server節點的數據,這?設置為falseregister-with-eureka: false # 表?是否將??注冊到Eureka Server,默認為true.由于當前應?就是Eureka Server,故?設置為false.service-url:# 設置與Eureka Server的地址,查詢服務和注冊服務都需要依賴這個地址.defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
寫啟動類:
查看Erueka
2.搭建服務注冊
-
加入依賴:
-
修改配置文件:
-
成功后:
3.服務發現
服務發現和服務注冊是一樣配置的,只講述不同的地方:
三.負載均衡LoadBalance
1.問題引入
-
點開services:
-
添加SpringBoot:
-
重命名和設置Modify options:
-
設置VM:
-
再復制一個9092后將兩個都啟動:
發請了多次請求后,只有9090product被使用,其他兩個并沒有參與使用:
此時為了解決這個問題,將代碼重新組織后,就會只有一個product被使用了,這就是負責均衡的作用:
負載均衡:
負載均衡(Load Balance,簡稱 LB), 是高并發,高可用系統必不可少的關鍵組件。當服務流量增大時,通常會采用增加機器的方式進行擴容,負載均衡就是用來在多個機器或者其他資源中,按照?定的規則合理分配負載。
上面的例子中,我們只是簡單的對實例進行了輪詢,但真實的業務場景會更加復雜。比如根據機器的配置進行負載分配,配置高的分配的流量高,配置低的分配流量低等。
服務多機部署時,開發?員都需要考慮負載均衡的實現,所以也出現了一些負載均衡器,來幫助我們實現負載均衡。
2.服務端負載均衡
在服務端進行負載均衡的算法分配。比較有名的服務端負載均衡器是Nginx。請求先到達Nginx負載均衡器,然后通過負載均衡算法,在多個服務器之間選擇?個進行訪問。
3.客戶端負載均衡
在客戶端進行負載均衡的算法分配。把負載均衡的功能以庫的方式集成到客戶端,而不再是由一臺指定的負載均衡設備集中提供。
比如Spring Cloud的Ribbon,請求發送到客戶端,客戶端從注冊中心(比如Eureka)獲取服務列表,在發
送請求前通過負載均衡算法選擇?個服務器,然后進行訪問。
Ribbon是Spring Cloud早期的默認實現,由于不維護了,所以最新版本的Spring Cloud負載均衡集成的
是Spring Cloud LoadBalancer(Spring Cloud官方維護)
4.Spring Cloud LoadBalancer
1).快速上手
- 添加注解:
- 修改遠程調用代碼:
2)負載均衡策略
負載均衡策略是?種思想,無論是哪種負載均衡器,它們的負載均衡策略都是相似的。Spring Cloud
LoadBalancer 僅支持兩種負載均衡策略:輪詢策略 和 隨機策略
- 輪詢(Round Robin):輪詢策略是指服務器輪流處理用戶的請求。這是?種實現最簡單,也最常?的
策略。 - 隨機選擇(Random):隨機選擇策略是指隨機選擇?個后端服務器來處理新的請求。
3)自定義負載均衡策略
Spring Cloud LoadBalancer 默認負載均衡策略是 輪詢策略,實現是 RoundRobinLoadBalancer,如果
服務的消費者如果想采用隨機的負載均衡策略,也非常簡單。(參考官網地址)
4)LoadBalancer 原理
LoadBalancer 的實現,主要是 LoadBalancerInterceptor,這個類會對 RestTemplate 的請求進行攔截,然后從Eureka根據服務id獲取服務列表,隨后利用負載均衡算法得到真實的服務地址信息,替換服務id。
通過intercept方法進行攔截:
進入execute方法:
進入choose:
繼續進入choose:
隨機實現:
getInstanceResponse方法:
隨機下標:
輪詢:
5)服務部署
- 部署MySQL
- 數據初始化
- 修改配置文件(dev和prod環境)
- 打包(每一個都要打包Erueka、order、product)
- 上傳jar包,三個都要上傳,第一次上傳需要安裝Lrzsz,命令:apt install lrzsz
- 啟動實例:
- 在云服務器 的安全組或者防火墻上開通端口號
- 通過公網訪問Erueka和之前的order
四.Nacos
1.安裝
下載地址
二選一即可:
1)window環境
Nacos的啟動模式是默認的集群模式,需要通過startup.cmd文件來改成單機模式:
改完后啟動startup.cmd文件:
通過127.0.0.1:8848:nacos進入:
如果此時8848的端口號被占用,使用cmd命令框進行查找該端口號的進程并且殺死該進程,或者通過修改Nacos的端口號:
35436就是進程ID:
通過紅框命令殺死進程:
修改端口號的話,先進入conf的文件:
打開properties的這個文件:
修改此處的端口號即可:
2)Linux環境
-
在Linux上創建自己的目錄:
-
直接將下載好的zip文件拖到Linux中后,在輸入:unzip 壓縮文件名進行解壓,但是在第一次進行壓縮時需要先安裝unzip安裝的命令:apt-get install unzip:
-
修改端口號:
-
后續就是將nacos設置成單機模式,通過命令:bash startup.sh -m standalone進入后,修改為單機模式,如果能進入nacos的頁面,則代表成功了:
2.快速上手
- 在父項目中引入Spring-Cloud- Alibaba依賴
<properties>
<spring-cloud-alibaba.version>2022.0.0.0-RC2</spring-cloud-alibaba.version>
</properties>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
- 子項目加上nacos和LoadBalance的依賴:
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>
- 修改配置,使用nacos服務器地址
spring:application:name: cloud:nacos:discovery:server-addr: 110.41.51.65:10020
-
啟動之前的訂單和產品類(需將之前Erueka的配置和依賴刪去,不然會和nacos沖突),啟動后nacos的網頁服務列表中就會出現信息
-
測試
五.Nacos負載均衡
1.服務器下線
點擊下方紅色框進入服務器詳情:
其中有下線操作,直接點擊下線操作后,這個服務器之后就不會接收請求了,請求被其他兩個服務器進行接收:
通過編輯修改服務器的權重:
想使用到這個權重,需要訂單order的項目在配置文件中配置nacos的負載均衡策略:
cloud:loadbalancer:nacos:enabled: true
測試:
修改權重報錯
windows環境下直接刪除data下的protocol文件,Linux環境的話,也是找到對應的文件刪除即可:
2.同集群優先訪問
Nacos把同一個機房內的實例,劃分為一個集群。所以同集群優先訪問,在一定程度上也可以理解為同機房優先訪問。
微服務架構中,一個服務通常有多個實例共同提供服務,這些實例可以部署在不同的機器上,這些機器可以分布在不同的機房,比如product-service:
實例1:分布在上海機房
實例2:分布在上海機房
實例3:分布在北京機房
實例4:分布在北京機房
微服務訪問時,應盡量訪問同機房的實例。當本機房內實例不可用時,才訪問其他機房的實例。比如order-service 在上海機房,product-service 在北京和上海機房都有實例,那我們希望可以優先訪問上海機房,如果上海機房沒有實例,或者實例不可用,再訪問北京機房的實例。通常情況下,因為同一個機房的機器屬于一個局域網,局域網訪問速度更快一點.
配置集群的名稱
cloud:nacos:discovery:server-addr: 1.95.194.117:8848cluster-name: BJ
其他端口號的Product服務器也需要更改:
復制后,再粘貼上去
此時只有9090的Product的服務器才能接收,其他都接收不到:
如果此時9090下線后,其他另一個集群的機器就能夠接收了:
3.健康檢查
兩種健康檢查機制:
Nacos作為注冊中心,需要感知服務的健康狀態,才能為服務調用方提供良好的服務。Nacos 中提供了兩種健康檢查機制:
客戶端主動上報機制:
- 客戶端通過心跳上報方式告知服務端(nacos注冊中心)健康狀態,默認心跳間隔5秒;
- nacos會在超過15秒未收到心跳后將實例設置為不健康狀態,超過30秒將實例刪除
服務器端反向探測機制: - nacos主動探知客戶端健康狀態,默認間隔為20秒
- 健康檢查失敗后實例會被標記為不健康,不會被立即刪除
nacos服務器實例
Nacos的服務實例(注冊的節點)分為臨時實例和非臨時實例
- 臨時實例:如果實例宕機超過一定時間,會從服務列表剔除,默認類型.
- 非臨時實例:如果實例宕機,不會從服務列表剔除,也可以叫永久實例
Nacos對臨時實例,采取的是 客戶端主動上報機制,對非臨時實例,采取服務器端反向探測機制。
配置?個服務實例為永久實例
spring:cloud:nacos:discovery:ephemeral: false # 設置為?臨時實例
修改實例是永久性還是非永久性,無法在原先的基礎上進行修改,只能將之前的protocol文件中的raft刪除后,進行修改:
先進入nacos文件中:
再找到nacos的進程ID,殺死后,才能進行修改,修改后再重新啟動nacos進程:
此時才能夠成功重啟Order項目:
關閉Order項目的啟動類后,健康狀態為false,但是不會立刻刪除實例:
4.環境隔離
企業開發中,一個服務會分為開發環境,測試環境和生產環境。
- 開發環境:開發?員用于開發的服務器,是最基礎的環境。一般日志級別設置較低,可能會開啟?些
調試信息。 - 測試環境:測試人員用來進行測試的服務器,是開發環境到生產環境的過渡環境。
- 生產環境:正式提供對外服務的環境,通常關掉調試信息。
通常情況下,這幾個環境是不能互相通信的。Nacos提供了namespace(命名空間)來實現環境的隔離。不同的namaspace的服務不可見。
創建環境
-
在nacos的頁面上的命名空間中進行新建:
-
通過命名空間的id來加入到項目的配置文件中即可:
spring:cloud:nacos:discovery:namespace: 51152a13-7911-49e3-bbdc-16fd5670a257
- 重啟order項目(在重啟之前將實例永久性的配置刪去,并按照上述的方法刪除對應的文件后,重啟nacos,再進行重啟order項目):
- 環境不同是沒辦法進行遠程調用的:
- 將prodcut也放入同樣的環境當中就可以使用了:
六.Nacos的配置中心
除了注冊中心和負載均衡之外,Nacos還是?個配置中心,具備配置管理的功能。Namespace 的常用場景之一是不同環境的配置區分隔離。例如開發測試環境和生產環境的配置隔離.
1.配置中心的需求
當前項目的配置都在代碼中,會存在以下問題:
- 配置文件修改時,服務需要重新部署。微服務架構中,一個服務可能有成百個實例,挨個部署比較麻煩,且容易出錯。
- 多人開發時,配置文件可能需要經常修改,使用同一個配置文件容易沖突。配置中心就是對這些配置項進行統一管理。通過配置中心,可以集中查看,修改和刪除配置,無需再逐個修改配置問件。提高效率的同時,也降低了出錯的風險
3. 服務啟動時,從配置中心讀取配置項的內容,進行初始化。
4. 配置項修改時,通知微服務,實現配置的更新加載。
2.快速上手
-
添加配置
-
product-service中引入依賴
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- SpringCloud 2020.*之后版本需要引?bootstrap-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
- 在product-service的項目中添加一個bootstrap.properties配置文件
spring:application:name: product-servicecloud:nacos:config:server-addr: nacos網頁URL
- 寫一個Controller獲取nacos配置項中的nacos.config值:
@RestController
public class NacosController {@Value("${nacos.config}")private String nacosConfig;@RequestMapping("/getConfig")public String getConfig() {return "從Nacos獲取配置項nacos.config: " + nacosConfig;}
}
- 如果添加一個@RefreshScope注解,此時就會跟隨nacos的配置文件里面的內容一起更新:
3.配置中心詳解
配置中心的配置都在bootstrap.yml文件中,此時再bootstrap中加入命名空間的id,就能獲取對應配置的信息:
data id說明
啟動類時,增加了三個監聽,此時可以通過nacos管理頁面中添加三個配置來進行查看:
最先讀取的是:
此時刪除這個配置項后觀察其他兩個的優先級:
此時是product-service.properties:
最后只剩下一個則是最低的優先級:
4.部署nacos
Product-Service項目的POM文件:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>spring-cloud-nacos</artifactId><groupId>org.example</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>product-service</artifactId><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId></dependency><!--mybatis--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-loadbalancer</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency><!-- SpringCloud 2020.*之后版本需要引?bootstrap--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId></dependency></dependencies><profiles><profile><id>dev</id><properties><profile.name>dev</profile.name></properties></profile><profile><id>prod</id><properties><profile.name>prod</profile.name></properties></profile></profiles><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins><resources><resource><directory>src/main/resources</directory><filtering>true</filtering><includes><include>**/**</include></includes></resource></resources></build></project>
Product-Service的yml配置文件:
dev環境:
server:port: 9090
spring:datasource:url: jdbc:mysql://127.0.0.1:3306/cloud_product?characterEncoding=utf8&useSSL=falseusername: rootpassword: "071711"driver-class-name: com.mysql.cj.jdbc.Drivercloud:nacos:discovery:server-addr: 1.95.194.117:8848
# cluster-name: BJ
# namespace: 8a61ef37-2daa-402f-8b1d-5363629c5c87 #服務管理的命名空間# 設置 Mybatis 的 xml 保存路徑
mybatis:configuration: # 配置打印 MyBatis 執行的 SQL
# log-impl: org.apache.ibatis.logging.stdout.StdOutImplmap-underscore-to-camel-case: true #自動駝峰轉換
prod環境:
server:port: 9090
spring:datasource:url: jdbc:mysql://127.0.0.1:3306/cloud_product?characterEncoding=utf8&useSSL=falseusername: rootpassword: 云服務器上數據庫密碼driver-class-name: com.mysql.cj.jdbc.Drivercloud:nacos:discovery:server-addr: 1.95.194.117:8848
# cluster-name: BJ
# namespace: 8a61ef37-2daa-402f-8b1d-5363629c5c87 #服務管理的命名空間# 設置 Mybatis 的 xml 保存路徑
mybatis:configuration: # 配置打印 MyBatis 執行的 SQL
# log-impl: org.apache.ibatis.logging.stdout.StdOutImplmap-underscore-to-camel-case: true #自動駝峰轉換
普通yml:
spring:application:name: product-serviceprofiles:active: @profile.name@cloud:nacos:config:server-addr: 1.95.194.117:8848
# namespace: 8a61ef37-2daa-402f-8b1d-5363629c5c87 #配置中心的命名空間
Order-Service的pom文件:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>spring-cloud-nacos</artifactId><groupId>org.example</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>order-service</artifactId><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId></dependency><!--mybatis--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-loadbalancer</artifactId></dependency></dependencies><profiles><profile><id>dev</id><properties><profile.name>dev</profile.name></properties></profile><profile><id>prod</id><properties><profile.name>prod</profile.name></properties></profile></profiles><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
dev的yml文件:
spring:datasource:url: jdbc:mysql://127.0.0.1:3306/cloud_order?characterEncoding=utf8&useSSL=falseusername: rootpassword: "071711"driver-class-name: com.mysql.cj.jdbc.Driver
prod的yml文件:
spring:datasource:url: jdbc:mysql://127.0.0.1:3306/cloud_order?characterEncoding=utf8&useSSL=falseusername: rootpassword: driver-class-name: com.mysql.cj.jdbc.Driver
普通的yml文件:
server:port: 8080
spring:application:name: order-serviceprofiles:active: @profile.name@cloud:nacos:discovery:server-addr: 1.95.194.117:8848
# cluster-name: BJ
# ephemeral: false #非臨時實例
# namespace: 8a61ef37-2daa-402f-8b1d-5363629c5c87loadbalancer:nacos:enabled: true
# 設置 Mybatis 的 xml 保存路徑
mybatis:configuration: # 配置打印 MyBatis 執行的 SQL
# log-impl: org.apache.ibatis.logging.stdout.StdOutImplmap-underscore-to-camel-case: true #自動駝峰轉換
打包上傳云服務器:
后臺啟動:
成功:
七.Nacos與Eureka的區別
1.共同點
都支持服務注冊和服務拉取
2.區別
- 功能
Nacos除了服務發現和注冊之外,還提供了配置中心,流量管理和DNS服務等功能。 - CAP理論
Eureka遵循AP原則,Nacos可以切換AP和CP模式,默認AP。
Nacos 根據配置識別CP或者AP模式。如果注冊Nacos的Client的節點是臨時節點,那么Nacos對這個
Client節點的效果就是AP,反之是CP。AP和CP可以同時混合存在。 - 服務發現
Eureka:基于拉模式。Eureka Client會定期從Server拉取服務信息,有緩存,默認每30秒拉取?次。
Nacos:基于推送模式。服務列表有變化時實時推送給訂閱者,服務端和客戶端保持心跳連接.
Nacos: