Nacos中文文档
Nacos:一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
简而言之就是注册中心+配置中心的组合,功能实现等于Eureka+Config+Bus
下载地址
官网会是在github上,下载根本下不动.这里直接去码云上下载
https://gitee.com/mirrors/Nacos.git
使用GIt软件克隆该项目
git bash clone https://gitee.com/mirrors/Nacos.git
进入下载目录的distribution文件夹,我这里的目录是E:\nacos-server\Nacos\distribution
然后cmd,输入mvn -Prelease-nacos -DskipTests clean install -U
之后就会打包成功,出现一个target文件夹
打包后进入target就可以看到
进入以下目录可以看到一个startup.cmd
命令行运行 startup.cmd即可开启
输入网址http://localhost:8848/nacos/ 进入nacos界面,初始账号密码都是nacos
Sping Alibaba官方文档
Nacos中文文档
每一步在官方文档上都有说明,要多看官方文档
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-alibaba-dependenciesartifactId>
<version>2.1.0.RELEASEversion>
<type>pomtype>
<scope>importscope>
dependency>
创建子模块cloudalibaba-provider-payment9001,cloudalibaba-provider-payment9002
<dependencies>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-actuatorartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-devtoolsartifactId>
<scope>runtimescope>
<optional>trueoptional>
dependency>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<optional>trueoptional>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
dependency>
dependencies>
server:
port: 9001
spring:
application:
name: nacos-provider-service
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848 #往nacos进行注册
#server-addr: http://localhost:8848会出错
management:
endpoints:
web:
exposure:
include: * #暴露所有端点
java.lang.IllegalStateException: failed to req API:/nacos/v1/ns/instance after all servers([http://localhost:884]) tried: failed to req API:http://localhost:884/nacos/v1/ns/instance. code:500 msg: java.net.ConnectException: Connection refused: connect
这里会报错,原因好像是因为他只能读到http://localhost:8848的http://localhost:884,所以连接错误
@SpringBootApplication
@EnableDiscoveryClient
public class AlibabaProviderMain9001 {
public static void main(String[] args){
SpringApplication.run(AlibabaProviderMain9001.class,args);
}
}
@RestController
public class PaymentController {
@Value("${server.port}")
private String serverPort;
@GetMapping("/payment/get/{id}")
public String getServerPort(@PathVariable("id") Integer id) {
return "我是nacos练习的端口"+serverPort+",我觉得我很帅!";
}
}
主要的不同就是就是使用的是
<dependencies>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
<dependency>
<groupId>com.xiaoxiao.springcloudgroupId>
<artifactId>cloud-api-commonartifactId>
<version>${project.version}version>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-actuatorartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-devtoolsartifactId>
<scope>runtimescope>
<optional>trueoptional>
dependency>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<optional>trueoptional>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
dependency>
dependencies>
server:
port: 83
spring:
application:
name: nacos-consumer-service
cloud:
nacos:
discovery:
server-addr: localhost:8848
#消费者将要去访问的微服务名称(注册成功进nacos的微服务提供者)
service-url:
nacos-user-service: http://nacos-provider-service
@SpringBootApplication
@EnableDiscoveryClient
public class AlibabaOrderMain83 {
public static void main(String[] args){
SpringApplication.run(AlibabaOrderMain83.class,args);
}
}
@RestController
@Slf4j
public class OrderController
{
@Resource
private RestTemplate restTemplate;
@Value("${service-url.nacos-user-service}")
private String serverURL;
@GetMapping(value = "/consumer/payment/get/{id}")
public String getProviderServerPort(@PathVariable("id") Integer id)
{
return restTemplate.getForObject(serverURL+"/payment/get/"+id,String.class);
}
}
由于nacos自带ribbon,所以可以在RestTemplate注解@LoadBalanced
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced
public RestTemplate getresRestTemplate() {
return new RestTemplate();
}
}
默认使用轮询算法
C是保证在同一时刻看到的数据是一致的,也就是高一致性
A是保证所有请求都能被收到,也就是高可用性
默认使用AP模式。
对应需求:如果不需要存储级别的信息,并能保持心跳上报,可以选择AP;如果需要在服务级别编辑或者是存储配置信息,就必须使用CP。
切换方式:curl -X PUT ‘$NACOS_ SERVER:8848/nacos/v1/ns/operator/switches?entry= serverMode&value=CP’
新建子模块cloudalibaba-config-nacos-client3377
<dependencies>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
dependency>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-actuatorartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-devtoolsartifactId>
<scope>runtimescope>
<optional>trueoptional>
dependency>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<optional>trueoptional>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
dependency>
dependencies>
要配置两个yaml文件,其中一个文件是全局配置,另一个是这个服务端的局部配置。
全局配置要优先于局部配置,先有全局配置,之后再把局部配置加上
# bootstrap.yaml配置
# nacos配置
server:
port: 3377
spring:
application:
name: nacos-config-client
cloud:
nacos:
discovery:
server-addr: localhost:8848 #Nacos服务注册中心地址
config:
server-addr: localhost:8848 #Nacos作为配置中心地址
file-extension: yaml #指定yaml格式的配置
# application.yaml配置
spring:
profiles:
active: dev
@SpringBootApplication
@EnableDiscoveryClient
public class NacosConfigMain3377 {
public static void main(String[] args){
SpringApplication.run(NacosConfigMain3377.class,args);
}
}
@RestController
@RefreshScope //动态刷新注解
public class NacosConfigController {
@Value("${config.info}") //先从远程看有没有,没有就在本地找
private String ConfigInfo;
@GetMapping("/config/info")
public String getConfigInfo() {
return ConfigInfo;
}
}
参考官网
dataId配置方式:
具体操作:
去nacos后台,新建一个配置
配置dataId
远程配置名就是: nacos-config-client-dev.yaml
如果出现错误:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘scopedTarget.nacosConfigController’: Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder ‘config.info’ in value "${config.info}"
说明没有读取到配置,
1.看看是不是yaml配置成yml了。
2.看看配置文件是不是和你配置的对不上。
3.看看远程配置文件是不是这个属性。
4.我这里就是第四种,搞了一两个小时
查看日志发现
The web application [ROOT] appears to have started a thread named [com.alibaba.nacos .naming.client.listener] but has failed to stop it…
sun.misc.Unsafe.park(Native Method)
然后栈溢出。。。死循环。。。
我找了半天没找出我的问题,以为是文件问题,然后气急败坏的重启了Nacos,结果好了。。。
namespace,group,dateId可以看做是一个层层包裹的关系,最外层的namespace是区分部署环境的,group+dataid从逻辑上区分对象。namespace主要是用于隔离,比如三个开发环境dev,test,prod就可以用不同的namespace隔离。
group可以将不同的微服务进行划分。
dataId配置很简单,直接修改application.yml中的spring.profiles.active:
spring:
profiles:
active: dev #test,prod
直接可以访问不同开发环境的配置文件
在yml文件进行修改
config:
server-addr: localhost:8848 #Nacos作为配置中心地址
file-extension: yaml #指定yaml格式的配置
group: TEST_GROUP #制定group,要改的就是这
spring:
profiles:
active: group
创建后随机生成一个流水号,就是namespace的id
然后新建一个配置,配置和之前是一样,但是在配置yml时候要注意添加具体的namespace的id
config:
server-addr: localhost:8848 #Nacos作为配置中心地址
file-extension: yaml #指定yaml格式的配置
group: DEV_GROUP #制定group
namespace: 1c366d06-3e24-4c44-a1a7-f1e405256d6a #namespace的流水号
官方文档
nacos采用了集中式存储的方式支持集群化部署,目前只支持MySQL存储
nacos支持持久化
nacos底层导入了Apache的小型数据库Derby
要先把Derby切换成MySQL
建议是在linux上进行操作
安装1个Nginx+3个Nacos+1个mysql
Nacostar.gz包(需要连外网否则下载太慢)
Nginx官方下载网址(也要连外网)
将安装包用xftp拷贝到/opt下
解压 tar -zxvf xxx.tar.gz
cp -r nacos /mynacos/ 递归拷贝nacos 到/mynacos/下
docker安装MySQL
1、检查内核版本,必须是3.10及以上
uname -r
2、安装docker
yum install docker
3、输入y确认安装
4、启动docker
systemctl start docker
docker -v
5、开机启动docker
systemctl enable docker
6、停止docker
systemctl stop docker
如果使用的是阿里云服务器,默认下载了最新版,这里可以配置一下镜像仓库
直接配置镜像加速器
配置镜像加速器文件
针对Docker客户端版本大于 1.10.0 的用户
您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://xxxxxxxxx.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
docker 安装MySQL
docker run --name mysql01 -d mysql 后台运行mysql,这样是不对的,因为没有端口映射
docker run -p 3306:3306 --name mysql02 -e MYSQL_ROOT_PASSWORD=123456 -d mysql 这才是对的
如果是一个集群,那就是8848端口。
如果多个nacos集群,那就有多个端口,需要将不同端口都映射。
将每个nacos的数据库都统一,改成mysql
找到mysql执行脚本:/mynacos/nacos/conf 文件是nacos-mysql.sql
如果是用的docker 安装的mysql,如果直接输入mysql指令,会报错: -bash: mysql: command not found
正确方式应该是执行docker容器的mysql
docker exec -it mysql01 bash #这里的mysql01是你容器中设置的mysql的名字
这时候可以使用mysql指令了,然后输入用户名密码
mysql -u root -p #进入数据库
新建一个数据库 nacos_config
create database nacos_config;
use nacos_config;
将sql执行文件放入docker容器
docker ps #查看mysql的容器id
docker exec -it mysql01 bash #进入容器
ls #列出容器列表
docker cp 本地文件路径 容器名:容器路径
docker cp /mynacos/nacos/conf/nacos-mysql.sql mysql01:/tmp #将nacos-mysql.sql拷贝到容器的/tmp目录下
这样就将sql文件放到了docker容器中去了
然后就可以执行sql文件了
source /tmp/nacos-mysql.sql
/mynacos/nacos/conf
# 指定数据源为Mysql
spring.datasource.platform=mysql
# 数据库实例数量
db.num=1
db.url.0=jdbc:mysql://localhost:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=123456
/mynacos/nacos/conf
用hostname -i 获取内网ip
#it is ip
#example
内网ip:3333
内网ip:4444
内网ip:4444
让nacos根据端口映射开启不同的nacos客户端
去到/mynacos/nacos/bin
编辑startup.sh脚本
1.3.0配置是这样
修改
while getopts ":m:f:s:c:e:p:" opt
do
case $opt in
m)
MODE=$OPTARG;;
f)
FUNCTION_MODE=$OPTARG;;
s)
SERVER=$OPTARG;;
c)
MEMBER_LIST=$OPTARG;;
e)
EMBEDDED_STORAGE=$OPTARG;;
p)
PORT=$OPTARG;; #增加端口映射
?)
echo "Unknown parameter"
exit 1;;
esac
done
#根据机器运存选改,我这里减少了内存占用
else
if [[ "${EMBEDDED_STORAGE}" == "embedded" ]]; then
JAVA_OPT="${JAVA_OPT} -DembeddedStorage=true"
fi
JAVA_OPT="${JAVA_OPT} -server -Xms500m -Xmx500m -Xmn256m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
JAVA_OPT="${JAVA_OPT} -XX:-OmitStackTraceInFastThrow -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${BASE_DIR}/logs/java_heapdump.hprof"
#文章末尾修改,nuhup增加端口映射
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"
到/usr/local/nginx/conf目录下找到nginx.conf
upstream cluster{
server 127.0.0.1:3333;
server 127.0.0.1:4444;
server 127.0.0.1:5555;
}
server {
listen 1111;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
# root html;
# index index.html index.htm;
proxy_pass http://cluster;
}
#error_page 404 /404.html;
[root@iZ2ze2jmbeb02wrxw6wdp3Z sbin]# pwd
/usr/local/nginx/sbin
[root@iZ2ze2jmbeb02wrxw6wdp3Z sbin]# ./nginx -c /usr/local/nginx/conf/nginx.conf
查询多少个nacos运行
ps -ef|grep nacos|grep -v grep|wc -l
如果是3个就成功了
如果没有,就可能有以下问题
异常1:org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up.
原因:nacos不支持mysql8
解决方案:可以修改配置让其适应https://www.cnblogs.com/gyli20170901/p/11245270.html
或者拉取一个mysql5.7
异常2:
#There is insufficient memory for the Java Runtime Environment to continue.
#Native memory allocation (mmap) failed to map 1073741824 bytes for committing reserved memory.
#An error report file with more information is saved as:
#/mynacos/nacos/bin/hs_err_pid3061.log
原因:内存不够用了!!!!!我这里用的是学生云服务,导致根本上不了三个!因为启动一个默认1-2G内存
解决方法:减少内存,改成启动使用500m
JAVA_OPT="${JAVA_OPT} -server -Xms500m -Xmx500m -Xmn256m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
访问端口1111,成功!!!!
Nacos能够实现注册中心+配置中心的组合,功能实现等于Eureka+Config+Bus,内容还是挺多的。
在提供注册方面要注意负载均衡,还有分组;nacos集群要和nginx结合。
编写yml文件的时候要注意server-addr 要注册进注册中心不要加http://,直接输入ip:端口号就可以了,否则出现异常:
java.lang.IllegalStateException: failed to req API:/nacos/v1/ns/instance after all servers([http://localhost:884]) tried: failed to req API:http://localhost:884/nacos/v1/ns/instance. code:500 msg: java.net.ConnectException: Connection refused: connect
这里会报错,原因好像是因为他只能读到http://localhost:8848的http://localhost:884,所以连接错误
如果出现错误:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘scopedTarget.nacosConfigController’: Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder ‘config.info’ in value "${config.info}"
说明没有读取到配置,
1.看看是不是yaml配置成yml了。
2.看看配置文件是不是和你配置的对不上。
3.看看远程配置文件是不是这个属性。
4.我这里就是第四种,搞了一两个小时
查看日志发现
The web application [ROOT] appears to have started a thread named [com.alibaba.nacos .naming.client.listener] but has failed to stop it…
sun.misc.Unsafe.park(Native Method)
然后栈溢出。。。死循环。。。
我找了半天没找出我的问题,以为是文件问题,然后气急败坏的重启了Nacos,结果好了。。。
如果是用的docker 安装的mysql,如果直接输入mysql指令,会报错: -bash: mysql: command not found
正确方式应该是执行docker容器的mysql
docker exec -it mysql01 bash #这里的mysql01是你容器中设置的mysql的名字
如果没有,就可能有以下问题
异常1:org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up.
原因:nacos不支持mysql8
解决方案:可以修改配置让其适应https://www.cnblogs.com/gyli20170901/p/11245270.html
或者拉取一个mysql5.7
异常2:
#There is insufficient memory for the Java Runtime Environment to continue.
#Native memory allocation (mmap) failed to map 1073741824 bytes for committing reserved memory.
#An error report file with more information is saved as:
#/mynacos/nacos/bin/hs_err_pid3061.log
原因:内存不够用了!!!!!我这里用的是学生云服务,导致根本上不了三个!因为启动一个默认1-2G内存
解决方法:减少内存,改成启动使用500m
JAVA_OPT="${JAVA_OPT} -server -Xms500m -Xmx500m -Xmn256m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"