前置条件
- 服务器环境:Ubuntu 20.04 64位
- docker环境:Docker version 19.03.8
- docker bridge network: dmjy-net
- mysql 服务:mysql 8.x docker,mysql容器名称:dmjy-mysql,已加入docker bridge network:dmjy-net
一. 安装
1. 下载nacos官方的docker镜像
#pull docker image
docker pull nacos/nacos-server
# 如果只是想简单的体验一下nacos,直接运行启动一个容器就好了
docker run --name dmjy-nacos -d -p 8848:8848 --privileged=true -e MODE=standalone nacos/nacos-server
# 启动完成后访问: http://localhost:8848/nacos ,查看效果,默认用户名和密码都是 nacos
2. 在mysql中创建数据库nacos_devtest
3. 执行数据库初始化脚本创建表
初始化脚本连接:https://github.com/alibaba/nacos/blob/master/distribution/conf/nacos-mysql.sql
4. 启动
模式一. 单机模式启动nacos
docker run --network dmjy-net --name dmjy-nacos -d -p 8848:8848 --privileged=true --restart=always -e MODE=standalone -e PREFER_HOST_MODE=hostname -e JVM_XMS=256m -e JVM_XMX=256m -e SPRING_DATASOURCE_PLATFORM=mysql -e MYSQL_SERVICE_HOST=dmjy-mysql -e MYSQL_SERVICE_PORT=3306 -e MYSQL_SERVICE_DB_NAME=nacos_devtest -e MYSQL_SERVICE_USER=root -e MYSQL_SERVICE_PASSWORD=123456 nacos/nacos-server
- 参数说明
--network dmjy-net 将容器加入到bridge network网络
MODE=standalone 单机模式运行
JVM_XMS=256m 默认2G,服务器资源有限的话建议调小一点
JVM_XMX=256m 默认2G,服务器资源有限的话建议调小一点
SPRING_DATASOURCE_PLATFORM=mysq 数据库类型
MYSQL_SERVICE_HOST=dmjy-mysql mysql地址,这里因为我的mysql和nacos在同一台宿主服务器上运行,并且已经加入同一个bridge network,所以可以直接通过容器名称访问mysql
MYSQL_SERVICE_PORT=3306 mysql端口
MYSQL_SERVICE_DB_NAME=nacos_devtest 数据库名称
MYSQL_SERVICE_USER=root mysql用户名
MYSQL_SERVICE_PASSWORD=123456 mysql密码
模式二. 集群模式启动
- 创建custom.properties
#spring.security.enabled=false
#management.security=false
#security.basic.enabled=false
#nacos.security.ignore.urls=/**
#management.metrics.export.elastic.host=http://localhost:9200
# metrics for prometheus
management.endpoints.web.exposure.include=*
# metrics for elastic search
#management.metrics.export.elastic.enabled=false
#management.metrics.export.elastic.host=http://localhost:9200
# metrics for influx
#management.metrics.export.influx.enabled=false
#management.metrics.export.influx.db=springboot
#management.metrics.export.influx.uri=http://localhost:8086
#management.metrics.export.influx.auto-create-db=true
#management.metrics.export.influx.consistency=one
#management.metrics.export.influx.compressed=true
- 创建nacos-hostname.env文件
PREFER_HOST_MODE=hostname
NACOS_SERVERS=nacos1:8848 nacos2:8848 nacos3:8848
MYSQL_SERVICE_HOST=dmjy-mysql
MYSQL_SERVICE_DB_NAME=nacos_devtest
MYSQL_SERVICE_PORT=3306
MYSQL_SERVICE_USER=root
MYSQL_SERVICE_PASSWORD=123456
- 创建cluster-logs目录
- 创建cluster.yaml文件
version: "3"
services:
nacos1:
hostname: nacos1
container_name: nacos1
image: nacos/nacos-server:latest
volumes:
- ./cluster-logs/nacos1:/home/nacos/logs
- ./init.d/custom.properties:/home/nacos/init.d/custom.properties
ports:
- "8848:8848"
- "9555:9555"
env_file:
- ./env/nacos-hostname.env
restart: always
networks:
- dmjy-net
nacos2:
hostname: nacos2
image: nacos/nacos-server:latest
container_name: nacos2
volumes:
- ./cluster-logs/nacos2:/home/nacos/logs
- ./init.d/custom.properties:/home/nacos/init.d/custom.properties
ports:
- "8849:8848"
env_file:
- ./env/nacos-hostname.env
restart: always
networks:
- dmjy-net
nacos3:
hostname: nacos3
image: nacos/nacos-server:latest
container_name: nacos3
volumes:
- ./cluster-logs/nacos3:/home/nacos/logs
- ./init.d/custom.properties:/home/nacos/init.d/custom.properties
ports:
- "8850:8848"
env_file:
- ./env/nacos-hostname.env
restart: always
networks:
- dmjy-net
networks:
dmjy-net:
external: true
我的目录层级如下,不一定要跟我的保持一致,只是为了说明文件所在路径,如果你的跟我的路径不一样,修改cluster.yaml中相应的挂载目录就好了
/root
--|nacos
----|cluster.yaml
----|init.d
------|custom.properties
----|env
------|nacos.env
----|cluster-logs
- 启动容器
docker-compose -f /root/nacos/cluster.yaml up -d
二. 使用
- nacos地址:http://localhost:8848/nacos,默认用户名:密码为
nacos
:nacos
-
修改默认用户名和密码(无法通过浏览器修改,需要手动修改数据库数据)
2.1. 准备你的新密码:eg: 123456
2.2. 随便百度一个Bcrypt密码在线生成器,将你的密码使用Bcrypt加密
2.3. 在数据库中执行修改nacos用户密码的SQL
UPDATE users SET password = '$2a$10$U1b95oATVHFC275ZqSkb9ORO8IlnRz1tCVbCgdzohJnNExGGswM8e' WHERE username = 'nacos';
2.4. 如果还想修改默认的登录用户,接着执行如下SQL
UPDATE users set username = 'myname' WHERE username = 'nacos';
UPDATE roles set username = 'myname' WHERE username = 'nacos';
三. 最佳实践
前置条件:
- 编程语言:java
- jdk版本:java8
- 基础框架:spring cloud alibaba
-
nacos创建命名空间,我这里创建了两个命名空间,分别代表开发和生产环境。
-
通常不同环境会使用不同的数据库配置,相同环境的不同项目会使用同一个数据库,只是数据库实例不同,在这里我们新建公共配置文件public-mysql.yaml
spring:
datasource:
url: jdbc:mysql://localhost:3306/${spring.application.name}?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&useSSL=false&allowMultiQueries=true
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
这里使用了${spring.application.name}作为数据库实例的占位符,默认数据库实例和项目名称一致,当然你也可以自定义你的占位符,这样就不用每个配置文件中都配置相同的数据库连接了。
- 工程项目中引入nacos相关的maven依赖,以下只是pom.xml文件的局部
1.8
UTF-8
UTF-8
2.3.7.RELEASE
2.2.2.RELEASE
Hoxton.SR9
...
...
org.springframework.boot
spring-boot-starter-web
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-config
...
org.springframework.cloud
spring-cloud-dependencies
${spring-cloud.version}
pom
import
org.springframework.boot
spring-boot-dependencies
${spring-boot.version}
pom
import
com.alibaba.cloud
spring-cloud-alibaba-dependencies
${spring-cloud-alibaba.version}
pom
import
如果启动或注册nacos失败,注意spring-cloud-alibaba,spring-cloud,spring-boot的版本是否兼容,调整一下它们的版本
- boostrap.yml
namespace: 05845da2-88a5-447a-a500-48b0fe353d73
spring:
application:
name: dmjy-user
cloud:
nacos:
username: nacos
password: 123456
server-addr: localhost:8848
config: # nacos配置中心配置
namespace: ${namespace}
file-extension: yaml
shared-configs: # 公共配置文件
- public-mysql.yaml
- swagger.yaml
discovery: # nacos服务注册中心配置
namespace: ${namespace}
配置说明:
namespace:自定义变量,指定namespaceID,以供
spring.cloud.nacos.config.namespace
和spring.cloud.nacos.discovery.namespace
引用,避免重复配置。
spring.cloud.nacos.config.file-extension: 指定nacos配置中心配置文件格式。
spring.cloud.nacos.config.shared-configs: 引入公共配置列表。
nacos配置中心加载配置的规则如下:
规则1:默认加载的Data Id为:
${spring.application.name}.properties
,如
spring.application.name=dmjy-user
,则对应的配置文件Data Id:dmjy-user.properties
规则2:Data Id的构成由${spring.application.name}-${spring.prifiles.active}.${spring.cloud.nacos.config.file-extension}
拼接而来,如果${spring.prifiles.active}
未指定,则中间的-
也不会出现。
如:spring.application.name=dmjy-user
,spring.cloud.nacos.config.file-extension=yaml
,则加载的是指定namespace下的dmjy-user.yaml
配置文件。
tips: 微服务架构下,通常不同环境的服务与服务之间通信隔离,所以建议通过namespace来划分不同的环境。