Nacos 介绍及搭建集群、相关组件

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: Nacos 介绍及搭建集群、相关组件

Nacos 官方文档:https://nacos.io/zh-cn/docs/what-is-nacos.html

Nacos 介绍

Nacos(Naming Configuration Service) 是一个易于使用的动态服务发现、配置和服务管理平台,用于构建云原生应用程序

服务发现是微服务架构中的关键组件之一,Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理

Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台,Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。

什么是 Nacos?

Nacos = 注册中心+配置中心组合

Nacos 支持几乎所有主流类型 "服务"发现、配置和管理,常见的服务如下:

  1. Kubernetes Service
  2. gRPC & Dubbo RPC Service
  3. Spring Cloud Restful Service

为何使用 Nacos ?

为何使用注册中心呢?我们以入住酒店的前台为例子,稍微加以解释:先设想一个没有服务前台的酒店,客人入住需要自己寻找合适居住的房间,客人不知道每个房间的情况,无法确定那个房间是打扫干净可以入住,客人只能逐个房间寻找,如果遇到已经居住房客的房间一定很尴尬,显然这是不正常的情况。正常的情况是酒店会安排服务台,酒店打扫干净可以入住的房间会登记注册到服务台,这样客人来住店,只需要在前台就可以查找到可以入住的房间,这样就无需等待快速的入住。显然,服务台提供注册和发现机制可以让房客快速找到合适的房间,快速解决入住问题。

采用微服务以后,软件微服务组件各自独立,但最终还要组合为一个整体作为一个软件系统服务于最终客户,这时软件组件之间也需要彼此通讯,彼此调用方法。微服务架构内部发起通讯调用方法的一方成为“服务消费者”,提供远程方法调用的服务器称为“服务提供者”,往往为了提高系统性能,会提供多个服务器作为服务提供者,此时服务消费者找到服务提供者的过程,就类似于用户在找房间的过程。为了帮助服务消费者快速的发现服务提供者,在微服务框架中都会引入注册中心。注册中心类似于酒店的前台,提供在软件服务的注册和发现功能,服务提供者会先在注册中心进行注册,声明可以对外提供服务,而服务消费者只需要在注册中心就可以快速发现找到可以使用的服务,快速使用服务;注册中心实现了服务提供和服务消费的快速撮合功能

Nacos 集群搭建

Nacos 官方推荐安装稳定版本 2.0.3,链接:https://nacos.io/zh-cn/docs/quick-start.html

该博文搭建的是三台 Nacos 节点组建成集群,搭配一台 MySQL 作为外置数据源(一般为了保证高可用,设置为一主一从), 一台 Nginx 负责 Nacos 服务节点之间的转发和负载均衡

若在 Nacos 未配置外置数据源时,默认会使用内置数据源 derby 进行存储,每台 Nacos 节点都会有一个 derby,为了方便数据统一管理,使用 MySQL 作为外置数据源进行存储

Nacos 前置必备的环境:JDK,集群需要使用到 Nginx、MySQL,下面来介绍这几个环境在 Linux 中的安装步骤以及集群部署,安装包以及使用 Nacos 集群注册与发现的源码会在文末给出~

准备三台虚拟机节点,静态 IP:我这边的是 172.16.249.10~172.16.249.12

JDK

上传安装包到 /opt 目录下

  1. 区分不同内核版本:tar -zxvf jdk-8u171-linux-x64.tar.gz、tar -zxvf jdk-8u341-linux-aarch64.tar.gz
  2. mv jdk1.8.0_171/ jdk8
  3. mv jdk8/ /usr/local/
  4. vim /etc/profile
#按i进入编辑,在profile文件尾部添加如下内容
#JDK配置
export JAVA_HOME=/usr/local/jdk8
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib:$CLASSPATH
export JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin
export PATH=$PATH:${JAVA_PATH}
#Esc --> :wq保存并退出
#通过命令让profile文件立即生效
  1. source /etc/profile

MySQL

MySQL 5.7 X86_X64 安装步骤:https://www.cnblogs.com/huchong/p/9152117.html

172.16.249.10 节点安装,Linux Arrach64 内核 安装 MySQL 过程如下:

  1. 安装 MySQL arrach64 yum 包:wget https://obs.cn-north-4.myhuaweicloud.com/obs-mirror-ftp4/database/mysql-5.7.27-aarch64.tar.gz
  2. tar -xvf mysql-5.7.27-aarch64.tar.gz
  3. 修改目录名称:mv /usr/local/mysql-5.7.27-aarch64 /usr/local/mysql
  4. 创建日志目录:mkdir -p /usr/local/mysql/logs
  5. 新建组:groupadd mysql、新建用户:useradd -r -g mysql mysql
  6. 修改目录所有者:chown -R mysql:mysql /usr/local/mysql
  7. 创建软链接:ln -sf /usr/local/mysql/my.cnf /etc/my.cnf
  8. 复制包:cp -rf /usr/local/mysql/extra/lib* /usr/lib64/
  9. 将老版本库包更新名:mv /usr/lib64/libstdc++.so.6 /usr/lib64/libstdc++.so.6.old
  10. 引用新版本软链接:ln -s /usr/lib64/libstdc++.so.6.0.24 /usr/lib64/libstdc++.so.6
  11. 设置开机启动
cp -rf /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
chmod +x /etc/init.d/mysqld
cd /etc/init.d/
systemctl enable mysqld
  1. 添加环境变量:vi /etc/profile
export MYSQL_HOME=/usr/local/mysql
export PATH=$PATH:$MYSQL_HOME/bin
source /etc/profile
  1. 初始化启动 MySQL,无密码方式登陆:mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data

初始化时可能会提示你以下错误:

mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory


通过命令:yum install -y libaio 安装好以后再初始化

  1. 启动 MySQL:systemctl start mysqld
  2. 查看 MySQL 运行状态:systemctl status mysqld
  3. 登陆 MySQL:mysql -uroot -p、回车即可登录成功

设置 MySQL 密码:SET PASSWORD = PASSWORD(‘123456’);

ALTER USER ‘root’@‘localhost’ PASSWORD EXPIRE NEVER;

usr mysql;

设置 root 账号随地都可以登录:update user set host = ‘%’ where user = ‘root’;

刷新权限:FLUSH PRIVILEGES;、退出:exit

  1. 远程连接 MySQL 关闭服务器防火墙

暂时关闭:systemctl stop firewalld,重启后仍然生效

永久关闭:systemctl disable firewalld

Nacos 集群

  1. tar -zxvf nacos-server-2.0.3.tar.gz
  2. mv /opt/nacos /usr/local/nacos
  3. 172.16.249.10 节点安装的数据库中执行

create database nacos_config;

use nacos_config;

执行 SQL 脚本,表结构语句:/usr/local/nacos/conf/nacos-mysql.sql

  1. 修改 application.properties 文件,在修改之前做一个备份:cp application.properties application.properties.init,更新如下内容:
### If use MySQL as datasource:
spring.datasource.platform=mysql
### Count of DB:
db.num=1
### Connect URL of DB:
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=123456
  1. 若是在单台节点上部署集群,需要将端口分散开来,因为 Nacos 内置还占用了两个端口用于 gRPC 使用的,偏移量为 1000、1001,除了自身的 8848 端口,还会占用 9848、9849 这两个端口

错误示例:8848、8849、8850

正确示例:8848、8868、8888

Nacos 2.0 版本相比 1.X 新增了 gRPC通信方式,因此需要增加2个端口。新增端口是在配置的主端口(server.port)基础上,进行一定偏移量自动生成

端口 与主端口的偏移量 描述
9848 1000 客户端gRPC请求服务端端口,用于客户端向服务端发起连接和请求
9849 1001 服务端gRPC请求服务端端口,用于服务间同步等

随即在使用 VIP/Nginx 请求时,需要配置成 TCP 转发,不能配置 http2 转发,否则连接会被 Nginx 断开

  1. 正式开始配置集群,首先我们要更改 cluter.conf 这个配置文件,当然我们也需要备份,但是这里它的原始名称为:cluster.conf.example,我们需要把它保留同时复制出一个 cluster.conf 来进行更改

cp cluster.conf.example cluster.conf

具体配置内容,配置集群时要写入节点间真实的 IP 地址,通过 ip addr 查看网卡 ens** 开头的 IP

具体修改内容如下:

#it is ip
172.16.249.10:8848
172.16.249.11:8848
172.16.249.10:8848

每个节点启动:sh /usr/local/nacos/bin/startup.sh,默认就是以集群方式启动的

单机模式启动命令:sh startup.sh -m standalone,Windows 启动命令: startup.cmd -m standalone

Nginx

  1. 安装前置环境

yum -y install gcc

yum -y install openssl openssl-devel make zlib zlib-devel gcc gcc-c++ libtool pcre pcre-devel

  1. 解压包:tar -zxvf nginx-1.16.1.tar.gz
  2. mv nginx-1.16.1 nginx、mv nginx/ /usr/local/
  3. 配置模块生成 MakeFile 文件:

./configure --prefix=/usr/local/nginx --conf-path=/usr/local/nginx/nginx.conf --error-log-path=/usr/local/nginx/logs/error.log --pid-path=/usr/local/nginx/logs/nginx.pid --http-log-path=/usr/local/nginx/logs/access.log --with-http_stub_status_module --with-http_ssl_module

  1. 编译安装:make && make install
  2. 启动:/usr/local/nginx/sbin
    Nginx 配置实现负载均衡到不同 Nacos 节点

备份文件:cp /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf.bk

更新 nginx.conf 文件内容如下:

stream {
    upstream nacos {
      server 172.16.249.10:8848;
      server 172.16.249.11:8848;
      server 172.16.249.12:8848;
    }
}
server {
    listen 1998;
    server_name localhost;
    location / {
      proxy_pass http://nacos;
    }
}

使用集群

部署完以后,访问 http://172.16.249.10:1998/nacos 查看节点列表,如下图:

  1. 引入 Nacos 相关依赖
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
  1. 更新 application.yml、bootstrap.yml 文件内容如下:
spring:
  application:
    name: nacos-config-client
  profiles:
#    active: dev     # 开发环境
    active: test    # 测试环境
#    active: prod     # 生产环境
server:
  port: 3377
spring:
  cloud:
    nacos:
      config:
        server-addr: 172.16.249.10:1998
        file-extension: yaml
        namespace:
      server-addr: 172.16.249.10:1998
  1. 新增配置类如下:
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
 * @Author vnjohn
 * @Date 2022/8/9
 */
@RestController
@RefreshScope
public class ConfigInfoController {
    @Value("${config.info}")
    private String configInfo;
    @GetMapping("config/info")
    public String configInfo() {
        return configInfo;
    }
}
  1. 在 Nacos 中添加配置文件,以便项目启动时能够读取到内容,配置文件的命名格式:
${spring.application.name}-${spring.profile.active}.${file-extension}

配置文件名称:nacos-config-client-test.yaml

新增完配置文件以后,可以看到数据库:nacos_config#config_info 多了一条记录

到此 Nacos 集群以及如何使用集群就完结了

安装包及仓库地址

仓库链接:https://github.com/vnjohn/spring-cloud-alibaba-vnjohn

网盘链接:https://pan.baidu.com/s/1Knq1yo0vd6UpVhvlkIs5xg?pwd=8h0e

总结

此篇博文,讲解了 Nacos 是什么以及为何使用 Nacos 的初衷,从零到一实战落地搭建 Nacos 集群,包含了依赖于其他的组件:JDK、MySQL、Nginx 等,随即演示了怎么去使用集群进行数据操作,最后,将该部分实战的源码整理到 GitHub 以及网盘中,希望能够帮助到你~

如果觉得博文不错,关注我 vnjohn,后续会有更多实战、源码、架构干货分享!

大家的「关注❤️ + 点赞👍 + 收藏⭐」就是我创作的最大动力!谢谢大家的支持,我们下文见!

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
7月前
|
存储 运维 监控
NACOS 配置中心和注册中心是分两个集群部署还是放在一个集群中
【2月更文挑战第33天】NACOS 配置中心和注册中心是分两个集群部署还是放在一个集群中
278 3
|
7月前
|
Java 数据库连接 Nacos
nacos常见问题之Nacos2.0.3集群模式启动报错如何解决
Nacos是阿里云开源的服务发现和配置管理平台,用于构建动态微服务应用架构;本汇总针对Nacos在实际应用中用户常遇到的问题进行了归纳和解答,旨在帮助开发者和运维人员高效解决使用Nacos时的各类疑难杂症。
|
7月前
|
弹性计算 网络协议 IDE
Nacos报错问题之集群开启鉴权无法注册如何解决
Nacos是一个开源的、易于部署的动态服务发现、配置管理和服务管理平台,旨在帮助微服务架构下的应用进行快速配置更新和服务治理;在实际运用中,用户可能会遇到各种报错,本合集将常见的Nacos报错问题进行归纳和解答,以便使用者能够快速定位和解决这些问题。
|
7月前
|
关系型数据库 MySQL 应用服务中间件
从零开始,掌握Nacos搭建的艺术(单点、集群、docker-compose)
从零开始,掌握Nacos搭建的艺术(单点、集群、docker-compose)
133 0
|
3月前
|
SpringCloudAlibaba JavaScript 前端开发
谷粒商城笔记+踩坑(2)——分布式组件、前端基础,nacos+feign+gateway+ES6+vue脚手架
分布式组件、nacos注册配置中心、openfegin远程调用、网关gateway、ES6脚本语言规范、vue、elementUI
谷粒商城笔记+踩坑(2)——分布式组件、前端基础,nacos+feign+gateway+ES6+vue脚手架
|
4月前
|
负载均衡 监控 Java
SpringCloud常见面试题(一):SpringCloud 5大组件,服务注册和发现,nacos与eureka区别,服务雪崩、服务熔断、服务降级,微服务监控
SpringCloud常见面试题(一):SpringCloud 5大组件,服务注册和发现,nacos与eureka区别,服务雪崩、服务熔断、服务降级,微服务监控
SpringCloud常见面试题(一):SpringCloud 5大组件,服务注册和发现,nacos与eureka区别,服务雪崩、服务熔断、服务降级,微服务监控
|
4月前
|
Kubernetes 关系型数据库 MySQL
k8s部署nacos集群
k8s部署nacos集群
|
4月前
|
应用服务中间件 Nacos 数据库
Nacos 1.2.1 集群搭建(三) Nginx 配置 集群
Nacos 1.2.1 集群搭建(三) Nginx 配置 集群
66 1
|
4月前
|
SQL 关系型数据库 MySQL
Nacos 1.2.1 集群搭建(二)MySQL、cluster 配置
Nacos 1.2.1 集群搭建(二)MySQL、cluster 配置
122 1
|
4月前
|
关系型数据库 MySQL Nacos
Nacos 1.2.1 集群搭建(一)环境准备
Nacos 1.2.1 集群搭建(一)环境准备
84 0