Nacos真香,從零到一學起來
本文轉(zhuǎn)載自微信公眾號「程序員jinjunzhu」,作者jinjunzhu。轉(zhuǎn)載本文請聯(lián)系程序員jinjunzhu公眾號。
Nacos是阿里巴巴開源的微服務管理平臺,可以幫助開發(fā)者快速實現(xiàn)動態(tài)服務發(fā)現(xiàn)、服務配置、服務元數(shù)據(jù)及流量管理。
這篇文章主要來講一下Nacos作為配置中心和注冊中心的使用。
1 安裝
1.1 linux下安裝
首先搭建一套單機版的Nacos集群。Nacos的安裝有兩種方式,一種是下載源碼自己編譯安裝,另一種是下載編譯后的壓縮包解壓后直接使用。
本文我采用第二種方式。
首先從官網(wǎng)下載安裝包,下載地址如下:
- https://github.com/alibaba/nacos/releases/tag/2.0.2
linux下安裝可能會遇到環(huán)境變量的問題,可以參考這篇文章[1]。如果還不行,執(zhí)行下面兩個命令重新安裝:
- yum erase java-1.* #刪除原來的jdk
- yum install java-1.8.0-openjdk* -y #重新安裝jdk
jdk沒有問題后,啟動Nacos,啟動日志如下:
- [root@master bin]# sh startup.sh -m standalone
- /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.292.b10-1.el7_9.x86_64/bin/java -Xms512m -Xmx512m -Xmn256m -Dnacos.standalone=true -Dnacos.member.list= -Djava.ext.dirs=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.292.b10-1.el7_9.x86_64/jre/lib/ext:/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.292.b10-1.el7_9.x86_64/lib/ext -Xloggc:/root/nacos/logs/nacos_gc.log -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M -Dloader.path=/root/nacos/plugins/health,/root/nacos/plugins/cmdb -Dnacos.home=/root/nacos -jar /root/nacos/target/nacos-server.jar --spring.config.additional-location=file:/root/nacos/conf/ --logging.config=/root/nacos/conf/nacos-logback.xml --server.max-http-header-size=524288
- nacos is starting with standalone
- nacos is starting,you can check the /root/nacos/logs/start.out
1.2 可視化界面
瀏覽器輸入下面地址:
- http://192.168.59.151:8848/nacos/index.html#/login
登錄界面如下:
賬號/密碼:nacos/nacos,登錄成功后如下圖:
2 配置中心
Nacos可以方便地跟Spring、SpringBoot、SpringCloud、Docker、Dubbo、k8s等整合,本文主要使用SpringCloud來整合Nacos。
2.1 代碼配置
1. 在配置文件中加入下面的依賴:
- <dependency>
- <groupId>com.alibaba.cloud</groupId>
- <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
- <version>${latest.version}</version>
- </dependency>
根據(jù)官網(wǎng)介紹,這里的 latest.version 對應 springboot 版本,比如 Nacos 2.1.x.RELEASE 版本對應 SpringBoot 2.1.x 版本,Nacos 2.0.x.RELEASE 版本對應 SpringBoot 2.0.x 版本。但x這個子版本號不一定要完全匹配,上面latest.version我本地SpringBoot使用2.1.6,Nacos使用2.1.4。
2. 添加一個bootstrap.properties文件,跟SpringBoot的配置文件放在一個目錄下,在這個文件中增加下面配置:
- #Nacos server地址
- spring.cloud.nacos.config.server-addr=192.168.59.151:8848
- #配置前綴,如果不配置,默認是spring.application.name
- spring.cloud.nacos.config.prefix=example
- #dataId后綴
- spring.cloud.nacos.config.file-extension=properties
在SpringCloud整合Nacos時,Nacos的dataId完整格式如下:
- ${prefix}-${spring.profiles.active}.${file-extension}
這里有兩點需要注意:
- spring.profiles.active即為當前環(huán)境對應的 profile
當 spring.profiles.active 為空時,對應的連接符-也將不存在,dataId的拼接格式變成 ${prefix}.${file-extension}
- file-exetension為配置內(nèi)容的數(shù)據(jù)格式,目前只支持properties和yaml類型。
上面的配置,對應的 dataId 為 example-dev.properties。
2.2 測試配置
如果要實現(xiàn)配置自動刷新,只需要在代碼類上加一個注解@RefreshScope,如下面這段代碼來自官網(wǎng):
- @Controller
- @RequestMapping("config")
- @RefreshScope
- public class ConfigController {
- @Value("${useLocalCache:false}")
- private boolean useLocalCache;
- @RequestMapping(value = "/get", method = GET)
- @ResponseBody
- public boolean get() {
- return useLocalCache;
- }
- }
這時往Nacos寫入一個配置,命令如下:
- curl -X POST "http://192.168.59.151:8848/nacos/v1/cs/configs?dataId=example-dev.properties&group=DEFAULT_GROUP&content=useLocalCache=true"
這時進入Nacos頁面,可以看到上面插入的配置,如下圖:
點擊"詳情",可以看到配置數(shù)據(jù),如下圖:
這時如果使用api調(diào)用上面ConfigController的get方法,會返回true。如果使用下面的命令修改useLocalCache的值,再次調(diào)用get方法,會返回false。
- curl -X POST "http://192.168.59.151:8848/nacos/v1/cs/configs?dataId=example-dev.properties&group=DEFAULT_GROUP&content=useLocalCache=false"
點擊下圖的示例代碼,可以看到獲取配置的代碼,也就是上面Controller的代碼。
3 注冊中心
3.1 配置服務提供者
1. 在pom文件中增加配置,如下:
- <dependency>
- <groupId>com.alibaba.cloud</groupId>
- <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
- <version>${latest.version}</version>
- </dependency>
根據(jù)官網(wǎng)介紹,這里的latest.version對應springboot版本,比如Nacos 2.1.x.RELEASE版本對應SpringBoot 2.1.x版本,Nacos 2.0.x.RELEASE版本對應SpringBoot 2.0.x版本。這里我本地SpringBoot使用2.1.6,上面latest.version使用2.1.4。
2. 在application.properties中增加下面配置:
- spring.cloud.nacos.discovery.server-addr=192.168.59.151:8848
3. 在SpringBoot啟動類上加上注解@EnableDiscoveryClient。
4. 為了區(qū)分服務名稱,配置服務名稱如下:
- spring.application.name=springboot-producer
3.2 配置服務調(diào)用者
跟服務提供者配置類似,這里修改配置名稱如下:
spring.application.name=springboot-consumer
3.3 測試
啟動上面兩個服務,登錄Nacos頁面,可以看到兩個服務已經(jīng)注冊到Nacos。
在springboot-producer中增加一個Controller,代碼如下:
- @Controller
- @RequestMapping("/producer")
- public class FeignTestController {
- @RequestMapping("/result")
- @ResponseBody
- public String getResult() throws InterruptedException {
- return "success";
- }
- }
在springboot-consumer中增加Feign調(diào)用,如下:
- @FeignClient(value = "springboot-producer", configuration = FeignMultipartSupportConfig.class)
- public interface FeignAsEurekaClient {
- @GetMapping("/producer/result")
- String feignReadTimeout();
- }
啟動測試類,調(diào)用成功,返回"success"。
4 一個問題
由于我本地應用使用的數(shù)據(jù)庫連接池是Hikaricp,修改配置中心的配置,通知本地應用時會報notify-error,日志上看是綁定數(shù)據(jù)庫參數(shù)失敗。這里應該改成druid連接池就可以了,有待驗證。