Nacos
# 官网
https://nacos.io/
https://github.com/alibaba/nacos/releases
# Linux安装nacos
# 安装jdk环境
然后解压缩:
tar -xvf jdk-8u144-linux-x64.tar.gz
然后重命名为java
配置环境变量:
export JAVA_HOME=/usr/local/java
export PATH=$PATH:$JAVA_HOME/bin
2
设置环境变量:
source /etc/profile
# 上传nacos安装包
上传到Linux服务器的某个目录,例如/usr/local/src
目录下
# 解压
命令解压缩安装包:
tar -xvf nacos-server-1.4.1.tar.gz
然后删除安装包:
rm -rf nacos-server-1.4.1.tar.gz
# 配置云端口
默认端口为8848
改端口:/nacos/conf下的application.properties
# 启动
在nacos/bin目录中,输入命令启动Nacos:
sh startup.sh -m standalone
# Nacos的依赖
父工程:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.5.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
2
3
4
5
6
7
客户端:
<!-- nacos客户端依赖包 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
2
3
4
5
6
# 配置文件
spring:
application:
name: orderservice
cloud:
nacos:
server-addr: ip:8848
2
3
4
5
6
# Nacos控制台
http://ip:8848/nacos
账号:nacos
密码:nacos
# Nacos配置集群
yml配置文件修改
cloud:
nacos:
server-addr: ip:8848
discovery:
cluster-name: SH #集群名称
2
3
4
5
# NacosRule负载均衡
在默认情况下,即使集群地点相同,还是不会地点优先,业务默认走的是负载均衡的轮询方式。
没有NacosRule配置之前如下:
userservice:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
2
3
RandomRule为随机
只需要改为如下即可:
userservice:
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule
2
3
NacosRule首先选择本地集群,然后在本地集群中进行随机选择
跨集群访问会报警告信息:
A cross-cluster call occurs,name = userservice, clusterName = HZ, instance = [Instance{instanceId='10.44.150.161#8083#SH#DEFAULT_GROUP@@userservice', ip='10.44.150.161', port=8083, weight=1.0, healthy=true, enabled=true, ephemeral=true, clusterName='SH', serviceName='DEFAULT_GROUP@@userservice', metadata={preserved.register.source=SPRING_CLOUD}}]
# NacosRule根据权重负载均衡
只需要在控制台中对集群进行“编辑”,设置“权重”的值,1为最大,0为最小
权重为0的作用:停机迭代升级。
# Nacos环境隔离(namespace命名空间)
在控制台中的“命名空间”打开,点击“新建命名空间”进行新建。
默认为public空间。
层级关系:
Namespace-->Group-->Service/Data
Group:业务相关度高的可以放到一个组,比如订单和支付
代码配置:
cloud:
nacos:
server-addr: ip:8848
discovery:
cluster-name: HZ
namespace: 521a6649-a8cf-4eda-bbc4-7ce8e18f88a6
2
3
4
5
6
配置namespace,值为创建命名空间时生成的id。
配置完环境隔离后,如果访问不同环境下的接口,会报错误提示:
No instances available for userservice] with root cause
# Nacos临时实例和非临时实例
默认为临时实例
修改yml如下
cloud:
nacos:
server-addr: 43.138.140.213:8848
discovery:
cluster-name: HZ
namespace: 521a6649-a8cf-4eda-bbc4-7ce8e18f88a6
ephemeral: false
2
3
4
5
6
7
区别:
临时实例的服务停掉了之后,在nacos中不会立刻消失,因为询问有时间,存在的是缓存而已。
非临时实例的服务停掉之后,在nacos会立刻变红色,并且不会消失,nacos会一直等他重新启动。
# Nacos统一配置管理
目的:当集群的服务器太多的时候,做到对配置文件的统一管理,使得配置文件被修改后,服务器都能识别到,然后进行重新读取。
在控制台中点击“配置管理”,点击“新建配置”。
Date ID:一定要唯一,一般用微服务的服务名进行命名,后缀名不能为yml,要为yaml。
配置内容:一般不需要把yaml中的配置项全部复制粘贴,只需要一些开关类的配置即可。
# Nacos配置管理的读取
没有Nacos之前,项目读取配置文件的过程如下:
项目启动-->读取本地配置文件application.yml-->创建apring容器-->加载bean
加入Nacos之后:
先读取Nacos配置文件,再读取本地配置文件,两者合并。
注意!!因为Nacos的地址是放在本地配置中的,但是读取顺序是先Nacos再本地,所以要另想办法。
解决方案:因为bootstrap.yml的读取时比application.yml前,所以将有关nacos的配置放入bootstrap.yml中。
导入依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2
3
4
创建bootstrap.yaml
spring:
application:
name: userservice #对应名称
profiles:
active: dev #对应环境(-后面的内容)
cloud:
nacos:
server-addr: ip:8848
config:
file-extension: yaml #文件后缀名
2
3
4
5
6
7
8
9
10
注入方式1:
@Value("${pattern.dateformat}")
private String dateformat;
2
# Nacos配置热更新(自动刷新)
nacos默认不会自动更新,需要手动配置。
在相对应的配置数据读取的类上加上@RefreshScope即可
# Nacos配置注入方式
1.@Value注解,热更新需要在类上加上@RefreshScope注解
@RefreshScope
public class UserController {
@Value("${pattern.dateformat}")
private String dateformat;
2
3
4
2.使用@ConfigurationProperties注解
创建配置类:
@Data
@Component
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {
private String dateformat;
}
2
3
4
5
6
7
在使用的地方注入进来即可,使用@ConfigurationProperties的方法可以不加@RefreshScope,它会默认进行热更新
@Autowired
private PatternProperties patternProperties;
2
# Nacos多环境配置共享
微服务启动时会从nacos读取多个配置文件
- [spring.application.name]-[spqing.profiles.active].yaml,例如userservice-dev.yaml
- [spring.application.name].yaml,例如userservice.yaml
分析:例如userservice.yaml这种文件,是不会改变的,可以用来做配置共享
idea中为了不重复修改配置代码进行重启,可以点击下方Services中需要改开发环境的项目,右键Edit,Active profiles修改为相对应的环境名字就行。
环境配置共享几点注意事项:
- 当本地有配置属性,nacos上没有时,走的是本地
- 当本地和nacos上都有相同属性名的值时,优先走nacos
- 当nacos上的dev环境也添加相同配置属性名的值时,dev优先
总结:服务名-profile.yaml(当前环境) > 服务名.yaml(共享环境) > 本地配置