Nacos 注册中心介绍与实操

前言

本文为个人SpringCloud学习笔记,主要记录Nacos的注册中心实操、SpringBoot多模块编程实操等

注册中心

注册中心介绍

注册中心是微服务的一个重要组件,用于实现服务的注册与发现,主要作用包括以下:

  • 服务注册: 服务实例启动时,将自身信息注册到注册中心,包括服务名称、地址、端口等。
  • 服务发现:消费者向注册中心查询服务,并获取服务实例信息来访问服务。
  • 服务健康检测:注册中心定期检测服务实例健康状况,过滤不健康实例。
  • 服务路由:提供服务的路由与负载均衡功能。
  • 服务监控:统计服务调佣次数,时长等,用于监控服务状态。
  • 服务更新:当服务实例信息变更时,向注册中心发送更新信息通知。通过注册中心,服务提供者和消费者只需与注册中心交互即可,从而实现服务的注册与发现,减低服务间的耦合度。

注册中心交互流程

这张图非常重要
在这里插入图片描述

注册中心通常有两个角色

  • 服务提供者(也叫生产者):对外提供服务的微服务应用。它会把自身的服务地址注册到注册中心,以供消费者发现和调用。
  • 服务调用者(也叫消费者) :调用其他微服务的应用程序。它会向注册中心订阅自己需要的服务,并基于服务提供者注册的信息发起远程调用。这个具体服务调用的受到负载均衡控制

生产者实现

使用多模块编程的方式实现生产者

1.构建父模块
在这里插入图片描述
2.父模块添加依赖
在这里插入图片描述
3.删除无用文件
在这里插入图片描述
4.父依赖修正
在这里插入图片描述
在这里插入图片描述
4.构建子模块生产者(prodiver)
在这里插入图片描述
在这里插入图片描述
5.子类依赖
在这里插入图片描述
6.删除重复依赖

因为父模块中已经有配置,那么子模块下面图示代码删除即可

在这里插入图片描述
在这里插入图片描述
7.添加所属父类说明
在这里插入图片描述
8.父类添加拥有子类说明
在这里插入图片描述
9. 子类配置application.yml

spring:
  application:
    # 服务注册站点
    name: nacos-provider #命名不能使用‘_’,早期SpringCloud不支持
  cloud:
    nacos:
      # Nacos认证信息
      discovery:
        username: nacos
        password: nacos
        # Nacos 服务发现与注册配置,其中子属性server-addr指定Nacos服务器主机和端口
        server-addr: localhost:8848
        namespace: public # 注册到nacos的指定namespace,默认public
server:
	port: 0 #动态端口

补充:这里使用动态端口是因为微服务中,消费者在调用生产者服务的时候是通过Nacos作为中间人的,具体调用到哪个一个实际上并不关心,所以实际生产者端口号分配工作不妨丢给操作系统去分配,这样也不怕端口被占有的问题。同时,也是因为微服务的随机调用生产者服务,不需要写死服务调用端口号,所以机器处理可靠下,为什么不让机器来考虑这种问题呢?而且微服务体量大,如果人为去分配,也可以导致两个服务分配到相同的端口号,所以这种工作不妨让机器去苦恼。

10.子模块启动
在这里插入图片描述
项目启动:
在这里插入图片描述

在项目启动后,会自动注册到Nacos中作为一个服务站点中的一员

访问成功:
在这里插入图片描述
11.最终说明
到此多模块的创建便结束了,以下是父模块pom.xml与子模块provider的pom.xml

父模块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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>SpringCloudDiscoveryDemo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>SpringCloudDiscoveryDemo</name>
    <description>SpringCloudDiscoveryDemo</description>
    <!--  标识当前为父模块  -->
    <packaging>pom</packaging>
    <properties>
        <java.version>17</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>3.0.2</spring-boot.version>
        <spring-cloud-alibaba.version>2022.0.0.0</spring-cloud-alibaba.version>
        <spring-cloud.version>2022.0.0</spring-cloud.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <modules>
        <module>provider</module>
    </modules>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <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>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>17</source>
                    <target>17</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring-boot.version}</version>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

provider----->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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>provider</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>provider</name>
    <description>provider</description>
    <parent>
        <groupId>com.example</groupId>
        <artifactId>SpringCloudDiscoveryDemo</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>17</source>
                    <target>17</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <mainClass>com.example.provider.ProviderApplication</mainClass>
                    <skip>true</skip>
                </configuration>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

消费者

注册中心的消费者的实现比生产者更为复杂一些,首先因为消费者要通过调用生产者提供API来完成服务,这其中就需要HTTP接口作为中间人,那么就需要引入Spring Cloud OpenFeign,其次为了实现负载均衡,我们还需要添加客户端负载均衡器Spring Cloud LoadBalancer

  • Spring Cloud OpenFeign: Spring Cloud OpenFeign 是 SpringCloud 生态系统中的一个组件,它是基于 Netflix 的 Feign 库开发的,用于简化和优化微服务架构中的服务间通信。
  • Spring Cloud LoadBalancer: Spring Cloud 团队提供的一种客户端负载均衡器
  • 负载均衡(Load Balancer) :一种在多个服务实例之间分配负载和流量的技术,目的是提高服务的整体性能和可靠性。

消费者创建步骤如下:
1.子模块消费者(Consumer)
还是一样的配方
在这里插入图片描述
2.添加依赖
父模块添加OpenFegin与LoadBalance依赖

<dependency>
       <groupId>org.springframework.cloud</groupId>
       <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
<dependency>
       <groupId>org.springframework.cloud</groupId>
       <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

父模块添加子模块说明

<modules>
    <module>provider</module>
    <module>consumer</module>
</modules>

子模块添加父模块说明

<parent>
   <groupId>com.example</groupId>
   <artifactId>SpringCloudDiscoveryDemo</artifactId>
   <version>0.0.1-SNAPSHOT</version>
</parent>

3.启动配置

spring:
  application:
    # 服务注册站点
    name: nacos-consumer#命名不能使用‘_’,早期SpringCloud不支持
  cloud:
    nacos:
      # Nacos认证信息
      discovery:
        username: nacos
        password: nacos
        # Nacos 服务发现与注册配置,其中子属性server-addr指定Nacos服务器主机和端口
        server-addr: localhost:8848
        namespace: public # 注册到nacos的指定namespace,默认public
        register-enabled: false
server:
  port: 8080 

这里需要注意的是:对于消费者而已,我们需要把它的注册功能关闭,因为消费者本身是调用服务而不提供服务,所以没必要注册服务,所以这里使用“register-enabled: false”将其关闭,而且消费者生产者的服务注册站点名字配置上也不同,方便管理

除此之外还有一点,对于客户端来说,他不再想服务端那样端口动态化,因为客户端主要还是面向人的,如果人要使用,端口动态,那么我要如何才能准确访问到呢?所以客户端端口需要明确指定

4.开启OpenFegin
在消费者的启动类上加上注解@EnableFeignClients

@SpringBootApplication
@EnableFeignClients
public class ConsumerApplication {

    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class, args);
    }

}
  1. 创建消费者调用服务接口

在这里插入图片描述

@Service
@FeignClient(name = "nacos-provider")
public interface UserService {

    @RequestMapping("/user/getInfo")
    public String getInfo(@RequestParam("name") String name);
}

这里我们需要注意到的是@FeignClient(name = “nacos-provider”),就是告诉这个接口:服务站点在这个位置

@RequestMapping(“/user/getInfo”)而这一句注解则是告诉这个服务接口具体路由,所以消费者的接口就可以通过路由访问调用到生产者的API了

6.调用服务API

import com.example.consumer.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class OrderController {

    @Autowired
    private UserService userService;

    @RequestMapping("/order")
    public String getInfo(){
        return userService.getInfo(" Spring Cloud");
    }
}

7.实际效果

在这里插入图片描述

注册中心参数介绍

注册中心详情页:
在这里插入图片描述
重要参数说明

  • 分组:注册服务所在组名,默认是DEFAULT_GROUP,
  • 保护阈值:健康节点要求的最小百分比。用于在服务出现不健康实例时,阻止流量过度向少量健康实例集中,保护服务的整体可用性。保护闻值应设置为一个0到1之间的浮点数,默认值为0。当集群中的健康实例占比小于设置的保护闻值时,就会触发闻值保护功能。触发保护闻值后,Nacos会将全部实例(健康实例+非健康实例)返回给调用者,虽然可能会损失一部分流量,但能保证集群中剩余的健康实例能正常工作。
  • 服务路由类型: 用于实现不同的路由需求,常见的路由类型有以下两种:
    • none:默认路由,基于权重的轮询负载均衡路由策略0
    • label:标签路由,相同标签的实例会被聚合为一个集群,不同标0签则实现流量隔离。
  • 实例:
    • 临时实例: Nacos 中的实例分为临时实例和永久实例(也叫持久实例),临时实例的生命周期和服务的运行周期相同,服务停止运行Nacos 中就会将临时实例删除;
    • 永久示例:即时程序终止,也会保留在Nacos 中。在配置文件中通过:spring.cloud.nacos.discovery.ephemeral=true 设置
  • 权重:用于实现负载均衡,取值范围0到10000,数值越大,权重越大,负载均衡被分配的概率也就越高。设置为0的时候表示下线

label 标签实现就近访问,官方实现: https://nacos.io/zh-cn/blog/cmdb.html
民间实现:
https://blog.csdn.net/lr309283175/article/details/116030428

健康检测机制

Nacos中的健康检测机制是用来检查服务健康状态的,只有健康的节点才会被服务消费端调用,这样才能保证程序稳定、正常的运行。Nacos中提供了两种健康检测的机制:

  1. 客户端主动上报(健康状态的) 机制
  2. 服务器端反向探测(健康状态的) 机制

举个简单的例子:
面对灾害,对于被困人,ta需要主动求助:“救救我,救救我”,而对于搜救员,是“你在哪,你在哪”的反向询问确认

所以就是说,客户端每隔一段时间,跟服务端上报状态,而服务端则通过反向探测来确定客户端是否健康

所以这两种机制时间上是对应两个服务实例
临时实例:对应客户端主动上报状态
永久实例:反向探测客户端状态


END
希望对你有帮助
  • 21
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

摸鱼儿hzj

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值