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

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,118元/月
云原生网关 MSE Higress,422元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 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 作为注册中心》;



相关文章
|
21天前
|
Kubernetes Cloud Native Docker
云原生之旅:从容器到微服务的架构演变
【8月更文挑战第29天】在数字化时代的浪潮下,云原生技术以其灵活性、可扩展性和弹性管理成为企业数字化转型的关键。本文将通过浅显易懂的语言和生动的比喻,带领读者了解云原生的基本概念,探索容器化技术的奥秘,并深入微服务架构的世界。我们将一起见证代码如何转化为现实中的服务,实现快速迭代和高效部署。无论你是初学者还是有经验的开发者,这篇文章都会为你打开一扇通往云原生世界的大门。
|
21天前
|
Cloud Native Java Nacos
微服务时代的新宠儿!Spring Cloud Nacos实战指南,带你玩转服务发现与配置管理,拥抱云原生潮流!
【8月更文挑战第29天】Spring Cloud Nacos作为微服务架构中的新兴之星,凭借其轻量、高效的特点,迅速成为服务发现、配置管理和治理的首选方案。Nacos(命名和配置服务)由阿里巴巴开源,为云原生应用提供了动态服务发现及配置管理等功能,简化了服务间的调用与依赖管理。本文将指导你通过五个步骤在Spring Boot项目中集成Nacos,实现服务注册、发现及配置动态管理,从而轻松搭建出高效的微服务环境。
90 0
|
6天前
|
运维 Cloud Native Devops
云原生架构的崛起与实践云原生架构是一种通过容器化、微服务和DevOps等技术手段,帮助应用系统实现敏捷部署、弹性扩展和高效运维的技术理念。本文将探讨云原生的概念、核心技术以及其在企业中的应用实践,揭示云原生如何成为现代软件开发和运营的主流方式。##
云原生架构是现代IT领域的一场革命,它依托于容器化、微服务和DevOps等核心技术,旨在解决传统架构在应对复杂业务需求时的不足。通过采用云原生方法,企业可以实现敏捷部署、弹性扩展和高效运维,从而大幅提升开发效率和系统可靠性。本文详细阐述了云原生的核心概念、主要技术和实际应用案例,并探讨了企业在实施云原生过程中的挑战与解决方案。无论是正在转型的传统企业,还是寻求创新的互联网企业,云原生都提供了一条实现高效能、高灵活性和高可靠性的技术路径。 ##
16 3
|
10天前
|
监控 负载均衡 应用服务中间件
探索微服务架构下的API网关设计与实践
在数字化浪潮中,微服务架构以其灵活性和可扩展性成为企业IT架构的宠儿。本文将深入浅出地介绍微服务架构下API网关的关键作用,探讨其设计原则与实践要点,旨在帮助读者更好地理解和应用API网关,优化微服务间的通信效率和安全性,实现服务的高可用性和伸缩性。
30 3
|
14天前
|
存储 Java Maven
从零到微服务专家:用Micronaut框架轻松构建未来架构
【9月更文挑战第5天】在现代软件开发中,微服务架构因提升应用的可伸缩性和灵活性而广受欢迎。Micronaut 是一个轻量级的 Java 框架,适合构建微服务。本文介绍如何从零开始使用 Micronaut 搭建微服务架构,包括设置开发环境、创建 Maven 项目并添加 Micronaut 依赖,编写主类启动应用,以及添加控制器处理 HTTP 请求。通过示例代码展示如何实现简单的 “Hello, World!” 功能,并介绍如何通过添加更多依赖来扩展应用功能,如数据访问、验证和安全性等。Micronaut 的强大和灵活性使你能够快速构建复杂的微服务系统。
38 5
|
2天前
|
缓存 负载均衡 数据管理
深入探索微服务架构的核心要素与实践策略在当今软件开发领域,微服务架构以其独特的优势和灵活性,已成为众多企业和开发者的首选。本文将深入探讨微服务架构的核心要素,包括服务拆分、通信机制、数据管理等,并结合实际案例分析其在不同场景下的应用策略,旨在为读者提供一套全面、深入的微服务架构实践指南。**
**微服务架构作为软件开发领域的热门话题,正引领着一场技术革新。本文从微服务架构的核心要素出发,详细阐述了服务拆分的原则与方法、通信机制的选择与优化、数据管理的策略与挑战等内容。同时,结合具体案例,分析了微服务架构在不同场景下的应用策略,为读者提供了实用的指导和建议。
|
19天前
|
负载均衡 监控 JavaScript
探索微服务架构下的API网关模式
【8月更文挑战第31天】在微服务的大潮中,API网关不仅是流量的守门人,更是服务间通信的桥梁。本文将带你深入理解API网关的核心概念、设计要点及其在微服务架构中的重要作用,同时通过代码示例揭示如何利用API网关提升系统的灵活性与扩展性。
|
21天前
|
消息中间件 监控 Kafka
Producer 与微服务架构的集成
【8月更文第29天】在现代软件开发中,微服务架构因其灵活性和可扩展性而被广泛采用。这种架构允许将复杂的系统分解为更小、更易于管理的服务。消息传递是连接这些服务的关键部分,而消息生产者(Producer)则是消息传递中的重要角色。本文将探讨如何将消息生产者无缝集成到基于微服务的应用程序中,并提供一个使用 Python 和 Kafka 的示例。
27 0
|
21天前
|
存储 供应链 Nacos
Nacos Stream 引领微服务异步消息潮流,为数字化转型保驾护航,你跟上了吗?
【8月更文挑战第29天】在微服务架构中,异步消息处理框架至关重要。Nacos Stream 通过可靠的消息传递机制、优秀的扩展性及灵活的消息过滤与路由功能,在电商系统等场景下展现了巨大价值。其简化了开发过程,支持高并发消息处理,确保了微服务系统的稳定运行与平滑扩展,为复杂系统的构建提供了强有力的消息通信保障。
24 0
|
22天前
|
消息中间件 Java 网络架构
AMQP与微服务架构的集成策略
【8月更文第28天】在微服务架构中,各个服务通常通过HTTP/REST、gRPC等协议进行交互。虽然这些方法在很多场景下工作得很好,但在需要高并发、低延迟或需要处理大量消息的情况下,传统的同步调用方式可能无法满足需求。此时,AMQP作为异步通信的一种标准协议,可以提供一种更为灵活和高效的消息传递机制。
21 1