SpringCloud Alibaba 微服务组件 Nacos

一、什么是 Nacos

官方: -个更易于构建云原生应用的动态服务发现(Nacos Discovery)、服务配置(Nacos Config)和服务管理平台。
集 注册中心 + 配置中心 + 服务管理 平台

Nacos 的特性包括:
- 服务发现和服务健康监测
- 动态配置服务
- 动态 DNS 服务
- 服务及其元数据管理

二、Nacos 注册中心

管理所有微服务、解决微服务之间调用关系错综复杂、难以 维护的问题

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

直接通过 RestTemplate 对其它服务进行调用,但是服务多了之后,IP 不好维护,每次 IP 改变,都要进行服务的修改与重新部署。

SpringCloud Alibaba 为服务组件 Nacos

手动维一份服务注册表,可以保存到数据库中。
但是当服务进行水平扩展后如何进行负载均衡,其中一个服务宕机,下次不能调用等问题如何处理

SpringCloud Alibaba 为服务组件 Nacos

将所有的配置配置在 nginx.conf 中,问题是配置十分繁琐,并且其中一个服务宕机如何处理。

SpringCloud Alibaba 为服务组件 Nacos

使用注册中心,很好解决了上述问题,但是如何多服务中有服务宕机了如何处理。

SpringCloud Alibaba 为服务组件 Nacos

注册中心引入了心跳机制,每个服务本地会维护一个定时任务,每隔一段时间会发送一个心跳到注册中心。注册中心如果在一段时间内没有接收到服务的心跳,认为服务已经宕机,修改服务的状态,如果更长时间没有收到心跳,直接将服务剔除掉。如果将服务停止掉,服务会调用注销接口,同样会将服务剔除掉。服务调用接口也会有心跳机制,实时的拉取调用接口的服务状态,将服务以缓存的形式保存起来。不再使用 nginx 服务端的负载均衡,而使用客户端的负载均衡,即微服务端的负载均衡。

SpringCloud Alibaba 为服务组件 Nacos

Nacos 官方说明

2.2、Nacos 注册中心架构

SpringCloud Alibaba 为服务组件 Nacos

2.3、核心功能

Nacos discovery

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

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

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

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

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

主流的注册中心区别

Nacos 支持 CP + AP,默认使用的是 AP

SpringCloud Alibaba 为服务组件 Nacos

三、Nacos Server 部署

Nacos 下载地址

版本对应关系如下

SpringCloud Alibaba 为服务组件 Nacos

$ tar -zxvf nacos-server-1.4.2.tar.gz -C /opt/
$ cd /opt/nacos
$ vim /nacos/bin/startup.sh

SpringCloud Alibaba 为服务组件 Nacos

# 单机启动nacos,执行命令
$ bin/startup.sh -m standalone
# 或者将 cluster,改为 standalone,单机启动
# 全局配置文件目录 nacos/conf/application.properties
可以修改数据源,端口,登录用户名密码等信息。
启动后日志路径为 nacos/logs

SpringCloud Alibaba 为服务组件 Nacos

访问 nacos 的管理端: http://127.0.0.1:8848/nacos,默认用户名密码是 nacos/nacos

四、Nacos Client 服务搭建

项目模块准备

复制两份服务,修改服务的 artifactId,在父 pom 文件中进行关联
<modules>
 <module>order-nacos</module>
 <module>stock-nacos</module>
</modules>
如果发现服务是灰色的,在设置中找到 Ignored Files,取消勾选即可

SpringCloud Alibaba 为服务组件 Nacos

SpringCloud Alibaba 为服务组件 Nacos

4.1、引入依赖

父 pom 中支持 spring cloud & spring cloud alibaba,引入依赖

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>${spring.cloud.alibaba.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>

        <!-- Spring Cloud 的版本管理器   -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring.cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

项目引入依赖

<!-- nacos 服务注册与发现  -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

修改 application.yml 文件

server:
  port: 8020
# 应用名称(nacos 会自动将该名称当作服务名称)
spring:
  application:
    name: order-server
  cloud:
    nacos:
      server-addr: 127.0.0.1:8848
      discovery:
        username: nacos
        password: nacos
        # 命名环境用来隔离服务
        namespace: public


server:
  port: 8021
# 应用名称(nacos 会自动将该名称当作服务名称)
spring:
  application:
    name: stock-server
  cloud:
    nacos:
      server-addr: 127.0.0.1:8848
      discovery:
        username: nacos
        password: nacos
        # 命名环境用来隔离服务
        namespace: public

启动服务,可以看到控制台打印的日志,服务已经注册到 Nacos 上了,打开页面,可以看到服务已经注册到 Nacos 上了。

SpringCloud Alibaba 为服务组件 Nacos

SpringCloud Alibaba 为服务组件 Nacos

现在如果想要调用其它服务的接口,不需要再指定 IP,直接指定服务名即可。

SpringCloud Alibaba 为服务组件 Nacos

但是此时访问 http://127.0.0.1:8020/order/add 接口,发现报错,没有找到实例,但是服务确实已经注册了 Nacos。这是因为还要配置负载均衡器。此时调用接口成功!

SpringCloud Alibaba 为服务组件 Nacos

SpringCloud Alibaba 为服务组件 Nacos

负载均衡测试

默认的负载均衡类似于轮询,再配置一个stock-server 服务,端口为 8022,并且在调用的地方加上 ip 打印。

SpringCloud Alibaba 为服务组件 Nacos

SpringCloud Alibaba 为服务组件 Nacos

SpringCloud Alibaba 为服务组件 Nacos

SpringCloud Alibaba 为服务组件 Nacos

访问接口测试

Nacos 默认使用的是 ribbon 的负载均衡机制。

SpringCloud Alibaba 为服务组件 Nacos

SpringCloud Alibaba 为服务组件 Nacos

SpringCloud Alibaba 为服务组件 Nacos

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!