一、Nacos是什么?
一個更易於構建雲原生應用的動態服務發現、配置管理和服務管理平台,它是注冊中心和配置中心的組合,提供了服務發現和服務健康檢查、動態配置管理、動態 DNS 服務、服務和元數據管理幾大功能,同時支持負載均衡功能,具有Eureka+Config+Bus的功能。這些組件的功能和使用方式在本專題其他章節有詳細介紹,此處不再贅述。Ncaos與其他注冊中心工具的對比如下:
以下是nacos生態全景圖:
二、Nacos替代Eureka做服務注冊中心
1、下載安裝:去https://github.com/alibaba/nacos/releases下載,下載完成后直接解壓安裝包,運行bin目錄下startup.cmd,運行成功后直接訪問http://localhost:8848/nacos即可展示登錄頁面(默認賬號密碼nacos)。要注意的是安裝前需要本地Java8和Maven環境已經安裝好。
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。
e.完成以上配置后需要修改服務模塊中指向nacos的地址為nginx服務器的地址。到此整個集群架構搭建完成。