spring-cloud-alibaba版本对应关系
下载地址
解压,进入bin目录(nacos\bin),编辑startup.cmd
设置为单机启动
rem set MODE="cluster"
set MODE="standalone"
双击startup.cmd
启动nacos
解压nacos到不同机器的对应目录下,这里是/usr/local/nacos
cd /usr/local
tar -zxvf nacos-server-2.1.0.tar.gz -C /usr/local
进入nacos/conf
目录下,修改application.properties
的数据源配置,集群需要使用外置数据源
vim application.properties
把下面关于数据源的配置放开并修改
#*************** Config Module Related Configurations ***************#
### If use MySQL as datasource:
spring.datasource.platform=mysql
### Count of DB:
db.num=1
### Connect URL of DB:
db.url.0=jdbc:mysql://${数据库ip}:${数据端口号}/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=123456
### Connection pool configuration: hikariCP
db.pool.config.connectionTimeout=30000
db.pool.config.validationTimeout=10000
db.pool.config.maximumPoolSize=20
db.pool.config.minimumIdle=2
#*************** Naming Module Related Configurations ***************#
将cluster.conf.example
改为cluster.conf
,添加节点配置
cp cluster.conf.example cluster.conf
vim cluster.conf
把下面的ip修改成集群的各个服务器的信息
#
# Copyright 1999-2021 Alibaba Group Holding Ltd.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
#it is ip
#example
${ip1}:${port1}
${ip2}:${port2}
${ip3}:${port3}
mysql创建nacos数据库,数据库名与上面配置的一致,导入sql文件,文件位置:conf/nacos-mysql.sql
如果出现内存不足:修改启动脚本bin/startup.sh
的jvm参数
JAVA_OPT="${JAVA_OPT} ‐server ‐Xms512m ‐Xmx512m ‐Xmn256 ‐XX:MetaspaceSize=64m ‐XX:MaxMetaspaceSize=128m"
进入bin目录,启动nacos
sh start.sh
nacos is starting with cluster
nacos is starting,you can check the /usr/local/nacos/logs/start.out
查看日志
tail -200f ../logs/start.out
#出现以下内容即为启动成功
INFO Nacos started successfully in cluster mode. use external storage
踩坑记录
数据源错误:
检查配置文件内容是否配置错误
检查数据库是否只支持本地连接
select host from user where user = 'root';
如果是localhost表示只能使用本地连接(127.0.0.1或者localhost),不能使用真正的ip连接
修改:
update user set host = '%' where user = 'root';
当在一台服务部署了连续端口号的nacos,如8848,8849,8850,启动正常的nacos端口号+1却启动不起来
这是因为nacos2.0以后,集群部署不能使用连续的端口号,具体原因请自行查阅资料
根据官方说明总结:
8846启动占用9846、9847端口
8847启动占用9847、9848端口
8848启动占用9848、9849端口
不难发现,8847会同时影响到8846和8848,所以才会出现奇怪的事情,且检查8847端口又看不出什么问题,因为问题不在8847而在9847和9848。
nacos成功启动但是页面访问不到
需要开放端口号
#查看防火墙的状态,看看是否开启
systemctl status firewalld
#如果没有开启,那么开启防火墙
systemctl start firewalld
#查询指定端口是否已经开放 返回yes/no
firewall-cmd --query-port=8848/tcp
#如果返回no,添加指定需要开放的端口:
firewall-cmd --add-port=8848/tcp --permanent
#如果需要关闭端口
firewall-cmd --remove-port=8848/tcp --permanent
#重载入添加的端口
firewall-cmd --reload
# 查看所有打开的端口:
firewall-cmd --zone=public --list-ports
#查询指定端口是否开启成功
firewall-cmd --query-port=8848/tcp
nacos成功访问,但是项目启动报错Request nacos server failed
Nacos2.0版本相比1.X新增了gRPC的通信方式,因此需要增加2个端口。新增端口是在配置的主端口(server.port)基础上,进行一定偏移量自动生成。
端口 | 与主端口的偏移量 | 描述 |
---|---|---|
9848 | 1000 | 客户端gRPC请求服务端端口,用于客户端向服务端发起连接和请求 |
9849 | 1001 | 服务端gRPC请求服务端端口,用于服务间同步等 |
账号密码都是nacos
至此nacos已经安装完成
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
引入依赖应该注意和SpringBoot版本的兼容性,否则启动会报错
由于 `Spring Boot 1 和 Spring Boot 2 在 Actuator 模块的接口和注解有很大的变更,且 spring-cloud-commons 从 1.x.x 版本升级到 2.0.0 版本也有较大的变更,因此我们采取跟 SpringBoot 版本号一致的版本:
查看最新版本去下面的github网站查看
版本说明-github
package com.example.nacos.discovery;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class NacosDiscoveryApplication {
public static void main(String[] args) {
SpringApplication.run(NacosDiscoveryApplication.class, args);
}
}
bootstrap加载优先级高于application
spring:
application:
name: nacos-practise
cloud:
nacos:
# 注册中心
discovery:
server-addr: 127.0.0.1:8848
namespace: ${namespaceID}
#ephemeral: false # 默认为true(临时实例),表示当服务宕机,超过心跳就会把实例剔除掉,设置为false表示不会被剔除掉
#service: consumer # 服务名称,默认取${spring.application.name},也可以通过该配置项配置
#group: DEFAULT_GROUP # 更细的相同特征的服务进行归类分组管理
#weight: 1 # 权重,通常结合负载均衡策略,权重越高流量越大
nacos config可以动态读取配置文件的值
在Nacos-Server中新建配置,其中Data ID它的定义规则是:${prefix}-${spring.profile.active}.${file-extension}
prefix
默认为spring.application.name
的值,也可以通过配置项spring.cloud.nacos.config.prefix
来配置。spring.profile.active
即为当前环境对应的profile
,可以通过配置项spring.profile.active
来配置。file-exetension
为配置内容的数据格式,可以通过配置项spring.cloud.nacos.config.file-extension
来配置。目前只支持properties
和yaml
类型。注意:当 spring.profile.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension}
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-config
引入依赖同样需要注意和SpringBoot版本的兼容性
spring:
application:
name: nacos-practise
profiles:
active: practise
cloud:
nacos:
server-addr: 127.0.0.1:8848
# 如果开启了权限,则必须要设置用户名和密码
username: nacos
password: nacos
# 配置中心
config:
# namespace必须是命名空间ID,如果是public命名空间,没有命名空间ID,则不配置此项
namespace: ${namespaceID}
prefix: ${spring.application.name}
# 文件扩展名,默认是properties;此处需要和 Data Id 配置的扩展名一致,即yaml-yaml;yml-yml
file-extension: yml
group: DEFAULT_GROUP
通过DataId和profiles实现
在配置文件中指定spring.profiles.active = **
,然后在nocas客户端新建对应的${spring.cloud.nacos.config.prefix}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
配置来区分不同的环境。
通过Group实现
为不同的环境新建不同的分组,然后在配置文件中指定spring.cloud.nacos.config.group=组名
,这样也可以实现不同环境的区分。
通过Namespace实现
这种方式是官方建议的方式,通过创建不同的命名空间使用不同的环境配置
最佳的配置方式
Namespace:环境
Group:项目
Data Id:工程
如果使用权限管理,需要在nacos中的application.properties中开启权限
### If turn on auth system:
nacos.core.auth.enabled=true
使用@Value
获取的值需要使用@RefreshScope
动态刷新配置信息
注意:@Scheduled
定时任务里获取到的值不能动态刷新
当微服务数量很庞大时,将所有配置都书写到一个配置文件中,显然不是太合适。对此我们可以将配置按照功能的不同,拆分为不同的配置文件。
例如:
数据库配置:
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/mydb
username: root
password: 123456
redis配置:
spring:
redis:
database: 0
mybatis配置:
mybatis:
mapper-locations: classPath:mybatis/mapper/*.xml
configuration:
log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl
pagehelper:
auto-dialect: mysql
此时在nacos中可以配置三个Data Id :datasource.yml、redis.yml、mybatis.yml
项目配置文件:
spring:
application:
name: nacos-practise
profiles:
active: practise
cloud:
nacos:
# 配置中心
config:
server-addr: 127.0.0.1:8848
# 如果开启了权限,则必须要设置用户名和密码
username: nacos
password: nacos
namespase: ${namespaceID}
prefix: ${spring.application.name}
file-extension: yml
group: DEFAULT_GROUP
extension-configs: # 优先级:后配置的 > 先配置的,也就是说后读取到的会覆盖前面读取到的
- data-id: datasource.yaml
group: DEFAULT_GROUP # 默认为DEFAULT_GROUP
refresh: true # 是否动态刷新,默认为false
- data-id: redis.yaml
group: DEFAULT_GROUP
refresh: true
- data-id: mybatis.yaml
group: DEFAULT_GROUP
refresh: true
配置的优先级
配置中心有的优先使用配置中心的,没有则使用本地配置
目前提供了三种配置能力从 Nacos 拉取相关的配置
spring.cloud.nacos.config.shared-configs[n].data-id
支持多个共享 Data Id 的配置spring.cloud.nacos.config.extension-configs[n].data-id
的方式支持多个扩展 Data Id 的配置当三种方式共同使用时,他们的一个优先级关系是:A < B < C