暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Nacos的使用及集群搭建

Java摆渡人 2022-02-15
1371

1. Nacos的基本使用

1.1 Nacos的简介和下载

Nacos
(Dynamic Naming and Configuration Service) 致力于解决微服务中的统一配置、服务注册与发现等问题。它提供了一组简单易用的特性集,帮助开发者快速实现动态服务发现、服务配置、服务元数据及流量管理。

Nacos = Eureka + Config + Bus

下载地址
:https://github.com/alibaba/nacos/releases

1.2 Nacos的安装

# 1.将下载的安装包放到/opt目录并解压
 > sudo tar -zxvf nacos-server-1.4.0.tar.gz
# 2.运行bin目录下的startup.sh
 > sudo sh startup.sh -m standalone
# 3.启动完成后访问http://127.0.0.1:8848/nacos
 默认用户名/密码:nacos/nacos

Nacos依赖Java环境,并且要求使用JDK1.8以上版本。

1.3 Nacos集成Spring Boot实现服务注册与发现

  • 新建一个Spring Boot工程cloudalibaba-provider-payment,作为服务提供者。

  • 修改pom文件,添加mvn依赖。

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

  • 在application.yml文件中添加以下配置。

    server:
      port: 9001
    spring:
      application:
        name: nacos-payment-provider
      cloud:
        nacos:
          discovery:
            server-addr: localhost:8848
    management:
      endpoints:
        web:
          exposure:
            include: '*'

  • 创建PaymentController类,添加以下业务代码,用来做测试,非Nacos配置。

    @RestController
    public class PaymentController {
        @Value("${server.port}")
        private String serverPort;

        @GetMapping(value = "/payment/nacos/{id}")
        public String getPayment(@PathVariable("id") Integer id) {
            return "nacos registry, serverPort:" + serverPort + "\t id:" + id;
        }
    }

  • 运行主启动类PaymentApp。

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

  • 回到Nacos控制台,可以看到已经注册到服务列表


1.4 Nacos的负载均衡

Nacos自带负载均衡
,原因是Nacos依赖中集成了Ribbon。

  • 参照上述步骤,克隆一份端口为9002的项目作为另一个服务提供者,用于演示负载均衡。

  • 新建Spring Boot工程cloudalibaba-consumer-nacos-order,用来做服务消费者。

  • 修改pom文件,添加以下依赖,与服务提供方一致。

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

  • 修改application.yml文件,添加以下配置

    server:
      port: 83
    spring:
      application:
        name: nacos-order-consumer
      cloud:
        nacos:
          discovery:
            server-addr: localhost:8848
    # 消费者将要去访问的微服务名称(注册成功到nacos的微服务提供者)
    # 非Nacos配置
    service-url:
      nacos-user-service: http://nacos-payment-provider

  • 创建OrderController类,添加如下业务代码,用于测试。

    @RestController
    public class OrderController {
        @Resource
        private RestTemplate restTemplate;
        @Value("${service-url.nacos-user-service}")
        private String serviceURL;

        @GetMapping(value = "/consumer/payment/nacos/{id}")
        public String paymentInfo(@PathVariable("id") Integer id) {
            return restTemplate.getForObject(
                    serviceURL + "/payment/nacos/" + id, 
                    String.class);
        }
    }

  • 创建JavaConfig类,将RestTemplate注入Spring容器。

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

  • 运行主启动类OrderNacosApp及两个服务提供者9001/9002。

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

  • 负载均衡效果演示。

2. Nacos做服务配置中心

2.1 项目准备及基本配置

首先创建一个基于Spring Boot的项目,并集成Nacos配置中心。

  • 创建一个工程cloudalibaba-config-nacos-client。

  • 添加Nacos Config相关mvn依赖。

    <dependency>
     <groupId>com.alibaba.cloud</groupId>
     <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    </dependency>

  • 在application.yml中添加如下配置。

    spring:
      profiles:
        active: dev # 表示开发环境

  • 在bootstrap.yml中添加如下配置。

    server:
      port: 3377
    spring:
      application:
        name: nacos-config-client
      cloud:
        nacos:
          discovery:
            # Nacos作为服务注册中心地址
            server-addr: localhost:8848
          config:
            # Nacos作为服务配置中心地址
            server-addr: localhost:8848
            file-extension: yaml

  • 创建ConfigClientController类,用于从Nacos Server获取动态配置。

    @RestController
    @RefreshScope // 支持Nacos的动态刷新功能
    public class ConfigClientController {
        @Value("${config.info}")
        private String configInfo;

        @GetMapping("/config/info")
        public String getConfigInfo(){
            return configInfo;
        }
    }

  • 进入Nacos控制台,“配置管理” -> “配置列表” ->点击**“+”**创建配置。


DataID规则
{spring.profiles.active}.${spring.cloud.nacos.config.file-extension}

  • 启动服务并测试。

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

    执行以下命令

    curl http://localhost:3377/config/info

    可以获得如下返回结果

    config info for dev,from nacos config center.

Nacos Config自带动态刷新
:在控制台修改配置值,重新请求会获得最新的结果。

2.2 Nacos Config的分类配置

Nacos提供了解决多环境多项目的方案,使用Namespace+Group+Data ID来区分。默认情况下:Namespace=public,Group=DEFAULT_GROUP,Cluster是DEFALUT。

# Namespace 命名空间
 Namespace用于解决多环境多租户数据的隔离问题。在不同的Namespace下,可以存在相同的Group或DataId。
# Group 组
 Group是Nacos中用来实现Data ID分组管理的机制。对于Group的用法,没有固定的规定,比如它可以实现不同环境下的DataId的分组,也可以实现不同应用或组件下使用相同配置类型的分组,比如database_url。
# Data ID 配置集ID
 Data ID是Nacos中某个配置集的ID,它通常用于组织划分系统的配置集。比如通过配置文件名字来进行划分,或者通过Java包的全路径来划分,主要取决于Data ID的使用纬度。

官方的建议是,通过Namespace来区分不同的环境,而Group可以专注在业务层面的数据分组。

2.2.1 Data ID方案

目的
:指定spring.profile.active和配置文件的DataID来使不同环境下读取不同配置。

新建一个Data ID名称为nacos-config-client-test.yaml的配置文件。

  • 修改3377的application.yaml配置,切换环境。

    spring:
      profiles:
        #active: dev # 表示开发环境
        active: test # 表示测试环境

  • 重启3377服务,执行以下命令。

    curl http://localhost:3377/config/info

    可以获得如下返回结果。

    config info for test,from nacos config center. version=1

2.2.2 Group方案

目的
:测试Group的分组管理机制

  • 新建一个名为TEST_GROUP组的配置。

  • 再新建一个名为DEV_GROUP组的配置。


  • 当前状态:相同Namespace,相同配置文件,不同组。

  • 在bootstrap.yml下增加一条group的配置,配置为两个组的任意一组皆可。

    spring:
      cloud:
        nacos:
          config:
            file-extension: yaml
            group: DEV_GROUP

    切换application.yml的环境为info。

    spring:
      profiles:
        active: info

  • 重启服务,执行以下命令。

    curl http://localhost:3377/config/info

    可以获得如下返回结果。

    nacos-config-client-info.yaml,DEV_GROUP,version=1

2.2.3 Namespace方案

目的
:使用Namespace实现多环境管理

  • 新建dev/test的命名空间。


  • 在test命名空间新建一个与public命名空间内相同的配置文件nacos-config-client-test.yaml。

  • 在bootstrap.yml中添加namespace,group配置。

    spring:
      cloud:
        nacos:
          config:
            file-extension: yaml
            group: TEST_GROUP
            namespace: fee9915c-0cb2-463f-b5ab-d19e200a4ca2

    切换application.yml的环境为test。

    spring:
      profiles:
        active: test

  • 重启服务,执行以下命令。

    curl http://localhost:3377/config/info

    可以获得如下返回结果。

    from test namespace,nacos-config-client-test.yaml,TEST_GROUP

3. Nacos集群和持久化配置 3.1 安装环境要求

  • 64 bit OS Linux/UNIX/Mac,推荐使用Linux系统
  • 64 bit JDK 1.8及以上,下载并配置。
  • Maven 3.2.x及以上,下载并配置。
  • 3个或3个以上Nacos节点才能构成集群。
  • MySQL数据库5.6.5及以上。

3.2 Nacos集群配置

在Nacos的conf目录下包含以下文件。

  • application.properties
    :Spring Boot项目默认的配置文件。
  • cluster.conf.example
    :集群配置样例文件。
  • nacos-mysql.sql
    :MySQL数据库脚本。Nacos支持Derby和MySQL两种持久化机制,默认采用Derby数据库。如果采用MySQL,需要运行该脚本创建数据库和表。
  • nacos-logback.xml
    :Nacos日志配置文件。

3.2.1 配置MySQL数据库

  • 新建nacos-config库,将配置文件中的nacos-mysql.sql在数据库中执行。

  • 修改application.properties配置文件,增加如下配置。

    spring.datasource.platform=mysql
    db.num=1
    db.url.0=jdbc:mysql://localhost:3306/nacos-config
    db.user=root
    db.password=Lmg12580

3.2.2 修改集群配置cluster.conf

10.53.0.251:3333
10.53.0.251:4444
10.53.0.251:5555

这个IP不能写127.0.0.1,必须是Linux命令hostname -i能够识别的IP。

3.2.3 修改启动脚本

编辑Nacos启动脚本startup.sh,使它能够接受不同的启动端口。

修改完以后,就可以通过命令 ./startup.sh -n 3333
启动端口号为3333的服务实例。

3.2.4 Nginx的配置

修改Nginx配置如下,改完后启动。3.2.5 测试通过Nginx访问Nacos

目前的状态:一个Nginx,三个Nacos,一个MySQL

  • 启动三个Nacos服务,进入Nacos的bin目录下:

    ./startup.sh -n 3333
    ./startup.sh -n 4444
    ./startup.sh -n 5555

  • 在浏览器输入地址: http://localhost:1111/nacos/

3.2.6 验证MySQL配置的正确性

  • 随便新建一个配置文件

  • 查看config_info表,可以看到刚才的配置信息,说明MySQL配置成功。

3.2.7 验证集群配置的正确性

将上述9002服务注册到Nacos集群。

  • 修改application.yml文件,换成nginx的地址。

    spring:
      application:
        name: nacos-payment-provider
      cloud:
        nacos:
          discovery:
            server-addr: localhost:1111 

  • 重启9002服务,在Nacos控制台服务列表中可以查看到注册成功。

  • Nacos集群搭建成功(^_^)v

文章转载自Java摆渡人,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论