Nacos 是 Spring Cloud Alibaba 中一个重要的组成部分,它提供了两个重要的功能:服务注册与发现和统一的配置中心功能。

服务注册与发现功能解决了微服务集群中,调用者和服务提供者连接管理和请求转发的功能,让程序的开发者无需过多的关注服务提供者的稳定性和健康程度以及调用地址,因为这些都可以依靠 Nacos 进行监测、管理和自动转发。

试想一下,当一个系统被部署多个之后,如何确定要调用哪一个(服务)实例?当某个被调用的实例出现问题时,又如何将请求转发到其他实例上?这些问题都是微服务架构中现实存在的问题,然而使用 Nacos 就可以轻松的解决这些问题。并且 Nacos 也提供了统一的配置中心,解决了之前项目配置文件存放在本地或 github 上的安全性问题,并且支持动态修改和统一维护配置文件的功能。

1.Nacos 简介

Nacos 是 Dynamic Naming and Configuration Service 的首字母简称;它是⼀个更易于构建云原生应用的动态服务发现、配置管理和服务管理的平台。

官网:https://nacos.io/

仓库源码:https://github.com/alibaba/nacos

2.Nacos 生态

Nacos 几乎支持所有主流语言,其中 Java/Golang/Python 已经支持 Nacos 2.0 长链接协议,能最大限度发挥 Nacos 性能。阿里微服务 DNS(Dubbo+Nacos+Spring-cloud-alibaba/Seata/Sentinel)最佳实践,是 Java 微服务生态最佳解决方案。

3.Nacos 快速部署

Nacos 支持 3 种部署模式:

  1. 单机部署
  2. 集群部署
  3. 多集群部署

Nacos 安装方式有以下 2 种:

  1. 使用源码安装。
  2. 使用已编译好的安装包进行安装。

本文我们将使用第一种方式加 Docker,来快速部署 Nacos 服务器端。

3.1 预备环境准备

Nacos 依赖 Java 环境来运行,如果您是从代码开始构建并运行 Nacos,还需要为此配置 Maven 环境,请确保是在以下版本环境中安装使用:

  • 64 bit OS,支持 Linux/Unix/Mac/Windows,推荐选用 Linux/Unix/Mac。
  • 64 bit JDK 1.8+。
  • Maven 3.2.x+。

安装 Open JDK 8

安装完之后,使用 java -version 检查是否安装成功,如下图所示:

若显示具体的 Java 版本则表示安装成功。

3.2 下载 Nacos

本文使用 git 的方式来下载 Nacos 源码包,所以需要使用以下命令来先安装 git:

下载 Nacos 源码:

下载完成如下图所示:

进入 Nacos 目录:

3.3 启动 Nacos 服务

Nacos 的运行是需要数据库的,它支持两种数据库:本地数据库 Derby、和 MySQL 数据库。
所以对应的启动命令有以下几种:

  • Derby 数据库运行单机模式:docker-compose -f example/standalone-derby.yaml up
  • MySQL 5.7 数据库运行单机模式:docker-compose -f example/standalone-mysql-5.7.yaml up
  • MySQL 8 数据库运行单机模式:docker-compose -f example/standalone-mysql-8.yaml up

启动成功如下图所示:

3.3 访问Nacos

启动成功之后,就可以使用 http://127.0.0.1:8848/nacos/#... 来访问 Nacos 的管理控制台了,如下图所示:

用户名和密码都输入 nacos 就可以进入系统了,如下图所示:

3.4 常见报错问题

3.4.1 docker-compose 命令未找到

docker-compose 是用于定义和运行多容器 Docker 应用程序的编排工具。使用 docker-compose 后不再需要逐一创建和启动容器。您可以使用 YML 文件来配置应用程序需要的所有服务,然后使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。
但是 docker-compose 需要单独安装,否则会出现以下错误:

解决方案:

cd /usr/local/bin
wget https://github.com/docker/compose/releases/download/1.14.0-rc2/docker-compose-Linux-x86_64
rename docker-compose-Linux-x86_64 docker-compose docker-compose-Linux-x86_64
chmod +x /usr/local/bin/docker-compose
docker-compose version

安装成功如下图所示:

3.4.2 image:invalid reference format

使用 docker-compose 可能会提示“ERROR: no such image: nacos/nacos-server:: invalid reference format”,无效的参数格式,如下图所示:

解决方案:修改 Nacos 源码中 example/standalone-mysql-5.7.yaml 的配置项,将“image: nacos/nacos-server:{{NACOS_VERSION}}”,修改为:“image: nacos/nacos-server:latest”。

4.Spring Cloud Alibaba 服务注册

服务注册者也就是生产者,是微服务中的服务提供者。它是以 Spring Boot 项目为基础创建的,具体操作步骤如下:

创建项目使用阿里云的地址 http://start.aliyun.com 来创建 Spring Cloud Alibaba Nacos 项目,点击下一步 Next,如下图所示:

增加 Nacos Service Discovery 框架支持,如下图所示:

再添加 Spring Web(Spring MVC)框架的支持,最后点击 Finish 完成项目创建。

4.1 项目依赖

Spring Cloud Alibaba Nacos 项目主要有两个依赖项,如下内容所示:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
  <groupId>com.alibaba.cloud</groupId>
  <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

4.2 修改配置文件

在配置文件 application.properties 中要填写 Nacos 的相关信息,具体内容如下:

# 应用名称(也是 Nacos 中的服务名)
spring.application.name=spring-cloud-nacos-producer
# 应用服务 WEB 访问端口
server.port=8082
# Nacos认证信息
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos
# Nacos 服务发现与注册配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口
spring.cloud.nacos.discovery.server-addr=mse-6d50f4f0-p.nacos-ans.mse.aliyuncs.com:8848
# 注册到 nacos 的指定 namespace,默认为 public
spring.cloud.nacos.discovery.namespace=public

4.3 添加代码

接下来添加一个 Restful API 的接口,给后面的服务调用者使用,具体实现代码如下:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
@EnableDiscoveryClient
public class SpringCloudNacosProducerApplication {

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

    @RequestMapping("/sayhi/{name}")
    public String sayHi(@PathVariable String name) {
        return "Hi Nacos Discovery " + name;
    }
}

编写完代码之后,运行项目,观察 Nacos 中的服务列表就可以看到此项目,如下图所示:

经过以上操作,我们创建的 Spring Cloud Alibaba 的项目就被注册到 Nacos 中了,其他程序也可以通过 Nacos 对它进行调用了。

5.Spring Cloud Alibaba 服务发现

与上面创建方式类似,接下来我们再创建一个服务调用者,也叫做消费者来调用上面框架中的 sayhi 方法,具体操作步骤如下。

5.1 创建项目


5.2 修改配置文件

# 应用名称
spring.application.name=springcloud-nacos-consumer
# 应用服务 WEB 访问端口
server.port=8082
# Nacos帮助文档: https://nacos.io/zh-cn/docs/concepts.html
# Nacos认证信息
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos
# Nacos 服务发现与注册配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口
spring.cloud.nacos.discovery.server-addr=82.157.146.10:8848
# 注册到 nacos 的指定 namespace,默认为 public
spring.cloud.nacos.discovery.namespace=public

5.3 添加代码

消费者的实现代码有两个类,在启动类中添加一个 RestTemplate 的 Bean 对象,用于提供 Restful API 的请求,启动类的具体实现代码如下:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
@EnableDiscoveryClient
public class SpringcloudNacosConsumerApplication {

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

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

消费者的具体实现代码如下:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
public class TestController {
    @Autowired
    private RestTemplate restTemplate;

    @RequestMapping("/hi")
    public String hi(String name) {
        // 调用生产者 sayhi 方法,并返回结果
        return restTemplate.getForObject("http://spring-cloud-nacos-producer/sayhi/" + name,
                String.class);
    }
}

添加完代码之后,运行程序,在 Nacos 的服务列表中可看到以下内容:

之后访问消费者的 hi 方法,让其调用生产者的实现效果如下:

从上述结果可以看出,消费者通过 Nacos 已经成功的调用到了生产者 spring-cloud-nacos-producer 中的 sayhi 方法了。

小结

Nacos 提供了两个重要的功能:服务注册与发现和统一配置中心的功能,它提供了 3 种部署方式:单机部署、集群部署和多集群部署,以及两种安装方式:源码安装和安装包安装。我们使用的是 Docker 加 Nacos 源码的方式来安装和部署 Nacos 的。Nacos 服务注册和发现都需要添加 Nacos Service Discovery 框架的支持,且在配置文件中配置相应的 Nacos 信息,才可以正确的实现服务的注册和发现功能。

参考&鸣谢

《Nacos框架与原理》

03-05 23:31