一、環境安裝配置
下載下傳位址:
https://github.com/alibaba/nacos/releases/tag/1.1.4
# 解壓
tar -zxvf nacos-server-1.4.1.tar.gz
單機啟動nacos
sh startup.sh -m standalone
nacos管理頁面
http://xxx:8848/nacos
二、nacos服務提供者
pom.xml
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
application.yaml
spring:
application:
name: nacos-payment-provider
cloud:
nacos:
discovery:
server-addr: 192.168.137.200:8848
management:
endpoints:
web:
exposure:
include: '*'
啟動類
添加@EnableDiscoveryClient
controller
package com.fox.springcloud.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class EchoController {
@Value("${server.port}")
private String serverPort;
@GetMapping(value = "/echo/{id}")
public String echo(@PathVariable Long id) {
return "Hello Nacos Discovery " + serverPort + ",id:" + id;
}
}
三、nacos服務消費者
pom.xml
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
application.yaml
spring:
application:
name: nacos-order-consumer
cloud:
nacos:
discovery:
server-addr: 192.168.137.200:8848
# 消費者将要去通路的微服務名稱(注冊進nacos的微服務提供者
service-url:
nacos-user-service: http://nacos-payment-provider
啟動類
添加@EnableDiscoveryClient
配置類注冊RestTemplate
package com.fox.springcloud.config;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
controller
package com.fox.springcloud.controller;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
@RestController
@Slf4j
public class OrderNacosController {
@Resource
private RestTemplate restTemplate;
@Value("${service-url.nacos-user-service}")
private String serviceUrl;
@GetMapping(value = "/consumer/echo/{id}")
public String callEcho(@PathVariable Long id){
return restTemplate.getForObject(serviceUrl + "/echo/" + id, String.class);
}
}
四、nacos作為注冊中心
官方文檔:https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html
服務注冊中心對比
使用nacos作為注冊中心
pom.xml
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
application.yaml
spring:
profiles:
active: dev
bootstrap.yaml
server:
port: 3377
spring:
application:
name: nacos-config-client
cloud:
nacos:
discovery:
server-addr: 192.168.137.200:1111
namespace: bcf9672b-31d0-43e1-8840-89974d05c4d0
config:
server-addr: 192.168.137.200:1111
file-extension: yaml
namespace: bcf9672b-31d0-43e1-8840-89974d05c4d0
group: groupA
discovery.namespace服務注冊名稱空間
config.namespace注冊中心配置名稱空間
config.group注冊中心配置分組
啟動類
添加@EnableDiscoveryClient
controller
package com.fox.springcloud.controller;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@Slf4j
@RefreshScope
@RestController
public class ConfigClientController {
@Value("${config.info}")
private String configInfo;
@GetMapping("/payment/configInfo")
public String configInfo(){
return configInfo;
}
}
Data ID命名規則
${spring.application.name}-{$spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
持久化
nacos增加了支援mysql資料源能力,具體的操作步驟:
- 安裝資料庫,版本要求:5.6.5+
- 初始化mysq資料庫,資料庫初始化檔案: conf/nacos-mysql.sql
- 修改conf/application.properties檔案,增加支援mysql資料源配置(目前隻支援mysql),添加mysql資料源的url、使用者名和密碼。
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://ip:端口/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=roo
db.password=xxx
nacos叢集
服務架構
修改nacos startup.sh啟動腳本
修改後startup.sh
......
while getopts ":m:f:s:p:" opt
do
case $opt in
m)
MODE=$OPTARG;;
f)
FUNCTION_MODE=$OPTARG;;
s)
SERVER=$OPTARG;;
p)
PORT=$OPTARG;;
?)
echo "Unknown parameter"
exit 1;;
esac
done
......
# start
echo "$JAVA ${JAVA_OPT}" > ${BASE_DIR}/logs/start.out 2>&1 &
nohup $JAVA -Dserver.port=${PORT} ${JAVA_OPT} nacos.nacos >> ${BASE_DIR}/logs/start.out 2>&1 &
echo "nacos is starting,you can check the ${BASE_DIR}/logs/start.out"
cluster.conf配置叢集
192.168.137.200:3333
192.168.137.201:3333
192.168.137.202:3333
啟動nacos
指定端口方式啟動nacos服務
nginx安裝配置
nginx安裝後預設路徑為/usr/local/nginx/
修改nginx.conf
......
upstream cluster{
server 192.168.137.200:3333;
server 192.168.137.201:3333;
server 192.168.137.202:3333;
}
server {
listen 1111;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
proxy_pass http://cluster;
}
......
nginx指定配置檔案啟動
./nginx -c /usr/local/nginx/conf/nginx.conf
登入nacos管理頁面
http://192.168.137.200:1111/nacos
問題一:centos啟動nacos失敗
報錯資訊:
2021-06-22 16:25:23,437 ERROR read cluster conf fail
java.io.FileNotFoundException: /data/opt/nacos/conf/cluster.conf (沒有那個檔案或目錄)
at java.io.FileInputStream.open0(Native Method)
at java.io.FileInputStream.open(FileInputStream.java:195)
at java.io.FileInputStream.<init>(FileInputStream.java:138)
at com.alibaba.nacos.core.utils.SystemUtils.readClusterConf(SystemUtils.java:124)
at com.alibaba.nacos.core.listener.StartingSpringApplicationRunListener.logClusterConf(StartingSpringApplicationRunListener.java:141)
at com.alibaba.nacos.core.listener.StartingSpringApplicationRunListener.contextPrepared(StartingSpringApplicationRunListener.java:91)
at org.springframework.boot.SpringApplicationRunListeners.contextPrepared(SpringApplicationRunListeners.java:60)
at org.springframework.boot.SpringApplication.prepareContext(SpringApplication.java:374)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:314)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1260)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1248)
at com.alibaba.nacos.Nacos.main(Nacos.java:33)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48)
at org.springframework.boot.loader.Launcher.launch(Launcher.java:87)
at org.springframework.boot.loader.Launcher.launch(Launcher.java:50)
at org.springframework.boot.loader.PropertiesLauncher.main(PropertiesLauncher.java:593)
因為預設啟動的是叢集模式
使用單節點模式啟動
sh startup.sh -m standalone
問題二:啟動加載配置中心配置報錯
2021-08-11 07:14:05.727 ERROR 7880 --- [ac-01c5fa911e59] c.a.c.n.c.NacosPropertySourceBuilder : parse data from Nacos error,dataId:nacos-config-client-dev.yaml,data:config:
info: nacos config center,namespaces: gdgs, group:groupA,version=2,
org.yaml.snakeyaml.scanner.ScannerException: mapping values are not allowed here
in 'reader', line 2, column 39:
... : nacos config center,namespaces: gdgs, group:groupA,version=2
報錯原因:配置資訊的value值中有冒号+空格,nacos解析鍵值對的時候會出錯,nacos配置頁面其實也用顔色提示了使用者
解決方案:字元串中有:的地方後面不要加空格