文章目录
一、服务注册与发现介绍
随着业务的发展,用户量和业务复杂度逐渐增加,系统为了支撑更大的流量需要做很多优化,比如升级服务器配置提升性能。在软件方面,我们会采用微服务架构、对业务服务进行微服务化拆分、水平扩容等来提升系统性能,以及解决业务的复杂性问题。
在微服务架构下,一个业务服务会被拆分成多个微服务,各个服务之间相互通信完成整体的功能。另外,为了避免单点故障,微服务都会采取集群方式的高可用部署,集群规模越大,性能也会越高,如图所示。
服务消费者要去调用多个服务提供者组成的集群。首先,服务消费者需要在本地配置文件中维护服务提供者集群的每个节点的请求地址。其次,服务提供者集群中如果某个节点下线或者宕机,服务消费者的本地配置中需要同步删除这个节点的请求地址,防止请求发送到已宕机的节点上造成请求失败。为了解决这类的问题,就需要引入服务注册中心,它主要有以下功能:
- 服务地址的管理。
- 服务注册。
- 服务动态感知。
(一)常见注册中心
能够实现这类功能的组件很多,比如ZooKeeper、Eureka Consul、Etcd、Nacos等。在这一章中主要介绍Alibaba的Nacos。
-
Zookeeper:zookeeper是一个分布式服务框架,是Apache Hadoop 的一个子项目,它主要是用来解决分布式
应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用
配置项的管理等。 -
Eureka:Eureka是Springcloud Netflix中的重要组件,主要作用就是做服务注册和发现。但是现在已经闭
源 -
Consul:Consul是基于GO语言开发的开源工具,主要面向分布式,服务化的系统提供服务注册、服务发现
和配置管理的功能。Consul的功能都很实用,其中包括:服务注册/发现、健康检查、Key/Value
存储、多数据中心和分布式一致性保证等特性。Consul本身只是一个二进制的可执行文件,所以
安装和部署都非常简单,只需要从官网下载后,在执行对应的启动脚本即可。 -
Nacos:Nacos是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。它是 Spring
Cloud Alibaba 组件之一,负责服务注册发现和服务配置,可以这样认为nacos=eureka+config。
二、Alibaba Nacos 介绍
Nacos致力于解决微服务中的统一配置服务注册与发现等问题。它提供了一组简单易用的特性集,帮助开发者快速实现动态服务发现,服务配置,服务元数据及流量管理。
Nacos的关键特性如下:
-
服务发现和服务健康监测:
Nacos支持基于DNS和基于RPC的服务发现。服务提供者使用原生SDK、OpenAPI或一个独立的Agent TODO注册Service后,服务消费者可以使用DNS或HTTP&API查找和发现服务。
Nacos提供对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求。Nacos支持传输层(PING或TCP)和应用层(如HTTP、MySOL用户自定义)的健康检查。对于复杂的云环境和网络拓扑环境中(
如VPC边缘网络等)服务的健康检查,Nacos提供了aent上报和服务端主动检测两种健康检查模式。Nacos还提供了统一的健康检查仪表盘,帮助用户根据健康状态管理服务的可用性及流量。 -
动态配置服务:
业务服务一般都会维护一个本地配置文件,然后把一些常量配置到这个文件中。这种方式在某些场景中会存在问题,比如配置需要变更时要重新部署应用。而动态配置服务可以以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置,可以使配置管理变得更加高效和敏捷。配置中心化管理让实现无状态服务变得更简单,让服务按需弹性扩展变得更容易。
另外,Nacos提供了一个简洁易用的UI(控制台样例Demo)帮助用户管理所有服务和应用的配置。Nacos还提供了包括配置版本跟踪、金丝雀发布,一键回滚配置及客户端配置更新状态跟踪在内的一系列开箱即用的配置管理特性,帮助用户更安全地在生产环境中管理配置变更,降低配置变更带来的风险。 -
动态DNS服务:
动态DNS服务支持权重路由,让开发者更容易地实现中间层负载均衡、更灵活的路由策略、流量控制,以及数据中心内网的简单DNS解析服务。 -
服务及其元数据管理:
Nacos可以使开发者从微服务平台建设的视角管理数据中心的所有服务及数据,包括管理服务的描述,生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略、服务的SLA及最重要的metrics统计数据。
本书主要围绕Nacos中注册中心的特性及动态配置服务的特性进行展开讲解。
(一)核心功能:
-
服务注册:Nacos Client会通过发送REST请求的方式向NacosServer注册自己的服务,提供自身的元数据,比如ip地址,端口等信息。Nacos Server接收到注册请求后,就会把这些元数据信息存储在一个双层的内存Map中。
-
服务心跳:在服务注册后,NacosClient会维护一个定时心跳来持续通知NacosServer,说明服务一直处于可用状态,防止被剔除。默认5s发送一次心跳。
-
服务同步:NacosServer集群之间会互相同步服务实例,用来保证服务信息的一致性。leader raft服务发现:服务消费者(NacosClient)在调用服务提供者的服务时,会发送一个REST请求给NacosServer,获取上面面注册的服务清单,并且缓存在NacosClient本地,同时会在NacosClient本地开启一个定时任务定时拉取服务端最新的注册表信息更新到本地缓有
-
服务健康检查:NacosServer会开启一个定时任务用来检查注册服务实例的健康情况,对于超过15s没有收到客户端心跳的实例会将它的healthy属性置为false(客户端服务发现时不会发现),如果某个实例超过30秒没有收到心跳,直接剔除该实例(被剔除的实例如果恢复发送心跳则会重新注册)
三、NacosServer安装部署
(一)window单节点安装
- 下载nacos的GitHub地址下载zip包
- 解压
- 到bin目录下创建一个启动脚本start.bat,脚本内容如下:
startup.cmd -m standalone
- 双击start.bat启动即可
(二)linux安装包方式单节点安装部署
官方快速开始教程连接地址
Nacos支持三种部署模式,分别是单机,集群和多集群。需要注意的是,Nacos依赖Java环境,并且要求使用JDK1.8以上版本。
Nacos的安装方式有两种,一种是源码安装,另一种直接是使用已经编译好的安装包。这里选择使用安装包方式安装。
1. jdk安装配置
在 Linux 中安装和配置 JDK 需要以下步骤:
检查系统中是否已经安装过 JDK 和 JRE。可以使用以下命令来检查:
java -version
如果系统中没有安装 JDK 和 JRE,则需要下载并安装 JDK。
参考 Oracle 官方网站,下载适合系统的 JDK 安装包。下载链接:
https://www.oracle.com/java/technologies/downloads/。
假设安装包为 /opt/jdk-11.0.11_linux-x64_bin.tar.gz。
解压安装包。可以使用以下命令:
tar -zxvf /opt/jdk-11.0.11_linux-x64_bin.tar.gz -C /opt/
配置环境变量。打开 /etc/profile 文件:
sudo vi /etc/profile
在文件末尾添加以下内容:
export JAVA_HOME=/opt/jdk-11.0.11
export PATH=$JAVA_HOME/bin:$PATH
然后保存并退出文件。执行以下命令使配置文件立即生效:
source /etc/profile
验证 JDK 是否安装配置成功。可以使用以下命令:
java -version
执行该命令后,应该能看到已经安装的 JDK 版本信息。
2. nacos安装
- 下载nacos的GitHub地址
- 解压Nacos安装包
tar -zxvf nacos-server-2.1.1.tar.gz
解压完成后,会在解压的目录中看到一个nacos的文件夹。
- 启动Nacos服务
进入nacos跟目录,执行以下命令:
[root@bogon nacos]# sh bin/startup.sh -m standalone
/java/jdk-11.0.16//bin/java -Xms512m -Xmx512m -Xmn256m -Dnacos.standalone=true -Dnacos.member.list= -Xlog:gc*:file=/nacos/nacos/logs/nacos_gc.log:time,tags:filecount=10,filesize=102400 -Dloader.path=/nacos/nacos/plugins/health,/nacos/nacos/plugins/cmdb,/nacos/nacos/plugins/selector -Dnacos.home=/nacos/nacos -jar /nacos/nacos/target/nacos-server.jar --spring.config.additional-location=file:/nacos/nacos/conf/ --logging.config=/nacos/nacos/conf/nacos-logback.xml --server.max-http-header-size=524288
nacos is starting with standalone
nacos is starting,you can check the /nacos/nacos/logs/start.out
这样,就会启动Nacos服务。在启动过程中,如果出现错误,可以查看logs目录下的startup.log文件来查看具体错误信息。
- 访问Nacos服务
Nacos默认的访问地址为http://localhost:8848/nacos,可以在浏览器中输入该地址来访问Nacos服务。如果一切正常,将会看到Nacos的登录界面,输入默认账号(nacos)密码(nacos)即可登录。
到此,Nacos服务在Linux环境下的安装部署就完成了。如果想要深入了解更多关于Nacos的使用和配置,可以查看Nacos官方文档(https://nacos.io/zh-cn/docs/what-is-nacos.html)。
(三)linux源码方式单节点安装部署
1、下载Nacos源码并解压缩
在官网 https://github.com/alibaba/nacos/releases 下载源代码,可以选择.tar.gz或.zip格式的文件,解压到你想要安装的目录中。
wget https://github.com/alibaba/nacos/releases/download/2.2.2/nacos-server-2.2.2.tar.gz
tar -zxvf nacos.tar.gz
2、配置Nacos
进入解压后的nacos目录,修改conf/application.properties文件:
# 修改服务地址IP
nacos.inetutils.ip-address=your-server-ip
# 启用standalone模式
nacos.standalone=true
# 修改端口号
server.port=8848
# 修改数据存储位置
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=your-db-username
db.password=your-db-password
注意要修改以下参数:
your-server-ip:修改为Nacos服务的IP地址
server.port:修改为要使用的端口号
db.url.0:修改为MySQL数据库的连接地址,并设置正确的数据库用户名和密码
3、创建数据库和数据表
使用MySQL客户端创建数据库和数据表,如下所示:
4、启动Nacos
进入解压后的nacos/bin目录,使用以下命令启动Nacos服务:
sh startup.sh -m standalone
如果启动成功,你应该可以在浏览器中访问 http://your-server-ip:8848/nacos 来查看Nacos控制台。
至此,Nacos就成功安装完成了。
(四)Nacos服务注册发现相关API说明
四、Nacos集成SpringBoot实现服务注册与发现
1、创建父工程
创建一个maven工程,然后在pom.xml文件中添加下面内容
各个版本的对应关系参考官网:官网版本对应关系描述地址
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>BK-SpringCloud</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<artifactId>spring-boot-starter-parent</artifactId>
<groupId>org.springframework.boot</groupId>
<version>2.6.11</version>
</parent>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2021.0.4</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2021.0.4.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
2、创建基础公共模块
在pom.xml中添加依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="