Nacos

7/29/2022 JavaNacos技术配置中心

# 官网

https://nacos.io/

https://github.com/alibaba/nacos/releases

# Linux安装nacos

# 安装jdk环境

然后解压缩:

tar -xvf jdk-8u144-linux-x64.tar.gz
1

然后重命名为java

配置环境变量:

export JAVA_HOME=/usr/local/java
export PATH=$PATH:$JAVA_HOME/bin
1
2

设置环境变量:

source /etc/profile
1

# 上传nacos安装包

上传到Linux服务器的某个目录,例如/usr/local/src目录下

# 解压

命令解压缩安装包:

tar -xvf nacos-server-1.4.1.tar.gz
1

然后删除安装包:

rm -rf nacos-server-1.4.1.tar.gz
1

# 配置云端口

默认端口为8848

改端口:/nacos/conf下的application.properties

# 启动

在nacos/bin目录中,输入命令启动Nacos:

sh startup.sh -m standalone
1

# 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>
1
2
3
4
5
6
7

客户端:

<!-- nacos客户端依赖包 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

1
2
3
4
5
6

# 配置文件

spring:
  application:
    name: orderservice
  cloud:
    nacos:
      server-addr: ip:8848
1
2
3
4
5
6

# Nacos控制台

http://ip:8848/nacos

账号:nacos

密码:nacos

# Nacos配置集群

yml配置文件修改

cloud:
    nacos:
      server-addr: ip:8848
      discovery:
        cluster-name: SH  #集群名称
1
2
3
4
5

# NacosRule负载均衡

在默认情况下,即使集群地点相同,还是不会地点优先,业务默认走的是负载均衡的轮询方式。

没有NacosRule配置之前如下:

userservice:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
1
2
3

RandomRule为随机

只需要改为如下即可:

userservice:
  ribbon:
    NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule
1
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}}]
1

# 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
1
2
3
4
5
6

配置namespace,值为创建命名空间时生成的id。

配置完环境隔离后,如果访问不同环境下的接口,会报错误提示:

No instances available for userservice] with root cause
1

# Nacos临时实例和非临时实例

默认为临时实例

修改yml如下

cloud:
    nacos:
      server-addr: 43.138.140.213:8848
      discovery:
        cluster-name: HZ
        namespace: 521a6649-a8cf-4eda-bbc4-7ce8e18f88a6
        ephemeral: false
1
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>
1
2
3
4

创建bootstrap.yaml

spring:
  application:
    name: userservice  #对应名称
  profiles:
    active: dev		#对应环境(-后面的内容)
  cloud:
    nacos:
      server-addr: ip:8848
      config:
        file-extension: yaml  #文件后缀名
1
2
3
4
5
6
7
8
9
10

注入方式1:

@Value("${pattern.dateformat}")
    private String dateformat;
1
2

# Nacos配置热更新(自动刷新)

nacos默认不会自动更新,需要手动配置。

在相对应的配置数据读取的类上加上@RefreshScope即可

# Nacos配置注入方式

1.@Value注解,热更新需要在类上加上@RefreshScope注解

@RefreshScope
public class UserController {
    @Value("${pattern.dateformat}")
    private String dateformat;
1
2
3
4

2.使用@ConfigurationProperties注解

创建配置类:

@Data
@Component
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {

    private String dateformat;
}
1
2
3
4
5
6
7

在使用的地方注入进来即可,使用@ConfigurationProperties的方法可以不加@RefreshScope,它会默认进行热更新

 @Autowired
    private PatternProperties patternProperties;
1
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(共享环境) > 本地配置

# Nacos集群搭建