赞
踩
https://gitee.com/zh_0209_java/springcloud-alibaba.git
一个更易于构建云原生应用的动态服务发现,配置管理和服务管理平台。也就是注册中心 + 配置中心的组合。
nacos 支持AP原则也支持CP 原则。
官方下载地址
下载后解压到当前目录
进入到bin目录中,然后cmd进入命令行模式,启动startup.cmd
启动成功后访问 http://localhost:8848/nacos 默认用户名和密码都是 nacos
<dependencies> <!--SpringCloud alibaba Nacos--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> </dependencies>
server: port: 9001 spring: application: name: nacos-payment-provider cloud: nacos: discovery: server-addr: localhost:8848 # 配置nacos地址 # 配置监控暴露端点 management: endpoints: web: exposure: include: "*"
@EnableDiscoveryClient
, 表示这是客户端,启动9001,刷新nacos图形化页面C 是所有节点在同一时间看到的数据是一致的;而A的定义是所有的请求都会收到响应
何时选择使用何种模式?
一般来说,如果不需要存储服务级别的信息且服务实例是通过nacos-client注册,并能够保持心跳上报,那么就可以原则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"
<dependencies> <!--nacos-config依赖--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> <!--SpringCloud alibaba Nacos--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> </dependencies>
bootstrap.yml
和 application.yml
配置文件bootstrap.yml
# ===== 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 # 声明从配置中心中读取的配置文件格式 # ${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}
application.yml
spring:
profiles:
active: dev
说明:Nacos 同springcloud-config一样,在项目初始化时,要保证先从配置中心进行配置拉取,拉取配置之后,才能保证项目的正常启动。
springboot 中配置文件的加载时存在优先级顺序的,bootstrap 优先级高于application
Nacos中的dataid 的组成格式及与SpringBoot 配置文件中的匹配规则
dataId的完整格式如下:
${prefix}-${spring.profile.active}.${file-extension}
prefix
默认为 spring.application.name
的值,也可以通过配置项 spring.cloud.nacos.config.prefix
来配置。spring.profile.active
即为当前环境对应的profile,注意:当spring.profile.active 为空时,对应的连接符 - 也将不存在,dataId的拼接格式变成${prefix}.${file-extension}
file-extension
为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension
来配置。目前只支持 properties 个 yaml 类型。Namespace+Group+DataId三者关系?
默认情况下:
Namespace=public
, Group=DEFAULT_GROUP
, 默认Cluster 时DEFAULT
Nacos 默认的命名空间是public,Namespace 主要用来实现隔离。
比如说我们现在有三个环境:开发,测试,生产环境,我们就可以创建三个Namespace, 不同的Namespace 之间是隔离的。
Group
默认是 DEFAULT_GROUP, Group 可以把不同的微服务划分到同一个分组里面去。
类似Java里面的package 名和类名,
最外层的namespace 是可以用于区分部署环境的,Group 和DataID 逻辑上区分两个目标对象。
spring:
application:
name: nacos-config-client
cloud:
nacos:
discovery:
server-addr: localhost:8848 # nacos注册中心地址
config:
server-addr: localhost:8848 # nacos作为配置中心地址
file-extension: yaml # 声明从配置中心中读取的配置文件格式
# group: DEV_GROUP # 指定分组,不指定默认是 DEFAULT_GROUP
# namespace: 7c86e828-02fd-405d-9098-f2624077a827 # 指定命名空间,默认是public
默认Nacos 使用嵌入式数据库实现数据的存储。所以如果启动多个默认配置下的Nacos节点,数据存储是存在一致性问题的。为了解决这个问题,Nacos采用了集中式存储的方式来支持集群化部署,目前只支持MySQL的存储。
Nacos 默认自带的是嵌入式数据库derby.
因为我这里使用的是1.14版本的nacos
# ======================================
# 将内置数据库derby 切换成mysql
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://10.10.11.21:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=123456
注意:低版本nacos与高版本MySQL不适配,比如我这里的nacos1.1.4 与MySQL8 就不能适配,需要使用MySQL5.7;
# 提前准备好MySQL 数据库,这里用的是 1.1.4版本的nacos, 需要使用5.7版本的mysql
docker run -d --name mysql -p 3306:3306 mysql:5.7
需要在数据库中创建 nacos_config库,以及将nacos需要的表sql脚本执行
# 下载 nacos1.1.4版本
docker pull nacos/nacos-server:1.1.4
# 在宿主机上创建文件夹用来存放nacos的配置文件
mkdir -p zhanghang/nacos/conf
# 在将application.properties 配置文件放到 zhanghang/nacos/conf 目录下
docker cp nacos:/home/nacos/conf/application /zhanghang/nacos/conf
# 如果mysql 也是在本机上运行的,需要查看mysql的容器ip
# docker inspect --format='{{.NetworkSettings.IPAddress}}' ID/name
docker inspect --format='{{.NetworkSettings.IPAddress}}' mysql
# vim 修改application.properties配置文件,将mysql的连接加入到配置文件的最后面
# 使用 i 进入编辑模式,使用 ESC按钮 进入命令模式,在使用 :wq 保存退出
# 将内置数据库derby 切换成mysql
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://10.10.11.21:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=123456
# 启动nacos
docker run -d --name nacos -e MODE=standalone -v /zhanghang/nacos/conf/applicatioin.properties:/home/nacos/conf/application.properties -p 8848:8848 nacos/nacos-server:1.1.4
启动成功后浏览器访问 虚拟机ip:8848/nacos
测试新建一个配置,然后查看数据库
至此,docker部署nacos完成
因我自己本地的虚拟机大小受限,所以我只能启动两个nacos
docker run -d \ -e PREFER_HOST_MODE=hostname \ -e NACOS_APPLICATION_PORT=8846 \ # 指定当前nacos的端口 -e NACOS_SERVERS="10.10.11.21:8846 10.10.11.21:8847 10.10.11.21:8848" \ # 指定nacos集群的信息 -e MYSQL_SERVICE_HOST=localhost \ # 指定mysql的ip -e MYSQL_SERVICE_PORT=3306 \ # 指定mysql的端口 -e MYSQL_SERVICE_DB_NAME=nacos_config \ # 指定mysql的数据库名称 -e MYSQL_SERVICE_USER=root\ # 指定mysql的用户名 -e MYSQL_SERVICE_PASSWORD=123456\ # 指定mysql的密码 -e SPRING_DATASOURCE_PLATFORM=mysql \ # 指定数据库的类型 -e NACOS_SERVER_IP=10.10.11.21 \ # 指定nacos服务的ip -e JVM_XMS=612m \ # 指定java进程的最小Java堆大小 -e JVM_XMX=612m \ # 指定java进程的最大Java堆大小 -e JVM_XMN=256m \ # 设置年轻代大小 -e JVM_MS=32m \ -e JVM_MMS=80m \ --e MODE=cluster \ # 设置为集群模式,standalone为单机模式 -p 8846:8846 \ # 映射端口 --name my-nacos1 \ nacos/nacos-server docker run -d \ -e PREFER_HOST_MODE=hostname \ -e NACOS_APPLICATION_PORT=8847 \ # 指定当前nacos的端口 -e NACOS_SERVERS="10.10.11.21:8846 10.10.11.21:8847 10.10.11.21:8848" \ # 指定nacos集群的信息 -e MYSQL_SERVICE_HOST=localhost \ # 指定mysql的ip -e MYSQL_SERVICE_PORT=3306 \ # 指定mysql的端口 -e MYSQL_SERVICE_DB_NAME=nacos_config \ # 指定mysql的数据库名称 -e MYSQL_SERVICE_USER=root\ # 指定mysql的用户名 -e MYSQL_SERVICE_PASSWORD=123456\ # 指定mysql的密码 -e SPRING_DATASOURCE_PLATFORM=mysql \ # 指定数据库的类型 -e NACOS_SERVER_IP=10.10.11.21 \ # 指定nacos服务的ip -e JVM_XMS=612m \ # 指定java进程的最小Java堆大小 -e JVM_XMX=612m \ # 指定java进程的最大Java堆大小 -e JVM_XMN=256m \ # 设置年轻代大小 -e JVM_MS=32m \ -e JVM_MMS=80m \ --e MODE=cluster \ # 设置为集群模式,standalone为单机模式 -p 8847:8847 \ # 映射端口 --name my-nacos2 \ nacos/nacos-server
两个nacos都启动起来之后访问
配置nginx.conf
upstream nacos_server { # 10.10.11.21就是虚拟机ip, 8846和8847就是在虚拟机中启动的nacos集群ip server 10.10.11.21:8846; server 10.10.11.21:8847; } server{ listen 80; server_name localhost; location / { proxy_pass http://nacos_server; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; proxy_set_header HTTP_X_FORWARDED_FOR $remote_addr;#在多级代理的情况下,记录每次代理之前的客户端真实ip proxy_redirect default;#指定修改被代理服务器返回的响应头中的location头域跟refresh头域数值 } }
启动nginx
docker run -d -v /zhanghang/nginx/conf/nginx.conf:/etc/nginx/nginx.conf --net=host -- name=nginx_nacos nginx
访问测试
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。