hooyantsing's Blog

P12 Alibaba 微服务组件 Nacos 注册中心

字数统计: 1.6k阅读时长: 6 min
2022/06/17

视频源:小破站讲的最好SpringCloudAlibaba入门教程,保姆级教程通俗易懂

1. 什么是 Nacos

Nacos 官网:https://nacos.io

官方:一个更易于构建云原生应用的动态 服务发现(Nacos Discovery)服务配置(Nacos Config) 和服务管理平台。

Nacos 的关键特性包括:

  • 服务发现和服务健康检测;
  • 动态配置服务;
  • 动态 DNS 服务;
  • 服务及其元数据管理。

2. Nacos 注册中心

2.1 注册中心演变及其设计思想

image-20220617111853100

2.2 Nacos 注册中心架构

image-20220617113241774

2.3 核心功能

服务注册:Nacos Client 会通过发送 REST 请求的方式向 Nacos Server 注册自己的服务,提供自身的元数据,比如 ip 地址、端口等信息。Nacos Client 接收到注册请求后,就会把这些元数据信息存储在一个双层的内存 Map 中。

服务心跳:在服务注册后,Nacos Client 会维护一个定时心跳来持续通知 Nacos Server,说明服务一直处于可用状态,防止被剔除。默认 5s 发送一次心跳。

服务同步:Nacos Server 集群之间会相互同步服务实例,用来保证服务信息的一致性。

服务发现:服务消费者(Nacos Client)在调用服务提供者的服务时,会发送一个 REST 请求给 Nacos Server,获取上面注册的服务清单,并缓存在 Nacos Client 本地,同时会在 Nacos Client 本地开启一个定时任务定时拉取服务端最新的注册表信息更新到本地缓存。

服务健康检查:Nacos Server 会开启一个定时任务用来检查注册服务实例的健康情况,对于超过 15s 没有收到客户端心跳的实例会将它的 healthy 属性置为 false(客户端服务发现时不会发现),如果某个实例超过 30s 没有收到心跳,直接剔除该实例(被剔除的实例如果恢复发送心跳则会重新注册)。

注册中心之间的对比

一致性协议CAP:C一致性;A可用性;P分区容错性。

image-20220617142652397

3. Nacos Server 部署

Spring Cloud Alibaba:2.2.5.RELEASE 对应 Nacos 1.4.1

下载地址:Nacos

3.1 单机模式

eg 以下通过 Windows 版本展开学习

下载并解压,找到 startup.cmd 文件,Nacos 默认启动是集群模式,刚入门则需要修改该文件改为单机模式,方便学习。

1
2
3
set MODE="cluster"
# 将 cluster 改为 standalone
set MODE="standalone"

双击启动。

JDK 版本必须高于 8,且必须配置 JAVA_HOME 环境变量。

控制台会输出 web 管理链接,默认账号密码均是:nacos

现在,给每个项目 pom 文件加入 Nacos Client 依赖

1
2
3
4
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

更多配置文件配置字段详见:https://github.com/alibaba/spring-cloud-alibaba/wiki/Nacos-discovery

order-nacos 微服务项目

application.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
server:
port: 8020

spring:
application:
# 该微服务名
name: order-service
cloud:
nacos:
# Nacos 注册中心地址
server-addr: 127.0.0.1:8848
discovery:
# 访问用户名及密码
username: nacos
password: nacos
# 命名空间,不同空间的微服务相互隔离。通常可划分为开发环境 dev 生产环境 prod,默认 public
namespace: public

stock-nacos 微服务项目

application.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
server:
port: 8021

spring:
application:
# 该微服务名
name: stock-service
cloud:
nacos:
# Nacos 注册中心地址
server-addr: 127.0.0.1:8848
discovery:
# 访问用户名及密码
username: nacos
password: nacos
# 命名空间,不同空间的微服务相互隔离。通常可划分为开发环境 dev 生产环境 prod,默认 public
namespace: public

分别启动以上两个微服务项目,可以在 Nacos web 管理页面看到如下信息:

image-20220620164034560

引入注册中心后,我们就不需要在代码里写服务地址了,取而代之的是服务名称。

1
2
3
String msg = restTemplate.getForObject("http://localhost:8011/stock/reduct", String.class);
// 服务地址 -> 服务名称
String msg = restTemplate.getForObject("http://stock-service/stock/reduct", String.class);

为 RestTemplate 加上 @LoadBalanced 注解,启用负载均衡器。负载均衡器具有服务名向地址解析的功能。

Nacos 默认采用 Ribbon 负载均衡。

负载均衡机制:循环向相同服务不同实例发送处理请求。

1
2
3
4
5
6
7
// 通常写在配置类里面
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
RestTemplate restTemplate = new RestTemplate();
return restTemplate;
}
同一个项目如何开启多个实例

对实例点击右键 Copy Configuration... 打开如下图配置界面。

image-20220620165919752

3.2 集群模式

image-20220620192639701

eg 以下通过 Linux 版本展开学习

进入 Linux 系统

1
2
3
4
5
6
7
8
9
# 创建一个文件目录,并进入
mkdir nacos
cd nacos
# 下载 Linux 版 release(1.4.1)
wget https://github.com/alibaba/nacos/releases/download/1.4.1/nacos-server-1.4.1.tar.gz
# 下载好,解压
tar -zxvf nacos-server-1.4.1.tar.gz
# 重命名
mv nacos nacos8849

单机搭建伪集群

image-20220620185825173

修改每个 Nacos 配置文件,以 nacos8849 为例,进入 nacos8849 目录

修改 conf/application.properties 的配置,使用外置数据源

MySQL 版本要求 5.7+

1
2
3
4
5
6
7
8
# 使用外置 MySQL 数据源
spring.datasource.platform=mysql
# 连接数量
db.num=1
# MySQL
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=root

将 conf/cluster.conf.example 复制一份重命名为 cluster.conf,添加节点配置

1
2
# 复制并重命名
cp cluster.conf.example cluster.conf
1
2
3
4
# ip:port
192.168.3.14:8849
192.168.3.14:8850
192.168.3.14:8851

创建 MySQL 数据库,sql 脚本位置:conf/nacos-mysql.sql

(可选)如果出现内存不足,修改启动脚本(bin/startup.sh)的 jvm 参数

1
JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx512m -Xmn256 -XX:MetaspasceSize=128m ..."

启动 Nacos

1
./startup.sh

目前,已经成功搭建起了 Nacos 集群,可到 Nacos web 管理页面查看。

现在,我们需要通过 Nginx 负载均衡将请求分发到各个 Nacos 服务器。

下载 Nginx

1
2
3
4
5
6
7
# 1. 添加官方源仓库
yum install -y yum-utils
yum-config-manager --add-repo https://openresty.org/package/centos/openresty.repo

# 2. 安装 openresty
yum install -y openresty
cd /user/local/openresty/

官方推荐,Nginx 反向代理 conf/nginx.conf

1
2
3
4
5
6
7
8
9
10
11
12
upstream nacoscluster {
server 127.0.0.1:8849;
server 127.0.0.1:8850;
server 127.0.0.1:8851;
}
server {
linsten 8847;
server_name localhost;
location /nacos/{
proxy_pass http://nacoscluster/nacos/;
}
}

启动 Nginx

1
./nginx

最后,微服务项目(Nacos Client)在配置文件中指向 Nginx 即可。

1
2
3
spring:
nacos:
server-addr:192.168.65.220:8847

3.3 prometheus + grafana 监控 Nacos

4. Spring Cloud Alibaba Nacos 快速开始

4.1 Spring Cloud Alibaba 版本选型

4.2 搭建 Nacos-client 服务

CATALOG
  1. 1. 1. 什么是 Nacos
  2. 2. 2. Nacos 注册中心
    1. 2.1. 2.1 注册中心演变及其设计思想
    2. 2.2. 2.2 Nacos 注册中心架构
    3. 2.3. 2.3 核心功能
      1. 2.3.1. 注册中心之间的对比
  3. 3. 3. Nacos Server 部署
    1. 3.1. 3.1 单机模式
      1. 3.1.1. 同一个项目如何开启多个实例
    2. 3.2. 3.2 集群模式
    3. 3.3. 3.3 prometheus + grafana 监控 Nacos
  4. 4. 4. Spring Cloud Alibaba Nacos 快速开始
    1. 4.1. 4.1 Spring Cloud Alibaba 版本选型
    2. 4.2. 4.2 搭建 Nacos-client 服务