微服务架构 | 3.2 Alibaba Nacos 注册中心

本文涉及的产品
云原生网关 MSE Higress,422元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: Nacos 致力于解决微服务中的统一配置、服务注册与发现等问题。它提供了一组简单易用的特性集,帮助开发者快速实现动态服务发现、服务配置、服务元数据及流量管理;

前言

参考资料
《Spring Microservices in Action》
《Spring Cloud Alibaba 微服务原理与实战》
《B站 尚硅谷 SpringCloud 框架开发教程 周阳》
《Nacos 官网》

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


1. Nacos 基础知识

1.1 Nacos 命名方式

  • 前四个字母分别为 Naming 和 Configuration 的前两个字母,最后的 s 为 Service;

1.2 Nasoc 是什么

  • 一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台;
  • Nacos: Dynamic Naming and Configuration Service;
  • Nacos 是注册中心 + 配置中心的组合,相当于:Nacos = Eureka+Config +Bus;

1.3 Nacos 的 4 个关键特性

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

    • Nacos 支持基于 DNS 和基于 RPC(HTTP&API)的服务发现;
    • Nacos 提供对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求;
    • 对于复杂的云环境和网络拓扑环境中(如VPC、边缘网络等)服务的健康检查,Nacos 提供了 agent 上报和服务端主动检测两种健康检查模式;
    • Nacos 还提供了统一的健康检查仪表盘,帮助用户根据健康状态管理服务的可用性及流量;
  • 动态配置服务

    • Nacos 提供了一个简洁易用的 UI(控制台样例 Demo)帮助用户管理所有服务和应用的配置;
    • Nacos 还提供了包括配置版本跟踪、金丝雀发布、一键回滚配置及客户端配置更新状态跟踪在内的一系列开箱即用的配置管理特性;
  • 动态 DNS 服务

    • 动态 DNS 服务支持权重路由,让开发者更容易地实现中间层负载均衡、更灵活的路由策略、流量控制,以及数据中心内网的简单 DNS 解析服务;
  • 服务及其元数据管理

    • Nacos 可以使开发者从微服务平台建设的视角管理数据中心的所有服务及元数据;
    • 包括;管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略、服务的 SLA 及最重要的 metrics 统计数据;

1.4 Nacos 生态图

Nacos 生态图

1.5 Nacos 架构图

Nacos 架构图

  • 服务提供者通过 VIP(Virtual IP)访问 Nacos Server 高可用集群,基于 Open API 完成服务的注册和服务查询;
  • Nacos Server 本身可以支持主备模式,所以底层会采用数据一致性算法来完成从节点的数据同步;
  • 服务消费者也是如此,基于 Open API 从 Nacos Server 中查询服务列表;

逻辑架构及其组件介绍

1.6 Nacos 支持 AP 和 CP 模式的切换

  • 简单来说

    • C 是所有节点在同一时间看到的数据是一致的;而 A 的定义是所有的请求都会收到响应;
  • 模式选择

    • 如果不需要存储服务级别的信息且服务实例是通过 nacos-client 注册,并能够保持心跳上报,那么就可以选择 AP 模式;
    • 当前主流的服务如 Spring cloud 和 Dubbo 服务,都适用于 AP 模式,AP 模式为了服务的可能性而减弱了一致性,因此 AP 模式下只支持注册临时实例;
    • 如果需要在服务级别编辑或者存储配置信息,那么 CP 是必须, K8S 服务和 DNS 服务则适用于 CP 模式;
    • CP 模式下则支持注册持久化实例,此时则是以 Raft 协议为集群运行模式,该模式下注册实例之前必须先注册服务,如果服务不存在,则会返回错误;
  • 切换模式

    • curl -X PUT '$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP'

1.7 Nacos 文件结构说明

  • bin 目录:服务启动/停止脚本;
  • conf 目录:配置文件;

    • application.properties 文件:Spring Boot 项目默认的配置文件;
    • cluster.conf.example:集群配置样例文件;
    • nacos-mysql.sql:MySQL 数据库脚本;
    • nacos-logback.xml:Nacos 日志配置文件;
  • data 目录:Derby 数据库存储;
  • logs 目录:日志;
  • target 目录:编译打包后的文件;

1.8 Nacos 服务注册与发现的源码分析

  • 由于篇幅有限,该内容放在:[《微服务架构 | *3.5 Nacos 服务注册与发现的源码分析》]();


2. 安装并运行 Nacos 服务器

Nacos 依赖 Java 1.8 以上环境,有两种安装方式:使用已经编译好的安装包和源码部署;由于《*3.5 Nacos 服务注册与发现的源码分析》要对 Nacos 源码进行分析,这里推荐源码部署;
这里选择的版本是 2.0.3;

2.1 安装包安装 Nacos 服务器

2.1.1 下载 Nacos

下载 Nacos

2.1.2 直接运行报错

  • 下载解压后如图:

运行 Nacos.png

  • 直接双击运行 startup.cmd 会报错:
org.springframework.context.ApplicationContextException: Unable to start web server; nested exception is org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat
        at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:156)
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:544)
        at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:141)

Nacso 直接启动报错

  • 原因是 Nacos 默认以集群模式启动,我们需要单机模式,修改启动方式即可;

2.1.3 修改启动方式后启动

  • 修改 startup.cmd 里第26行为 standalone

修改 Nacos 为单机模式

  • 保存后启动,访问 http://localhost:8848/nacos 即可;

Nacos 登录

  • 默认起始密码和账号都是 nacos

成功访问 Nacos

2.2 源码部署 Nacos 服务器

由于 2.0.3 版本笔者一直部署失败,因此这里以 1.4.2 版本为例;

2.2.1 下载源码

拉取 Nacos-1.4.2 源码

  • 创建 Nacos 1.4.2 分支(名字可以自己取);

创建 1.4.2 分支

  • 由于 GitHub Http 默认拉取 default 标签下的代码,因此这里选择修改 default 为 1.4.2 标签,再拉取代码;

修改默认分支
修改默认分支为 1.4.2

  • 点击 Update;
  • 然后在 idea 上拉取代码即可;

拉取 Nacos-1.4.2 源码

idea 拉取 Nacos-1.4.2 源码

2.2.2 本地编译

  • 源码下载后,会自动导入依赖 jar 包,有导入不成功的可以尝试手动导入,亲测有效;
  • 需要使用 Maven 对源码进行编译。进入到 Nacos 源码目录,使用如下mvn命令,开始本地编译:
  • mvn -Prelease-nacos -Dmaven.test.skip=true clean install -U

使用 idea 运行命令行

  • 编译完成后截图如下:

Nacos-1.4.2 编译成功

2.2.3 修改配置

  • 跟安装包部署一样,我们需要以单机方式启动 Nacos;
  • 因此需要在启动参数中进行设置,在 JVM 的启动参数中,添加:-Dnacos.standalone=true

配置 JVM 启动参数

2.2.4 启动 Nacos

  • 找到 nacos-console 模块下的启动类 com.alibaba.nacos.Nacos 启动即可;
  • 浏览器访问:http://localhost:8848/nacos
  • 默认账号和密码都是 nacos;

Nacos-1.4.2 源码启动成功

2.2.5 启动报错

  • 如果启动失败报错 找不到 entity 包,这需要编译 nacos-consistency 模块,刷新下 Maven,然后重新启动即可;

编译 nacos-consistency 模块后刷新


3. 使用 Nacos 管理服务提供者

使用 Nacos 构建服务提供者大致与 Zookeeper 和 Consul 相同; Zookeeper 与 Consul 的构建方式详情请见《3.3 Apache Zookeeper 注册中心》与《3.4 HashiCorp Consul 注册中心》;

3.1 引入 pom.xml 依赖文件

  • 父工程的依赖:
<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>
  • 本模块的依赖:
<!--SpringCloud ailibaba nacos -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

3.2 修改 application.yml 配置文件

server:
  port: 9001

spring:
  application:
    name: nacos-provider
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #配置Nacos地址

management:
  endpoints:
    web:
      exposure:
        include: '*'

3.3 在主程序类上添加注解

  • @EnableDiscoveryClient:使用其他组件(Nacos、zookeeper、Consul)作为注册中心;

3.4 编写业务类

这里编写一个简单接口仅作为示例;
@RestController
public class providerController{
    @Value("${server.port}")
    private String serverPort;

    @RequestMapping(value = "/provider/nacos")
    public String providerNacos(){
        return "springcloud with nacos: "+serverPort+"\t"+ UUID.randomUUID().toString();
    }
}


4. 使用 Nacos 管理服务消费者

使用 Nacos 构建服务提供者大致与 Zookeeper 和 Consul 相同; Zookeeper 与 Consul 的构建方式详情请见《3.3 Apache Zookeeper 注册中心》与《3.4 HashiCorp Consul 注册中心》;

4.1 引入 pom.xml 依赖文件

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

4.2 修改 application.yml 配置文件

server:
  port: 80

spring:
  application:
    name: nacos-consumer
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848

#消费者将要去访问的微服务名称(注册成功进nacos的微服务提供者)
service-url:
  nacos-user-service: http://nacos-provider

4.3 在主程序类上添加注解

  • 同提供者;
  • @EnableDiscoveryClient:使用其他组件(Nacos、zookeeper、Consul)作为注册中心;

4.4 编写业务类

  • 由于我们使用 Ribbon + RestTemplate 的负载均衡策略,因此需要在 IoC 容器中添加一个 RestTemplate JavaBean;
  • 详情请见《4.1 基于 Ribbon 的负载均衡详解》;
  • 该 Bean 可以在主启动类中添加;也可以在主启动类所在包或子包的 config 包中添加,如下:
@Configuration
public class ApplicationContextBean{
    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }
}
  • 我们在 controller 层开放接口给客户端,并在该接口里调用提供者的 API;
@RestController
public class ComsumerNacosController{
    public static final String INVOKE_URL = "http:// nacos-provider";

    @Autowired
    private RestTemplate restTemplate;

    @RequestMapping(value = "/consumer/nacos")
    public String paymentInfo(){
        String result = restTemplate.getForObject(INVOKE_URL+"/provider/nacos", String.class);
        System.out.println("消费者调用提供者获取服务--->result:" + result);
        return result;
    }
}


5. Nacos 持久化配置

  • 在 0.7 版本之前,在单机模式时 Nacos 使用嵌入式数据库 Derby 实现数据的存储,不方便观察数据存储的基本情况。0.7 版本增加了支持 MySQL 数据源能力;
  • Derby 数据库是一种文件类型的数据库,在使用时会存在一定的局限性。比如它无法支持多用户同时操作,在数据量大、连接数多的情况下会产生大量连接的积压。所以在生产环境中,可以用 MySQL 替换;
  • 在 pom.xml 里可以找到 Derby 依赖

5.1 切换成 MySQL

  • 首先在 nacos-server-2.0.3\nacos\conf 目录下找到 sql 脚本 nacos-mysql.sql
#需要自己先创建数据库,再执行 sql 脚本;
CREATE DATABASE nacos_config;
USE nacos_config;
  • 在 MySQL 里执行该脚本新建数据库;

Nacos 执行 SQL 脚本

5.2 修改配置文件

  • 接着在 nacos-server-2.0.3\nacos\conf 目录下找到 application.properties 配置文件,修改成 MySQL 相关;
  • 源码部署需要在 ..\nacos\console\src\main\resources\application.properties 文件里配置;

Nacos 配置 MySQL 数据库

spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=123456
  • 再以单机模式启动 Nacos,Nacos 所有写嵌入式数据库的数据都写到了 MySQL;


6. Nacos 的高可用部署

Nacos 的高可用部署

  • Nacos 的数据一致性算法采用的是 Raft,同样采用了该算法的中间件有 Redis Sentinel 的 Leader 选举、Etcd 等;

Nacos 的高可用架构图

6.1 环境要求

  • 64 bit OS Linux/UNIX/Mac,推荐 Linux 系统;
  • 64bit JDK1.8 及以上;
  • Maven3.2.x 及以上;
  • 3 个或 3 个以上 Nacos 节点才能构成集群;
  • MySQL 数据库,版本 5.6.5+;

6.2 安装包及环境准备

unzip nacos-server-2.0.3.zip

6.3 修改集群配置

  • 在 Nacos 的解压目录 nacos/conf 下,有配置文件集群的 cluster.conf 文件,里面配置 ip:port,需要配置3个或3个以上节点;
cd ${NACOS_HOME}/config
cp cluster.conf.example cluster.conf
  • 使用 vi 编辑器打开 cluster.config,按 a/i/o 键可进入插入模式,输入以下内容(3 台机器都需要修改);
#ip:port
10.51.10.128:8848
10.51.10.129:8848
10.51.10.130:8848
  • 然后按ESC键返回到命令模式,再按shif+:进入末行模式,输入wq敲回车(保存并退出);
  • 由于 3 台机器需要彼此通信,在部署时需要防火墙对外开放 8848 端口;

6.4 初始化 MySQL

  • 参考:《5. Nacos 持久化配置》,将每个 Nacos 的数据源换成 MySQL;
  • 同样,3 台机器都需要配置 MySQL 数据库;

6.5 启动 Nacos 服务

  • 分别进入 3 台机器的 bin 目录,执行 sh startup.sh 或者 startup.cmd-m cluster 命令启动服务;
  • 服务启动成功之后,在 ${NACOS_HOME}\logs\start.out 下可以获得如下日志,表示服务启动成功:
2020-01-2814:26:25,654INFO Nacos Log files:/data/program/nacos/1ogs/
2020-01-2014:26:25,654 INFO Nacos Conf files:/data/program/nacos/conf/
2020-01-20 14:26:25,654 INFO Nacos Data files:/data/program/nacos/data/
2020-01-20 14:26:25,654 INFO Nacos started successfully in cluster mode.
  • 通过 http://$NACOS_CLUSTER_IP:8848/nacos 即可访问 Nacos 控制台;


7. 包含 Nginx 的 Nacos 高可用示例

包含 Nginx 的高可用示例

  • 即要完成上图的集群配置;
  • 在《6. Nacos 的高可用部署》的基础上,还需要配置 Nginx 服务器;

7.1 [可选] 修改 startup.sh 启动配置

  • 这里指在一台服务器上启动 3 个 Nacos 实例模拟集群时才需要配置;

    • 比如 cluster.config 的配置如下(指一台服务器上开放三个端口模拟集群):
#ip:port
192.168.111.144:3333
192.168.111.144:4444
192.168.111.144:5555
  • 目的:使 Nacos 能够接受不同的启动端口,即传递不同的端口号启动不同的 Nacos 实例;
  • ${NACOS_HOME}\bin\startup.sh 文件里:

修改 startup.sh 启动配置

  • 修改完后,我们可以指定不同的端口启动不同的 Nacos 实例;

启动方式改变

7.2 配置 Nginx 负载均衡器

  • 如果需要通过 Nignx 对 Nacos 实例进行负载均衡,需要以下配置;
  • 修改 Nginx 的配置文件 nginx/conf/nginx.conf

修改 Nginx 的配置文件

  • 按照指定启动:

按照指定启动

7.3 测试通过 Nginx 访问 Nacos

  • 需要修改服务提供者的 application.yml 文件指向 Nginx 服务器:
server:
  port: 9002

spring:
  application:
    name: nacos-provider
  cloud:
    nacos:
      discovery:
        #配置Nacos地址
        #server-addr: localhost:8848
        # 换成nginx的1111端口,做集群
        server-addr: 192.168.111.144:1111

management:
  endpoints:
    web:
      exposure:
        include: '*'
  • 访问连接:http://192.168.111.144:1111/nacos/#/login
  • 结果如下:

测试通过 Nginx 访问 Nacos

8. Dubbo 使用 Nacos 作为注册中心

  • 详情请见:本系列另外一篇文章《12.1 使用 Apache Dubbo 实现远程通信》里的《6. Dubbo 使用 Nacos 作为注册中心》;



相关文章
|
7天前
|
弹性计算 API 持续交付
后端服务架构的微服务化转型
本文旨在探讨后端服务从单体架构向微服务架构转型的过程,分析微服务架构的优势和面临的挑战。文章首先介绍单体架构的局限性,然后详细阐述微服务架构的核心概念及其在现代软件开发中的应用。通过对比两种架构,指出微服务化转型的必要性和实施策略。最后,讨论了微服务架构实施过程中可能遇到的问题及解决方案。
|
24天前
|
Cloud Native 安全 数据安全/隐私保护
云原生架构下的微服务治理与挑战####
随着云计算技术的飞速发展,云原生架构以其高效、灵活、可扩展的特性成为现代企业IT架构的首选。本文聚焦于云原生环境下的微服务治理问题,探讨其在促进业务敏捷性的同时所面临的挑战及应对策略。通过分析微服务拆分、服务间通信、故障隔离与恢复等关键环节,本文旨在为读者提供一个关于如何在云原生环境中有效实施微服务治理的全面视角,助力企业在数字化转型的道路上稳健前行。 ####
|
6天前
|
Java 开发者 微服务
从单体到微服务:如何借助 Spring Cloud 实现架构转型
**Spring Cloud** 是一套基于 Spring 框架的**微服务架构解决方案**,它提供了一系列的工具和组件,帮助开发者快速构建分布式系统,尤其是微服务架构。
104 68
从单体到微服务:如何借助 Spring Cloud 实现架构转型
|
5天前
|
运维 监控 持续交付
微服务架构解析:跨越传统架构的技术革命
微服务架构(Microservices Architecture)是一种软件架构风格,它将一个大型的单体应用拆分为多个小而独立的服务,每个服务都可以独立开发、部署和扩展。
85 36
微服务架构解析:跨越传统架构的技术革命
|
25天前
|
Dubbo Java 应用服务中间件
服务架构的演进:从单体到微服务的探索之旅
随着企业业务的不断拓展和复杂度的提升,对软件系统架构的要求也日益严苛。传统的架构模式在应对现代业务场景时逐渐暴露出诸多局限性,于是服务架构开启了持续演变之路。从单体架构的简易便捷,到分布式架构的模块化解耦,再到微服务架构的精细化管理,企业对技术的选择变得至关重要,尤其是 Spring Cloud 和 Dubbo 等微服务技术的对比和应用,直接影响着项目的成败。 本篇文章会从服务架构的演进开始分析,探索从单体项目到微服务项目的演变过程。然后也会对目前常见的微服务技术进行对比,找到目前市面上所常用的技术给大家进行讲解。
42 1
服务架构的演进:从单体到微服务的探索之旅
|
16天前
|
Java 网络安全 Nacos
Nacos作为流行的微服务注册与配置中心,其稳定性与易用性广受好评
Nacos作为流行的微服务注册与配置中心,其稳定性与易用性广受好评。然而,“客户端不发送心跳检测”是使用中常见的问题之一。本文详细探讨了该问题的原因及解决方法,包括检查客户端配置、网络连接、日志、版本兼容性、心跳检测策略、服务实例注册状态、重启应用及环境变量等步骤,旨在帮助开发者快速定位并解决问题,确保服务正常运行。
40 5
|
13天前
|
消息中间件 运维 Kubernetes
后端架构演进:从单体到微服务####
本文将探讨后端架构的演变过程,重点分析从传统的单体架构向现代微服务架构的转变。通过实际案例和理论解析,揭示这一转变背后的技术驱动力、挑战及最佳实践。文章还将讨论在采用微服务架构时需考虑的关键因素,包括服务划分、通信机制、数据管理以及部署策略,旨在为读者提供一个全面的架构转型视角。 ####
26 1
|
23天前
|
消息中间件 监控 安全
后端架构演进:从单体到微服务####
在数字化转型的浪潮中,企业应用的后端架构经历了从传统单体架构到现代微服务架构的深刻变革。本文探讨了这一演进过程的背景、驱动力、关键技术及面临的挑战,揭示了如何通过微服务化实现系统的高可用性、扩展性和敏捷开发,同时指出了转型过程中需克服的服务拆分、数据管理、通信机制等难题,为读者提供了一个全面理解后端架构演变路径的视角。 ####
45 8
|
24天前
|
Cloud Native 安全 API
云原生架构下的微服务治理策略与实践####
—透过云原生的棱镜,探索微服务架构下的挑战与应对之道 本文旨在探讨云原生环境下,微服务架构所面临的关键挑战及有效的治理策略。随着云计算技术的深入发展,越来越多的企业选择采用云原生架构来构建和部署其应用程序,以期获得更高的灵活性、可扩展性和效率。然而,微服务架构的复杂性也带来了服务发现、负载均衡、故障恢复等一系列治理难题。本文将深入分析这些问题,并提出一套基于云原生技术栈的微服务治理框架,包括服务网格的应用、API网关的集成、以及动态配置管理等关键方面,旨在为企业实现高效、稳定的微服务架构提供参考路径。 ####
43 5
|
25天前
|
负载均衡 监控 Cloud Native
云原生架构下的微服务治理策略与实践####
在数字化转型浪潮中,企业纷纷拥抱云计算,而云原生架构作为其核心技术支撑,正引领着一场深刻的技术变革。本文聚焦于云原生环境下微服务架构的治理策略与实践,探讨如何通过精细化的服务管理、动态的流量调度、高效的故障恢复机制以及持续的监控优化,构建弹性、可靠且易于维护的分布式系统。我们将深入剖析微服务治理的核心要素,结合具体案例,揭示其在提升系统稳定性、扩展性和敏捷性方面的关键作用,为读者提供一套切实可行的云原生微服务治理指南。 ####