Nacos使用教程,还不会使用Nacos,看这一篇就够了!

Nacos通关文牒

一 下载安装及启动

1.下载安装

在Nacos官网下载自己需要的版本,根据官方教程启动Nacos。

Nacos下载地址:Nacos Server 下载 | Nacos 官网

Nacos全部版本下载:GitHub - alibaba/nacos: an easy-to-use dynamic service discovery, configuration and service management platform for building AI cloud native applications.

Nacos文档地址:Nacos 概览 | Nacos 官网

我这里使用的是2.5.1版本,这是最后一个支持JDK1.8的稳定版本。这里以windows版本为例。

2.启动

1.将下载的压缩包解压出来,然后进入到 conf目录下,找到mysql-schema.sql文件。
在这里插入图片描述
2.创建一个名为 nacos 的数据库,然后运行mysql-schema.sql文件,运行成功后数据库中会出现以下数据表。(其他名称也可以,这里的nacos数据库为nacos配置文件中的默认名称)
在这里插入图片描述
3.在conf目录下,找到application.properties文件,该文件是Nacos的配置文件,可以配置端口,鉴权,数据库等相关内容。

Nacos默认使用内置的derby数据库,官方推荐使用Mysql,以下数据库配置内容。默认全都是注释的,我们打开,然后将关键信息修改为我们实际信息即可。

#*************** Config Module Related Configurations ***************#
### If use MySQL as datasource:
### Deprecated configuration property, it is recommended to use `spring.sql.init.platform` replaced.
spring.datasource.platform=mysql
spring.sql.init.platform=mysql
### Count of DB:
db.num=1
### Connect URL of DB:
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=Asia/Shanghai
db.user.0=root
db.password.0=123456

4.开启鉴权:开启鉴权后,不论是登录Nacos控制台,还是在项目中启用服务发现,都需要账号密码才可以,这将很好的提升安全性,这里推荐开启。

# 开启鉴权
nacos.core.auth.caching.enabled=true
# 这两个属性是身份验证的白名单,由其他服务器的身份验证请求使用。
nacos.core.auth.server.identity.key=shawn
nacos.core.auth.server.identity.value=shawnisgoodman
# 开启token的缓存以及缓存时间
nacos.core.auth.plugin.nacos.token.cache.enable=true
nacos.core.auth.plugin.nacos.token.expire.seconds=18000
# token秘钥,这里我使用OpenSSL随便生成了一个
nacos.core.auth.plugin.nacos.token.secret.key=tyoaJ9QoKuHE/baxDs89XiOxDw2C0lm0okBMK1huCxU=

5.做完以上准备工作后,再切换到bin目录下,打开cmd,输入启动命令启动即可。

Nacos共有三种启动模式,我们先以单机模式启动,单机模式主要用于开发和调试,线上推荐集群模式,这样可以保证高可用,大型项目推荐多集群模式

# standalone 表示单机模式
startup.cmd -m standalone

在这里插入图片描述
启动成功后,在浏览器输入日志中给出的地址即可打开Nacos控制台,Nacos默认使用8848端口,如果该端口被占用,记得在application.properties配置文件中进行修改。

6.登录控制台,出现以下界面时,说明我们的Nacos已经完全运行成功。开启Nacos鉴权后,Nacos第一次启动时会在数据库中添加一个账号密码均为nacos的超级管理员用于登录,使用该账号密码(nacos/nacos)登录即可。
在这里插入图片描述

二 服务注册

1.基础服务注册

1.我们新创建一个springboot项目,然后将Nacos整合进来。可以在创建项目时直接勾选上,也可以等创建完了再手动添加nacos依赖。
在这里插入图片描述
手动添加依赖:

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    <version>x.x.x.x</version>
</dependency>

这边建议直接勾选,因为勾选时会在项目中引入spring-cloud-alibaba-dependencies依赖,这个依赖会把和当前Springboot版本适配的依赖包都整合了进来,可以有效避免因为版本不兼容引起的冲突问题。

2.修改配置文件,在application.yml文件中编辑以下内容,运行即可。如果使用properties格式的配置文件,则按照properties格式编写即可。

server:
  port: 8088
spring:
  application:
    name: payServer # 应用名,即服务名,这里假设为payServer
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.16.192:8848 #  Nacos 服务器地址
        username: nacos  #  Nacos 账号
        password: 123456 #  Nacos 密码

编辑完成后还需要再启动类上增加 @EnableDiscoveryClient 注解,用于启动服务注册。

@SpringBootApplication
@EnableDiscoveryClient
public class PayServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(PayServerApplication.class, args);
    }
}

然后运行项目即可,项目运行成功后,即可在Nacos控制台的服务列表模块找到我们刚才注册的payServer服务。

在这里插入图片描述
至此,Nacos的服务注册功能完成。

2.永久服务注册配置

前边我们向Nacos注册的payServer服务,其实是一个临时服务。临时服务的特点在于:当服务关掉时将会被Nacos直接剔除,直接从服务列表消失。

这样就存在一个问题,当有很多服务时,我们无法一眼知道那些服务出现了问题。这种情况下,将服务注册为永久实例是一个很好的办法。

我们在配置文件中增加 ephemeral配置,并且赋值为 false,这样就可以将该实例注册为永久实例,配置之后重启该服务,它就会一直存在于服务列表中。

spring:
  application:
    name: payServer # 应用名,即服务名
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.16.192:8848 #  Nacos 服务器地址
        username: nacos   #  Nacos 账号
        password: 123456  #  Nacos 密码
        ephemeral: false  #  是否为临时实例

当永久实例出现问题时,服务列表会给与红色警示,以方便我们知道那些服务出现了问题。
在这里插入图片描述

注意:如果在重启时报错,可能是因为临时实例还没有被Nacos剔除出去导致的,这需要一点时间。我们可以在列表查询时关闭"隐藏空服务"选项,然后手动删除掉再重启。

需要解释一下,当一个服务的所有实例全部停掉后,该服务在服务列表中才会爆红。

特别注意:当一个服务被注册为永久服务后,它对应的实例将无法被直接删除,如果删除,则必须通过Nacos提供的API来删除。

3.保护阈值

保护阈值是一个百分比值健康实例数的占比小于保护阈值时才会触发,并且会在服务列表中以true显示来提示我们。

例如userServer有3个服务实例,我将它的保护阈值调整为0.5,这意味着至少有两个服务实例出现问题时才会触发保护阈值。

以下是几种状态的对比图,需要关注的地方,我已经进行了标注。

关闭一个服务实例:

在这里插入图片描述

关闭两个服务实例:

在这里插入图片描述

全部关闭后:
在这里插入图片描述

我们进入到服务详情里,也可以清晰的看到各个服务的详细状态,红色表示出现问题,绿色表示健康。
在这里插入图片描述

4.权重值

权重值可以是小数,也可以是整数。在负载均衡的过程中,权重值较小的服务实例,被实际访问到的比例也较小。
在这里插入图片描述
这一点在配置不同的服务器上显得尤为有用。对于性能好的服务器,我们可以调大它的权重值,让它承担更多的工作量,反之亦然。

另一方面,如果我们新修改了部分代码,希望放一部分用户进来测试一下,也可以调小它的权重,确认没问题了再调到正常值。

需要注意:在服务拥有多个实例时权重才有用,如果只有一个实例,那么权重值将不会产生任何作用。另外当权重值为0时,即便该服务实例正常,它也不会被访问。
在这里插入图片描述
如上图,三个实例被访问到的比例为2:1:0.5 。

5.集群

集群是一个范围上的概念,在实际中可以将它运用到区域或机房上面。

比如有两个机房,一个在西安,一个北京。我们希望西安的服务在调用其他服务时,优先调用西安的。那么我们就可以通过简单设置来实现这一需求。

Nacos内置了优先同集群调用的功能,我们只需要开启即可。

spring:
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.16.192:8848 #  Nacos 服务器地址
        username: nacos   #  Nacos 账号
        password: 123456  #  Nacos 密码
        ephemeral: false  #  是否为临时实例
        cluster-name: XIAN  # 集群名称
    loadbalancer:
      # 开启nacos负载均衡
      nacos:
        enabled: true

关键点:我这里使用的spring-cloud-alibaba 2021.0.5.0版本, 已经舍弃了Ribbon,改用 Spring Cloud LoadBalancer作为负载均衡中间件。

Spring Cloud LoadBalancer默认的负载均衡策略是轮询机制,它不像Ribbon那样经过简单配置即可,需要自定义去实现。

如果你使用的是RestTemplate,那么需要注册一个Bean对象来实现负载均衡,并且需要使用@LoadBalanced注解。

@Bean
@LoadBalanced
public RestTemplate restTemplate() {
    return new RestTemplate();
}

如果使用OpenFeign,则需要在启动类上添加@EnableFeignClients注解。

配置好服务的集群属性,并且开启同集群优先访问后,就可以重启服务了。
在这里插入图片描述
可以看到,我们的服务实例已经按照集群分成了两部分。这时候一个西安的服务需要要用上边的该服务,它就会优先调用西安集群下的。

6.命名空间

1.命名空间也是一个范围上的概念,它的范围包含了集群范围,并且不同命名空间下的服务实例相互隔离,不能相互访问。

在这里插入图片描述

命名空间常被用来做环境隔离,比如常用的开发环境,测试环境,正式环境等。

Nacos默认提供了一个保留关键字(public)环境,我们可以根据需求来创建不同的命名空间。
在这里插入图片描述

2.在Nacos的命名空间模块下,可以轻松地创建我们需要的命名空间。然后在服务列表中查看。

在这里插入图片描述

服务注册时,不设置命名空间,我们的服务实例会被默认注册到public空间下,假设我们想将服务注册到指定的空间(例如dev)下,则需要在项目的配置文件中添加namespace属性,并且填写 dev 空间的ID。

3.在服务列表模块下,切换到 dev 空间,然后点击红框标记出来的复制按钮,即可复制该命名空间的ID。当然,也可以直接在命名空间模块复制。
在这里插入图片描述

复制完成后,在项目的application.yml文件中进行配置,然后重启服务,就会发现我们的服务已经被注册到dev空间下了。

请注意,我这里为防止内容过多,删除了一些配置信息。

spring:
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.16.192:8848 #  Nacos 服务器地址
        username: nacos   #  Nacos 账号
        password: 123456  #  Nacos 密码
        namespace: 8cfaa93a-a864-4d68-bbbd-6f95c65e21f5 #  命名空间ID

对于命名空间,只需要记住各个命名空间之间是完全隔离的即可。
在这里插入图片描述

7.删除服务实例接口

DELETE /nacos/v1/ns/instance

请求参数及说明:

名称位置类型必选说明
namespaceIdquerystring命名空间
serviceNamequerystring服务名称
groupNamequerystring分组名称
clusterNamequerystring集群名称
ipquerystring服务IP
portqueryintegerIP端口
ephemeralqueryboolean是否临时实例
accessTokenquerystring鉴权Token

请求示例:

DELETE http://localhost:8848/nacos/v1/ns/instance?namespaceId=public&serviceName&groupName=DEFAULT_GROUP&clusterName=DEFAULT&ip&port&ephemeral&accessToken=eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJuYWNvcyIsImV4cCI6MTc0OTU1MjgyOH0.Jiy2SZKUyfLrCtAscxiaOQ5tis8RFP5eEfeqZNZHofk

更多API接口请参考官方文档。

三 配置管理

配置管理允许我们从Nacos控制台创建配置文件,然后在项目中远程调用,并且支持热更新。

1.创建配置文件

1.首先配置文件也受命名空间的管理,即项目调用的Nacos配置文件必须和项目在同一个命名空间下。

配置文件的名称格式,一般是 服务名-环境名-文件格式名。例如下图中的 orderServer-dev.yaml,这里的yaml不能简写为yml。

在这里插入图片描述
2.配置文件支持多格式,不过本人还是习惯yaml格式,我们为之前创建的payServer创建一个配置文件,并且填写一些内容。
在这里插入图片描述

填写完成后保存发布,然后在项目中进行其他配置。

2.引入关键依赖

1.首选需要引入spring-cloud-dependencies依赖,这是SpringCloud的重要依赖,我这里使用的是2021.0.6版本,可以与SpringCloud Alibab很好的兼容。注意它被引入到了 dependencyManagement 节点下

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>2021.0.6</version>
            <type>pom</type>
               <scope>import</scope>
          </dependency>
     </dependencies>
</dependencyManagement>

然后再继续引入我们需要的真正依赖。

<!--启用bootstrap.yml配置文件-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
<!--允许从Nacos加载配置,包括但不限于数据库,或其他配置信息-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

2.引入依赖完成后,需要创建一个bootstrap.yml文件,这个文件的加载时间早于application.yml,Nacos就是利用这一点实现了远程配置管理。

以下是一个简单的启动流程图。

3.修改项目配置

1.在项目的resources目录下,创建一个bootstrap.yml文件,由于项目启动时先加载bootstrap.yml文件,我们可以把application.yml的一部分配置信息移动到bootstrap.yml中来。

以下是application.yml文件内容:

server:
  port: 8088

2.以下是bootstrap.yml文件内容,nacos.config节点下就是配置中心的相关参数。

需要注意的地方两个地方:

  • 增加了profiles.active节点,并且赋值为 dev。
  • nacos.config节点下的大部分配置与discovery节点一样,主要就是多了一个file-extension属性,并且赋值为 yaml。
spring:
  profiles:
    active: dev
  application:
    name: payServer # 应用名,即服务名
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.16.192:8848 #  Nacos 服务器地址
        username: nacos   #  Nacos 账号
        password: 123456  #  Nacos 密码
        ephemeral: false  #  是否为临时实例
        cluster-name: XIAN  # 集群名称
        namespace: 8cfaa93a-a864-4d68-bbbd-6f95c65e21f5 #  命名空间
      config:
        server-addr: 192.168.16.192:8848 #  Nacos 服务器地址
        username: nacos   #  Nacos 账号
        password: 123456  #  Nacos 密码
        namespace: 8cfaa93a-a864-4d68-bbbd-6f95c65e21f5 #  命名空间
        file-extension: yaml   # 配置文件格式,默认为properties
        refresh-enabled: true # 热更新,默认为true

3.解释说明:项目读取Nacos配置中心的配置文件时,是按照一定规则来读的。具体规则为:

服务名-环境名.配置文件后缀名

我们可以从日志中看到一些信息。

在这里插入图片描述

从日志中可以看到,它默认会读取两个与服务名称相同的配置文件。第一个无后缀名,第二个是我们配置的yaml后缀名。而读取到的payServer-dev.yaml则是我们真正配置的文件,并且 dev 是我们当前项目的环境名。

最主要的,项目启动完成后,会持续监听这三个文件,因为这个热更新功能,默认是开启的。
在这里插入图片描述
当我们修改了Nacos远程配置文件时,项目的控制台也会给出日志提示。
在这里插入图片描述

从以上我们可以推断出,不带环境名和后缀名的Nacos配置文件,在同一个服务下是共享的,事实上也的确是这样。我们可以利用这一点,将一些公共配置信息放在以服务名命名的配置文件中,这样可以让实际开发和部署调试都变得更加轻松。

4.远程拉取配置信息

拉取配置信息有两种办法,一种是通过@Value注解注解读取某一个字段,另一种则是通过@ConfigurationProperties注解,将配置信息读取到对象中。

1.通过@Value读取

我们写一个简单的API接口,演示一下如何读取。

不过想要实现热更新,还需要在使用Nacos配置中心的地方加上@RefreshScope注解。这样一来,在Nacos配置中心修改配置文件后无需重启服务即可实现配置文件的更新。

@RestController
@RequestMapping("/pay")
@RefreshScope
public class PayController {
    // 通过@Value注解来读取配置内容
    @Value("${production.author}")
    private String name;

    @GetMapping("/info")
    public String info() {
        return name;
    }
}

编辑完成后,在浏览器访问:
在这里插入图片描述

2.通过@ConfigurationProperties读取

使用这种办法,需要创建一个字段和配置文件一致的类,并且设置读取的节点。根据payServer的配置文件,我们从production节点开始读取即可。

@ConfigurationProperties(prefix = "production")
@Component
@Data
public class ProductionConfig {
    private String name;
    private String version;
    private String remark;
}

然后修改控制器代码如下:

@RestController
@RequestMapping("/pay")
public class PayController {
    @Resource
    private ProductionConfig productionConfig;
    @GetMapping("/info")
    public String info() {
        return JSON.toJSONString(productionConfig);
    }
}

再次运行后在浏览器访问:

在这里插入图片描述

注意细节:使用@ConfigurationProperties读取Nacos远程配置信息时,不需要在使用的类上使用@RefreshScope注解,就可以实现热更新。

四 Nacos集群

单机模式的Nacos在开发调试阶段是很有用的,但是如果到了生产环境,单机模式的Nacos如果出现问题,那将带来灾难性的后果,所以在生产环境实现Nacos集群是一件非常重要的事情。

以下是Nacos集群的基本逻辑实例。数据库的主从集群不在这里演示。

在这里插入图片描述

1.基本配置

Nacos已经提供在配置集群需要的相关文件,我们只需要打开它然后修改即可。

进入到Nacos的conf目录,找到cluster.conf.example文件,然后复制一份,将名称修改为cluster.conf,这就是Nacos提供的用来配置集群的关键性文件。
在这里插入图片描述

2.配置服务器IP及端口

打开cluster.conf配置文件,将集群中所有的服务器地址及IP都放到集群列表中去。
在这里插入图片描述

由于我这里是本地,所以就复制了三份,然后用端口来区分。实际部署使用真实的服务IP和端口即可。

配置完成之后使用 startup.cmd 启动就行,这次不需要任何参数。

留意观察,集群部署的Nacos和单机模式略有区别,它会把节点列表都罗列出来。
在这里插入图片描述
全部启动后即可进行下一步。

3.配置Nginx

全部启动完成后,利用Nginx的负载均衡功能做代理转发,即可完成Nacos的集群部署。

Nginx的配置内容:

http {
    upstream nacos-server {
        least_conn;
        server 192.168.16.192:8844;
        server 192.168.16.192:8846;
        server 192.168.16.192:8848;
    }
    server {
        listen       1234;
        server_name  localhost;
        location / {
            proxy_pass http://nacos-server;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_http_version 1.1;
            proxy_set_header Connection '';
            proxy_connect_timeout 60s;
            proxy_send_timeout 120s;
            proxy_read_timeout 120s;
        }
    }
}

然后启动Ngxin,在浏览器访问http://localhost:1234/nacos,完成登录后,可以在Nacos控制台的集群管理中看到各节点的状态。
在这里插入图片描述

五 Nacos配置参数大全

以下是Nacos各项配置的默认值及备注说明,仅供参考。

spring:
  application:
    name: your-application-name # 应用名称,用于注册到Nacos的服务名及匹配对应的Data ID
  cloud:
    nacos:
      # 🔹 配置中心 Config Management
      config:
        server-addr: 127.0.0.1:8848 # Nacos Server地址(必填)
        file-extension: yaml        # 配置文件格式,可选:properties/yaml/json,默认properties
        group: DEFAULT_GROUP        # 配置分组,默认DEFAULT_GROUP
        namespace:                  # 命名空间ID,用于多环境隔离(如 dev/test/prod),留空则为public命名空间
        timeout: 3000               # 读取超时时间,单位毫秒,默认3000ms
        username: nacos             # 访问Nacos配置中心的用户名(如果开启了认证)
        password: nacos             # 密码(如果开启了认证)
        refresh: true               # 是否启用自动刷新配置(推荐开启)
        extension-configs:          # 加载多个DataId的配置文件(数组形式)
          - data-id: common.yaml    # 要加载的额外Data ID
            group: DEFAULT_GROUP    # 对应的分组
            refresh: true           # 是否动态刷新该配置
        shared-configs:             # 共享配置(类似extension-configs,但优先级更低)
          - data-id: shared.yaml
            group: DEFAULT_GROUP
            refresh: true

      # 🔹 服务发现 Service Discovery
      discovery:
        server-addr: 127.0.0.1:8848 # Nacos Server地址(必填)
        service: ${spring.application.name} # 注册的服务名,默认为spring.application.name
        weight: 1                   # 权重值,范围是0~1,数值越高优先级越高
        cluster-name: DEFAULT       # 集群名称,默认DEFAULT
        group: DEFAULT_GROUP        # 分组,默认DEFAULT_GROUP
        namespace:                  # 命名空间ID,用于多环境隔离
        username: nacos             # 登录Nacos用户名(如果启用了认证)
        password: nacos             # 登录密码
        metadata:                   # 自定义元数据(键值对)
          version: 1.0.0
        heartbeat: true             # 是否启用心跳机制,默认true
        enabled: true               # 是否启用服务注册发现功能,默认true
        register-enabled: true      # 是否注册本服务到Nacos,默认true
        fetch-enabled: true         # 是否从Nacos获取服务列表,默认true
        fail-fast: true             # 启动失败是否抛异常,默认true
        ip: 127.0.0.1               # 自定义注册IP,默认自动识别
        port: 8080                  # 自定义注册端口,默认当前服务端口
        secure: false               # 是否启用HTTPS,默认false
        ephemeral: true             # 是否临时节点(非持久化),默认true
        health-check-type: TCP      # 健康检查方式,可选TCP/HTTP/MYSQL,默认TCP
        heart-beat-interval: 5000   # 心跳间隔时间(毫秒),默认5000
        service-heart-beat-timeout: 15000 # 心跳超时时间,超过这个时间未收到心跳则标记为不健康
        service-renewal-period: 10000 # 客户端续约周期(毫秒),默认10000

完结撒花!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值