首页 > 其他分享 >Nacos原理和应用

Nacos原理和应用

时间:2024-07-20 14:29:02浏览次数:16  
标签:服务 Nacos nacos 实例 应用 原理 service1 cloud

文章目录

Nacos安装与启动

首先安装 Nacos 服务,Windows 安装地址:https://github.com/alibaba/nacos/releases

之后进入 bin 目录,使用命令行输入:

startup.cmd -m standalone

此时出现下图就代表启动成功

image-20240720094718494

默认端口是 8848,如果需要修改端口,就进入 conf 目录里的 application.properties 文件,修改 server.port 值即可

image-20240720094954422

然后,在浏览器输入http://127.0.0.1:8848/nacos即可进行访问

image-20240720095027365

用户名和密码都是 nacos,登录后页面如下:

快速入门

这里首先创建一个父工程 nacos-demo,之后创建两个服务,分别是 service1 和 service2,其中 service1 需要通过 Feign 调用 service2 的方法(Feign 的使用在上个教程有讲过Eureka原理和应用(结合Feign)

之后的步骤如下:

1.在父工程中加入如下依赖:

<dependencies>
    <!-- nacos客户端依赖 -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>

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

    <!--HttpClient-->
    <dependency>
        <groupId>io.github.openfeign</groupId>
        <artifactId>feign-httpclient</artifactId>
    </dependency>

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

</dependencies>
<dependencyManagement>
    <dependencies>
        <!--spring-cloud管理依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>2021.0.1</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>

        <!-- nacos的管理依赖 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>2021.0.1.0</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

这里需要注意,如果不加 Loadbalancer 的依赖,会导致 Feign 调用时报错,报错的理由是 UnknownHostException,即找不到对应服务的主机

原因在于,比如 A 服务 调用 B 服务,在 Feign 调用时,A 拿到的是 B 服务的名字 b-service,那么在调用的时候是:http://b-service/xx。这时候会判断 FeignClient 是否设置 url 属性,如果设置了,那么直接使用 url 属性的值进行调用;如果没有,就会使用对应的 LoadBalance api 从对应的注册中心获取服务的实例地址。也就是说当使用服务名调用的时候,负载均衡总需要一个,Ribbon 或 Spring Cloud Loadbalancer。不然就无法将服务名替换成对应的真实服务地址进行调用

而在 Nacos 较新的版本中,是不提供 Ribbon 支持的(因为 Ribbon 目前已经停止维护,Spring Cloud 使用了 LoadBalancer 来 替代 Ribbon),因此我们需要单独引入 LoadBalancer 的 jar 包

2.编写 service1 的配置文件

spring:
  cloud:
    nacos:
      server-addr: localhost:8848 # nacos服务地址
  application:
    name: service1 # 服务名
server:
  port: 8080

3.编写 service2 的配置文件

spring:
  cloud:
    nacos:
      server-addr: localhost:8848 # nacos服务地址
  application:
    name: service2 # 服务名
server:
  port: 8081

4.编写 service2 的控制层

@RestController
@RequestMapping("/service2")
@Slf4j
public class WebController {

    @GetMapping("/user")
    public String getUser() {
        log.info("调用service2方法");
        return "张三";
    }

}

5.编写 service1 的控制层和 Feign 客户端

@FeignClient("service2")
public interface UserClient {

    @GetMapping("/service2/user")
    String getUser();

}
@RestController
@RequestMapping("/service1")
@Slf4j
public class WebController {

    @Autowired
    private UserClient userClient;

    @GetMapping("/user")
    public String getUser() {
        log.info("调用service1方法");
        return userClient.getUser();
    }

}

6.在 service1 的启动类上加上 @EnableFeignClients 注解

@SpringBootApplication
@EnableFeignClients
public class Service1Application {
    public static void main(String[] args) {
        SpringApplication.run(Service1Application.class, args);
    }
}

7.启动两个服务并进行测试

首先进入控制台,可以看到两个服务均已启动

image-20240720105050628

然后使用 Postman 向 service1 发送请求,可以看到发送成功

image-20240720105122406

服务分级存储模型

服务分级存储模型

一个服务对应多个实例,而同在一个地域的多个实例称为一个集群,因此 Nacos 的服务分级存储模型中,第一级是服务,再往下就是集群和实例

Nacos 引入集群概念的目的是为了防止跨集群调用的问题,因为服务调用尽可能选择本地集群的服务,而跨集群调用延迟较高。只有本地集群不可访问时,才去访问其它集群

配置实例集群属性的方法:

修改application.yml,添加如下内容:

spring:
  cloud:
    nacos:
      server-addr: localhost:8848 # nacos服务地址
      discovery:
        cluster-name: SZ # 集群名称

在控制台中,可以看到服务对应的集群,如下所示

image-20240720105524933

Nacos 默认的负载均衡规则是 RoundRobinLoadBalancer(轮询)

环境隔离

Nacos 中服务存储和数据存储的最外层都是 namespace(命名空间)。namespace 中可以分组,成为 group,而 group 就是具体的服务或数据

namespace

新建 namespace 的方式:

1.在控制台创建 namespace,用来隔离不同环境

image-20240720112530801

2.填写一个新的命名空间信息

image-20240720112547227

3.保存后即可在控制台中看到该命名空间,这里需要注意其 id

image-20240720112628123

4.修改 service1 配置文件中的 application.yml,添加 namespace

spring:
  cloud:
    nacos:
      server-addr: localhost:8848 # nacos服务地址
      discovery:
        cluster-name: SZ # 集群名
        namespace: 35154e51-4b73-4f80-bbb3-fc79b7b51de9 # 命名空间的ID
  application:
    name: service1 # 服务名
server:
  port: 8080

5.启动 service1 实例,进行测试

此时会发现 service1 无法访问 service2 的接口,原因在于,不同的 namespace 之间的服务互相不可见

image-20240720112905878

Nacos原理

Nacos细节分析

与 Eureka 不同的是,在健康监测中,Nacos 将服务提供者分成临时实例非临时实例(默认是临时实例)。对于临时实例来说,和 Eureka 一样,采用心跳监测的方式进行健康监测,若服务超时没发送心跳会被注册中心直接剔除。对于非临时实例来说,Nacos 不要求做心跳监测,而是 Nacos 主动发请求询问服务是否还正常,若非临时实例不正常,Nacos 不会将其剔除,而是仅仅标记其为不健康的状态,并等待其恢复健康

其次,若 Nacos 发现有服务挂了,会立即推送给消费者,告诉消费者服务变更了。这样的好处是可以避免服务在消费者定时拉取服务的间隔期间挂掉了,导致消费者未能及时更新服务列表,而去访问了一个挂了的服务器。因此 Nacos 采用的方式是 pull + push 两者结合,而 Eureka 采用的只有 pull

设置为非临时实例的方式:

服务注册到 Nacos 时,可以选择注册为临时或非临时实例,通过下面的配置来设置:

spring:
  cloud:
    nacos:
      discovery:
        ephemeral: false # 设置为非临时实例

此时重新启动可以看到,临时实例这一列的值为 false

image-20240720113337736

总结:

Nacos与Eureka的共同点:

① 都支持服务注册和服务拉取
② 都支持服务提供者心跳方式做健康检测

Nacos与Eureka的区别:

① Nacos 支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式
② 临时实例心跳不正常会被剔除,非临时实例则不会被剔除
③ Nacos 支持服务列表变更的消息推送模式,服务列表更新更及时
④ Nacos 集群默认采用 AP(可用性 + 分区容错性) 方式,当集群中存在非临时实例时,采用 CP(一致性 + 分区容错性) 模式;Eureka采用 AP 方式

标签:服务,Nacos,nacos,实例,应用,原理,service1,cloud
From: https://blog.csdn.net/Vendetta_A_A/article/details/140569296

相关文章

  • 奇异值分解(SVD)原理
    0引子奇异值分解(singularvaluedecomposition,SVD)是一种矩阵因子分解方法,是线性代数的概念。在机器学习中,矩阵分解是常用的手段,作为矩阵分解的经典方法SVD,不仅是经典的数学问题,在工程应用中许多地方也都有它的身影。SVD被广泛应用在推荐系统、图像处理等领域,是一种数据降......
  • 将 .NET Framework 应用程序更新到 .NET Core。这是一个 VB.NET Windows 服务
    我有一个用VB.NET编写的有点旧的.NET4.7Windows服务。我想将其升级到.NETCore8.0,但升级向导似乎不想处理大量工作如果.NETCore支持VB.NETWindows服务,我找不到任何真正的内容....我可以找到大量创建控制台应用程序等的C#示例,但没有找到VB.NET的任何内......
  • 基于香橙派AIpro和昇腾AI计算芯片的目标检测应用(详细教程)
    目录前言1.介绍开发板2.应用场景3.安装操作系统3.1下载工具3.2 烧录系统3.3 系统装载4.配置操作系统4.1 登录系统账户4.2配置网络连接4.3查看设备网络4.4配置远程连接5.部署目标检测应用5.1准备运行环境5.2 模型二次训练​5.3热成像温度检测5.4转......
  • [rCore学习笔记 016]实现应用程序
    写在前面本随笔是非常菜的菜鸡写的。如有问题请及时提出。可以联系:[email protected]:https://github.com/WindDevil(目前啥也没有设计方法了解了特权级机制,实际上如果要设计一个应用程序就需要保证它符合U模式的要求,不要去访问S模式下的功能,那么其实现要点是:应......
  • 硅纪元AI应用推荐 | 5分钟搞定会议纪要,一键生成脑图
    大家好,我们要聊的是如何用AI把会议纪要变成一种享受,而不是一种折磨。想象一下,你刚刚结束了一场马拉松式的会议,结果发现还得自己整理纪要。那种感觉,就像是刚跑完马拉松,还得自己数步数一样痛苦。在这个快节奏的时代,谁不想在会议结束后,立刻享受一杯咖啡,而不是埋头苦干整理纪要?今......
  • Langchain 与 LlamaIndex:LLM 应用开发框架的比较与使用建议
    Langchain和Llamaindex是两种广泛使用的主流LLM应用开发框架。两者有什么不同?我们该如何使用?以下我根据各类资料和相关文档做了初步选型。一、Langchain1.适用场景(1)需要构建灵活、可扩展的通用应用程序。(2)需要复杂的工作流程支持。(3)需要复杂的交互和上下文保留功能。(4......
  • Python中的`@property`装饰器:深入解析与实战应用
    Python中的@property装饰器:深入解析与实战应用在Python中,@property装饰器是一种强大的工具,它允许类的方法被当作属性来访问。这一特性极大地增强了类的封装性和易用性,使得类的外部使用者可以像访问普通属性一样访问由方法计算或处理过的数据,而无需直接调用这些方法。本文将......
  • 探讨事件委托的原理、优势、实现方式
    事件委托(EventDelegation)是前端开发中一种高效且优雅的事件处理方式,尤其在处理动态添加或大量相似元素的事件绑定时尤为重要。本文将深入探讨事件委托的原理、优势、实现方式及其在实际应用中的一些高级用法。事件委托的基本原理事件委托利用了事件冒泡(EventBubbling)机制。事......
  • Solution Set - 容斥原理/二项式反演
    https://www.becoder.com.cn/contest/5400「BZOJ2863」愤怒的元首题目就是求\(n\)个点DAG的数量。设\(dp_i\)表示\(i\)个点的DAG数量。首先DAG一定存在出度为\(0\)的点,其次删去出度为\(0\)的点,仍构成一个DAG。所以我们可以枚举删去的数量,从而划分子问题。......
  • 详解Nacos集群搭建
    目录前言1.集群结构图 2.搭建集群2.1初始化数据库 2.2下载nacos 2.3配置Nacos2.4启动2.5nginx反向代理2.6优化前言在我们日常的开发当中,用的都是单点Nacos,这种模式,我们自己开发测试玩一玩还可以,但是到了企业的生产环境之下,你还这么玩的话,那肯定是要出......