Springcloudalibaba之Nacos服務註冊和配置中心
一、Nacos是什麼?
一個更易於構建雲原生應用的動態服務發現、配置管理和服務管理平臺,它是註冊中心和配置中心的組合,提供了服務發現和服務健康檢查、動態配置管理、動態 DNS 服務、服務和元資料管理幾大功能,同時支援負載均衡功能,具有Eureka+Config+Bus的功能。這些元件的功能和使用方式在本專題其他章節有詳細介紹,此處不再贅述。Ncaos與其他註冊中心工具的對比如下:
以下是nacos生態全景圖:
二、Nacos替代Eureka做服務註冊中心
1、下載安裝:去https://github.com/alibaba/nacos/releases下載,下載完成後直接解壓安裝包,執行bin目錄下startup.cmd,執行成功後直接訪問
2、建立微服務模組:
a.父工程引入Springcloudalibaba的jar包。
<! --spring cloud alibabg 2.1.0.RELEASE--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2.1.0.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency>
b.子模組引入nacos的jar包。
<dependency> <groupId>comlibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
c.配置yml檔案,註冊到nacos註冊中心和暴露監控端點。
server: port: 9001 spring: application: name: nacos-test-provider cloud: nacps: discovery: server-addr: localhost:8848 #配置Nacos服務註冊中心地址 management: endpoints: web: exposure: include: "*"
如果微服務是消費者,還需要在yml中配置呼叫的微服務名稱地址,配置如下:
#消費者將要去訪間面微服務名稱(註冊成功進nacos的微服務提供者)
iservice-url:
nacos-user-service: http://nacos-test-provider
d.主啟動類上增加@EnableDiscoveryClient註解。
e.完成以上abc三步,基礎的微服務模組搭建完成,接下來在服務提供者中編寫服務介面程式碼和在消費者中編寫呼叫程式碼,示例程式碼如下:
/*微服務消費者呼叫程式碼*/ @Restcontroller public class ConsumerController { @Resource private RestTemplate restTemplate; @value("${service-url.nacos-user-service}") private string serverURL; @GetMapping(value = "/consumer/nacos/{id}") public string getInfo(@Pathvariable("id") Long id) { return restTemplate.getForobject(serverURL+"/provider/nacos/"+id,String.class); } }
/*微服務提供者介面程式碼*/ @Restcontroller public class Providercontroller { value("${server.port}") private string serverPort; @GetMapping(value = "/provider/nacos/{id}") public string getTest(@Pathvariable("id") Integer id) { return"我是微服務提供者,id="+id; } }
e.消費者通過微服務名稱來呼叫提供者時,因為叢集會有多個相同的微服務名稱,會出現呼叫不明確的情況而報錯,因此需要賦予RestTemplate負載均衡能力,實現方式是在消費者的ApplicationContextConfig配置檔案的getRestTemplet()下增加@LoadBalanced註解。
@Configuration public class Applicationcontextconfig { @Bean @LoadBalanced public RestTemplate getRestTemplate() { return new RestTemplate(); } }
三、Nacos替代Config做服務配置中心
Config配置中心的配置檔案通常是儲存在git上的,而Nacos本身則提供了配置中心儲存管理的功能,支援基礎配置和分類配置。ncaos的配置中心設計思想與Config一樣(請參考微服務之配置中心Config),在專案初始化時需要先從配置中心拉取配置來正常啟動專案。
1、安裝nacos,參考前一節安裝過程。
2、建立微服務模組:
a.引入jar包。
<! --nacos-config-->
<dependency> <grouprd>com.alibaba.cloud</groupld> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
b.配置bootstrap.yml檔案和application.yml檔案。
server: port: 9001 spring:
application: name: nacos-config-provider cloud: nacps: config: server-addr: localhost:8848 #配置Nacos服務配置中心地址 file-extension: yaml #指定yaml格式的配置檔案 (nacos預設配置檔案格式為{spring.application.name}-{spring.profile.active}.{spring.cLoud.nacos.config.file-extension},即 “服務名稱-執行環境.配置副檔名” ) management: endpoints: web: exposure: include: "*"
spring:
profiles:
active:dev #配置執行環境,這裡表示開發環境,一般為dev、test、prod等
c.主啟動類上增加@EnableDiscoveryClient註解。
d.編寫獲取配置檔案的程式碼。
@Restcontroller @Refreshscope //支援Nacos,的動態重新整理功能 public class Configclientcontroller { @value("${config.info}") private string configinfo; @GetMapping("/config/info") public string getconfigInfo() { return configInfo; } }
e.在nacos後臺頁面新增nacos-config-client-dev.yml檔案(nacos預設配置檔案格式為{spring.application.name}-{spring.profile.active}.{spring.cLoud.nacos.config.file-extension},即 “服務名稱-執行環境.配置副檔名” ),並寫入內容。如圖
經過以上步驟,我們啟動服務就可以通過訪問getconfigInfo()方法獲取到配置檔案資訊了,nacos支援自帶動態重新整理功能。
2、分類配置
分類配置主要是用於多專案多環境管理,分類配置中存在Namespace、Group、Cluster的概念,Nacos預設的名稱空間是public,Namespace主要用來實現隔離。Group預設是DEFAULT_GROUP,Group可以把不同的微服務劃分到同一個分組裡面去。一個Service可以包含多個Cluster(叢集),Nacos預設Cluster是DEFAULT,Cluster是對指定微服務的一個虛擬劃分。
實現分組配置:在nacos配置中心頁面建立配置檔案時寫上分組名稱,然後修改bootstrap.yml檔案中nacos.config.group=分組名稱。
實現名稱空間配置:在nacos配置中心建立名稱空間,記錄下名稱空間ID,然後修改bootstrap.yml檔案中nacos.config.namespace=ID。
如果不配置分組或者名稱空間,nacos查詢配置檔案時會在預設分組或者預設名稱空間下查詢。
四、 Nacos理論AP和CP的選擇
nacos支援ap和cp兩種理論模式,通常來說:
如果不需要儲存服務級別的資訊且服務例項是通過nacos-cient註冊,並能夠保持心跳上報,那麼就可以選擇AP模式。當前主流的服務如Spring cloud 和Dubbo服務,都適用於AP模式,AP模式為了服務的可能性而減弱了一致性,因此AP模式下只支援註冊臨時例項。
如果需要在服務級別編輯或者儲存配置資訊,那麼CP是必須,K8S服務和DNS服務則適用於CP模式。CP模式下則支援註冊持久化例項,此時則是以Raft協議為叢集執行模式,該模式下注冊例項之前必須先註冊服務,如果服務不存在,則會返回錯誤。
切換ap、cp模式的方式:
curl -X PUT '$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP'
五、Nacos叢集
預設nacos使用嵌入式資料庫來實現資料的儲存,如果要進行叢集需要採用集中式的方式來支援叢集化部署,目前nacos只支援MySQL資料庫。nacos支援三種部署方式:單機模式、叢集模式、多叢集模式。單機模式用於測試,叢集模式用於生產,多叢集模式用於多資料中心。Nacos自帶的嵌入式資料庫是derby,可以切換為Mysql,以下是nacos叢集架構圖
1、配置nacos到mysql資料庫
a.建立nacos的mysql資料庫:在nacos/conf下找到nacos-mysql.sql檔案複製程式碼到mysql資料庫中去執行即可產生nacos_config資料庫。
b.配置nacos到mysql資料庫連線:在nacos/conf下找到application.properties檔案,加入如下配置程式碼後重啟nacos。
spring.datasource.platform=mysql db.num=1 db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root db. password=123456
2、叢集配置步驟
a.安裝nacos-server到Linux系統,官方推薦使用Linux做叢集部署,並且至少使用3個nacos叢集節點。
b.安裝mysql資料庫到Linux系統,配置nacos到mysql的連線,官方推薦使用高可用的mysql或者使用mysql叢集。
c.在nacos/conf下找到cluster.conf檔案,開啟輸入前面安裝的nacos-server地址集合,例如
192.168.0.101:3333 192.168.0.102:3333 192.168.0.103:3333
d.配置nginx伺服器,由它來作為負載均衡伺服器,在nginx.conf中upstream nacoscluster節點上加入以上nacos地址,將location.proxy_pass指向 http://nacoscluster。啟動nginx訪問nginx伺服器地址即可。