一、Nacos介绍

阿里巴巴在2018年7月份发布Nacos, Nacos是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。Nacos 支持几乎所有主流类型的服务的发现、配置和管理:

  • Kubernetes Service
  • gRPC & Dubbo RPC Service
  • Spring Cloud RESTful Service

二、Nacos有哪些功能

  • 服务发现和服务健康监测

Nacos 支持基于 DNS 和基于 RPC 的服务发现。服务提供者使用 原生SDKOpenAPI、或一个独立的Agent TODO注册 Service 后,服务消费者可以使用DNS TODOHTTP&API TODO查找和发现服务。

Nacos 提供实时健康检查,阻止服务向不健康的主机或服务实例发送请求。Nacos 支持传输层(PING 或 TCP)和应用层(如 HTTP、Redis、MySQL、用户自定义)的健康检查。 对于复杂的云环境和网络拓扑环境中(如 VPC、边缘服务等)服务的健康检查,Nacos 提供了 agent 模式和服务端2种健康检查模式。Nacos 还提供统一的健康检查仪表盘,帮助您管理服务可用性及流量。

  • 动态配置服务

动态配置服务可以让您以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。

动态配置消除了配置变更时重新部署应用和服务的需要,让配置变得更加高效和敏捷。

配置中心化管理让无状态服务实现变得更简单,让服务按需弹性扩展变得更容易。

Nacos 提供了一个 简单易用的UI TODO 帮助您管理所有的服务和应用的配置。Nacos 还提供包括配置版本跟踪、金丝雀发布、回滚配置以及客户进程配置更新状态跟踪在内的一系列开箱即用的配置管理特性,帮助您更安全地管理配置变更和控制配置变更的风险。

  • 动态 DNS 服务

动态 DNS 服务支持权重路由,让您更容易地实现中间层负载均衡、更灵活的路由策略、流量控制以及数据中心内网的简单DNS解析服务。动态DNS服务还能让您更容易地实现以DNS协议为基础的服务发现,以消除耦合到厂商私有服务发现API上的风险。

Nacos 提供了一些简单的 DNS APIs TODO 帮助您管理服务的关联域名和可用的 IP:PORT 列表.

  • 服务及其元数据管理

Nacos 能让您从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略、服务的 SLA 以及最首要的 Metrics 统计数据。

三、Nacos部署

Nacos不止支持二进制部署也支持支持Docker和K8S部署,因为Nacos是有状态服务存储的数据需要依赖于Mysql而且集群的方式需要指定slave的IP所以使用K8S并不是很好的选择(K8S使用StatefulSet来运行有状态服务),笔者这里用Docker-Composer的方式来运行Nacos

Nacos官方Docker部署方式Git地址:GitHub - nacos-group/nacos-docker: This project contains a Docker image meant to facilitate the deployment of Nacos .

git clone https://github.com/nacos-group/nacos-docker.git
单机部署(内存模式):
docker-compose -f example/standalone-derby.yaml up
单机部署(Mysql模式):
docker-compose -f example/standalone-mysql.yaml up
集群部署:
docker-compose -f example/cluster-hostname.yaml up

访问:http://localhost:8848/nacos/ 就可以看到登录界面了

PS:默认用户名和密码都是 nacos

nacos无损下线springboot nacos spring cloud_nacos无损下线springboot

nacos无损下线springboot nacos spring cloud_spring cloud_02

四、快速开始

1、 下载安装包(Win10下载第二个直接使用)

nacos无损下线springboot nacos spring cloud_spring cloud_03

图2  Nacos安装包

2、 启动Nacos服务(不同环境启动方式,standalone意为单机环境)

Linux/Unix/Mac:

Windows:

startup.sh -m standalone

startup.cmd -m standalone

nacos无损下线springboot nacos spring cloud_nacos无损下线springboot_04

图3  Nacos启动界面

打开http://192.168.203.42:8848/nacos/index.html,默认账号密码都是Nacos

nacos无损下线springboot nacos spring cloud_spring_05

图4  Nacos网页管理界面

3、  API测试

Nacos提供了Open API 指南(https://nacos.io/zh-cn/docs/open-api.html),使用者可以根据接口的形式通过curl或者Postman软件进行接口测试。

3.1、服务注册

curl -X POST 'http://127.0.0.1:8848/nacos/v1/ns/instance?serviceName=nacos.naming.serviceName&ip=20.18.7.10&port=8080'

nacos无损下线springboot nacos spring cloud_java_06

图5  Postman模拟发送请求

nacos无损下线springboot nacos spring cloud_java_07

图6  服务注册

3.2、服务发现

curl -X GET 'http://127.0.0.1:8848/nacos/v1/ns/instance/list?serviceName=nacos.naming.serviceName'

nacos无损下线springboot nacos spring cloud_nacos无损下线springboot_08

图7  服务发现

3.3、发布配置

curl -X POST "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test&content=helloWorld"

nacos无损下线springboot nacos spring cloud_spring_09

图8  Postman模拟发布配置

nacos无损下线springboot nacos spring cloud_spring cloud_10

图9  Nacos配置界面

3.4、获取配置

curl -X GET "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test"

nacos无损下线springboot nacos spring cloud_spring cloud_11

图10  Postman模拟获取配置

3.5:  关闭服务

Linux/Unix/Mac

Windows

sh shutdown.sh

shutdown.cmd

五、使用Nacos注册中心功能

1、生产者服务

第一步:创建一个nacos-test项目,包含两个模块nacos-provider和nacos-consumer,在父项目pom.xml文件统一管理springboot、spring cloud和spring cloud alibaba版本。

<dependencyManagement>
    <dependencies>
        <!--spring-boot-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>2.1.2.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <!-- spring-cloud -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Greenwich.SR2</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <!-- spring-cloud-alibaba -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>2.1.0.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

第二步:先来处理nacos-provider模块项目,在nacos-provider模块项目的pom.xml配置alibaba-nacos-discovery依赖。

<dependencies>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.0</version>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <!--nacos注册中心-->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
</dependencies>

第三步:编写入口类NacosProvider ,并添加一个EchoController 提供HTTP接口服务。

@SpringBootApplication
@EnableDiscoveryClient
public class NacosProvider {

    public static void main(String[] args) {
        SpringApplication.run(NacosProvider.class,args);
    }

    @RestController
    class EchoController {

        @GetMapping("/echo/{string}")
        public String echo(@PathVariable String string) {
            return "Hello Nacos Discovery " + string;
        }
    }

}

第四步:在bootstrap.yml文件配置nacos配置中心相关参数。

spring:
  application:
    name: nacos-provider
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.0.127:8848 #注册中心地址
server:
  port: 17357

第五步:运行nacos-provider,可以从启动日志看到注册到了nacos,打开nacos管理台在服务管理菜单下的服务列表项可以看到注册的实例信息。

nacos无损下线springboot nacos spring cloud_spring_12

2、消费者服务

第一步:接下来处理nacos-consumer模块项目,在nacos-consumer模块项目的pom.xml配置同样加上alibaba-nacos-discovery依赖。

<dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.0</version>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!--注册中心-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
    </dependencies>

第二步:编写入口类NacosConsumer ,并添加一个TestController提供HTTP接口服务,通过RestTemplate远程调用NacosProvider。

@SpringBootApplication
@EnableDiscoveryClient
public class NacosConsumer {

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

    public static void main(String[] args) {
        SpringApplication.run(NacosConsumer.class,args);
    }

    @RestController
    public class TestController {

        private final RestTemplate restTemplate;

        @Autowired
        public TestController(RestTemplate restTemplate) {this.restTemplate = restTemplate;}

        @GetMapping("/echo/{str}")
        public String echo(@PathVariable String str) {
            return restTemplate.getForObject("http://nacos-provider/echo/" + str, String.class);
        }

    }

}

第三步:在bootstrap.yml文件配置nacos配置中心相关参数。

spring:
  application:
    name: nacos-consumer
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.0.127:8848 #注册中心地址
server:
  port: 17358

第四步:测试消费者调用提供者接口服务。

 nacos默认使用了ribbon做客户端负载均衡。

nacos无损下线springboot nacos spring cloud_java_13

 完结,撒花。