Nacos环境搭建 -- 服务注册与发现

为什么需要服务治理

在未引入服务治理模块之前,服务之间的通信是服务间直接发起并调用来实现的。只要知道了对应服务的服务名称、IP地址、端口号,就能够发起服务通信。比如A服务的IP地址为192.168.1.100:9000,B服务直接向该IP地址发起请求就可以获取对应的数据。但是,随着集群架构的搭建,服务的增多,集群架构的搭建,手动配置各个服务的实例清单就会变得越来越复杂,当集群规模发生改变、服务实例发生改变(数量或者ip等)改变,维护这种硬编码的配置内容需要消耗太多的开发资源。如果使用nginx等中间件,确实也可以实现,但是也会出现问题,比如两个服务集群之间无法直接通信,进而导致调用成本的增加,因为增加了一次网络消耗。还有当集群规模发生改变时,维护起来也是十分麻烦。

服务治理包含很多方面,在这主要讲解服务治理中的三个核心问题:服务注册、服务发现和服务的健康检查机制。

注册中心原理,见下图:

img

  1. 服务启动时会将自己的服务信息(服务名、IP、端口)注册到注册中心, 并向注册中心发送心跳信息来报告自己的健康状态。
  2. 注册中心会存储服务提供者上报的信息,并通过服务提供者发送的心跳来更新服务提供者最后的存活时间,如果超过一段时间没有收到服务提供者上报的心跳信息,则注册中心会认为服务提供者不可用,会将对应的服务提供者从服务列表中剔除。
  3. 服务订阅者会向注册中心订阅自身监听的服务,注册中心会保存服务订阅者的信息,也会向服务订阅者推送服务提供者的信息。
  4. 服务订阅者从注册中心获取到服务提供者的信息时,会直接调用服务提供者的接口来实现远程调用。

服务的注册与发现

服务注册

每个服务实例在启动时都将自己的服务名称、服务IP地址等信息提交到注册中心,注册中心将这些信息维护到实例清单中,这个过程就是服务注册。

有了注册中心之后,当集群规模发生改变、服务实例数量的增加和减少、服务名称发生改变、服务实例部署的IP地址或端口号发生改变,这些情况发生时都会通知注册中心,注册中心会自动修改实例清单中的内容。

服务发现

服务订阅者会从服务的注册中心获取服务提供者的服务列表,或者由服务的注册中心将服务提供者的服务列表变动信息推送给服务订阅者,这个过程叫作服务发现。

比如,订阅者可以在请求一次后就将可用的服务数据缓存到本地,直到注册中心主动将被调用方的服务实例清单变更信息推送过来,再进行本地缓存数据的变更。

服务的健康检查机制

所有的服务实例在注册中心注册成功后,每个服务实例都需要定时发送请求,告诉注册中心自己的健康状态。如果服务实例能够持续发送“心跳”信息,则表示一切正常,服务会被标记为可用的、可发现的。如果注册中心在一段时间内没有收到某个服务实例的“心跳”信息,就会将这个服务实例标记为不可用或不可达的状态,进而从可用的服务列表中剔除该服务实例的信息,在订阅者查询可用的服务实例清单时,该服务实例的信息不会返回给订阅者。

什么是Nacos

Nacos是 Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

Nacos 致力于发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,能快速实现动态服务发现、服务配置、服务元数据及流量管理。

Nacos的核心特性:
  1. 服务发现和服务健康监测
  2. 动态配置服务
  3. 动态 DNS 服务
  4. 服务及其元数据管理

Nacos环境搭建(单机)

以 MacOS 为例,搭建单机测试环境。

先安装好 JDK,需要 JDK 1.8+ 及其以上版本。

Nacos安装包下载

https://github.com/alibaba/nacos/releases/download/2.2.3/nacos-server-2.2.3.tar.gz

解压安装包
tar -xzvf nacos-server-2.2.3.tar.gz

如果是window系统直接解压即可。

单机模式启动
sh ./startup.sh -m standalone
停止Nacos
sh ./nacos/bin/shutdown.sh
验证是否成功

在浏览器中请求http://ip:8848/nacos,如果可以进入控制台,说明启动成功。

集成Nacos注册中心

创建父项目
  1. 打开开发工具(idea)
  2. 点击create new project
  3. 选择maven
  4. 选择好jdk,点击下一步
  5. 输入名称(比如:aa-springcloud)和项目地址(~/xxx/develop)
  6. pom引入如下:
<?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>c-springcloud</artifactId>
  <version>1.0-SNAPSHOT</version>

  <properties>
    <maven.compiler.source>17</maven.compiler.source>
    <maven.compiler.target>17</maven.compiler.target>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
  <packaging>pom</packaging>

  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.0.2</version>
  </parent>


  <dependencies>

    <!-- lombok 工具通过在代码编译时期动态的将注解替换为具体的代码,
                IDEA 需要添加 lombok 插件 -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.18</version>
        </dependency>
        <!-- fastjson -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.83</version>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.11</version>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-collections4</artifactId>
            <version>4.4</version>
        </dependency>

  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
      </plugin>
    </plugins>
  </build>

  <!-- 项目依赖管理 父项目只是声明依赖,子项目需要写明需要的依赖(可以省略版本信息) -->
  <dependencyManagement>
    <dependencies>
      <!-- spring cloud 依赖 -->
      <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-dependencies</artifactId>
        <version>2022.0.0</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>

      <!-- spring cloud alibaba 依赖 -->
      <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-alibaba-dependencies</artifactId>
        <version>2022.0.0.0</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>

</project>
依赖说明

spring-boot-dependencies:Spring Boot 基础依赖,包括各种 Java 后端框架技术栈、组件、插件等等。

spring-cloud-dependencies:Spring Cloud 相关依赖,比如:Netflix、openfeign、Gateway 等等。

spring-cloud-alibaba-dependencies:Spring Cloud Alibaba 相关依赖,比如:Nacos、Sentinel、RocketMQ 等等。

其他技术、插件依赖等都在父项目中维护版本号,其他子项目继承即可,不需要重复维护版本号。

Spring Cloud Alibaba & Spring Cloud & Spring Boot 之间的依赖关系

Spring Cloud AlibabaSpring CloudSpring Boot
2022.0.0.0Spring Cloud 2022.0.03.0.2
2021.0.4.0Spring Cloud 2021.0.12.6.11
2021.0.1.0Spring Cloud 2021.0.12.6.3
2.2.7.RELEASESpring Cloud Hoxton.SR122.3.12.RELEASE
2021.1Spring Cloud 2020.0.12.4.2
2.2.6.RELEASESpring Cloud Hoxton.SR92.3.2.RELEASE
2.1.4.RELEASESpring Cloud Greenwich.SR62.1.13.RELEASE
2.2.1.RELEASESpring Cloud Hoxton.SR32.2.5.RELEASE
2.2.0.RELEASESpring Cloud Hoxton.RELEASE2.2.X.RELEASE
2.1.2.RELEASESpring Cloud Greenwich2.1.X.RELEASE

spring-boot-maven-plugin(Spring Boot 打包插件,在 Spring Boot 父项目中定义了,只需要 Spring Boot 微服务自行引入)

maven-compiler-plugin(Maven 编译插件,所有项目继承)

用 pluginManagement 和 plugins 分开管理的区别是,pluginManagement 里面的插件是需要项目自行引入的,而 plugins 中的插件是自动继承的

创建子模块
  1. 在父项目名称上右键,依次点击 -> new -> Module…,进入子模块创建界面
  2. 填写模块名称和存储地址,选择jdk等
  3. 子模块pom引入如下:
<?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>
  <parent>
    <groupId>com.example.cloud</groupId>
    <artifactId>c-springcloud</artifactId>
    <version>1.0-SNAPSHOT</version>
  </parent>

  <artifactId>c-service-nacos-client</artifactId>

  <properties>
    <maven.compiler.source>17</maven.compiler.source>
    <maven.compiler.target>17</maven.compiler.target>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
  <!-- nacos -->
  <dependencies>
    <dependency>
      <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    <!-- spring boot web -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- actuator -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
  </dependencies>
</project>
  1. 创建主入口

在src下创建项目路径比如:com.example.cloud,在此路径下新增一个类,起名为NacosClientApplication。

@EnableDiscoveryClient
@SpringBootApplication
public class NacosClientApplication {
    public static void main(String[] args) {
        SpringApplication.run(NacosClientApplication.class, args);
    }
}
  1. 添加配置文件
    在resource文件夹下创建一个名称为application.yml的配置文件,文件内容如下
server:
  port: 8000
  servlet:
    context-path: /c-service-nacos-client
spring:
  application:
    name: c-service-nacos-client # 应用名称也是构成 Nacos 配置管理 dataId 字段的一部分 (当 config.prefix 为空时)
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        enabled: true
        namespace: c3bee016-66ca-4a73-a1f8-af0390e5ce08
  1. 启动项目,验证是否注册成功
    在主启动类中,右键->点击run NacosClientApplication启动项目,打开nacos控制台,在服务管理->服务列表中如果出现了启动的服务,说明注册成功了。
  2. 服务发现代码
    在开发路径下右键点击 -> New -> Package,新建一个名为service的文件夹,在文件夹下创建一个名为NacosClientService的类
@Service
@Slf4j
public class NacosClientService {

    private final DiscoveryClient discoveryClient;

    public NacosClientService(DiscoveryClient discoveryClient) {
        this.discoveryClient = discoveryClient;
    }

    /**
     * 打印Nacos Client中的信息
     * @return
     */
    public List<ServiceInstance> getNacosClientInfo(String serviceId) {
        log.info("请求Nacos Client获取服务实例的信息:[{}]", serviceId);
        return discoveryClient.getInstances(serviceId);
    }
}

在开发路径下右键点击 -> New -> Package,新建一个名为controller的文件夹,在文件夹下创建一个名为NacosClientController的类

@Slf4j
@RestController
@RequestMapping("/nacos-client")
public class NacosClientController {

    private final NacosClientService nacosClientService;

    public NacosClientController(NacosClientService nacosClientService) {
        this.nacosClientService = nacosClientService;
    }

    @GetMapping("service-instance")
    public List<ServiceInstance> getNacosClientInfo(
        @RequestParam(defaultValue = "c-service-nacos-client") String serviceId) {
        log.info("打印nacos client信息:[{}]", serviceId);
        return nacosClientService.getNacosClientInfo(serviceId);
    }
}

右键resouce -> New -> Directory,创建一个名为http的路径,然后右键点击http文件夹 -> New -> File,创建一个名为Nacos-client.http的文件

### 查询服务实例信息
GET http://127.0.0.1:8000/c-service-nacos-client/nacos-client/service-instance
Accept: application/json

启动NacosClientApplication项目,进入nacos控制台查看是否注册成功,然后进入nacos-client.http,点击左边的绿色三角请求信息,如果返回如下信息,说明服务实例可以被发现。

[
  {
    "serviceId": "c-service-nacos-client",
    "instanceId": null,
    "host": "192.168.1.235",
    "port": 8000,
    "secure": false,
    "metadata": {
      "nacos.instanceId": null,
      "nacos.weight": "1.0",
      "nacos.cluster": "DEFAULT",
      "nacos.ephemeral": "true",
      "nacos.healthy": "true",
      "preserved.register.source": "SPRING_CLOUD"
    },
    "uri": "http://192.168.1.235:8000",
    "scheme": null
  }
]  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/421961.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

超好看的下载页HTML源码分享

超好看的下载页HTML源码分享,源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面 下载地址&#xff1a;https://www.qqmu.com/2337.html

Java基于SpringBoot的网上租赁系统设计与实现论文

摘 要 本课题是根据用户的需要以及网络的优势建立的一个基于Spring Boot的网上租贸系统&#xff0c;来满足用户网络商品租赁的需求。 本网上租贸系统应用Java技术&#xff0c;MYSQL数据库存储数据&#xff0c;基于Spring Boot框架开发。在网站的整个开发过程中&#xff0c;首先…

NXP实战笔记(十一):32K3xx基于RTD-SDK在S32DS上配置LPSPI(同步、异步、DMA、主机、从机、中断、轮询)

目录 1、概述 2、RTD-SDK配置 2.1、配置目标 2.2、主、从机引脚配置 2.3、时钟配置 2.4、LPSPI配置 2.5、中断配置 2.6、DMA配置(使用DMA才会配置) 2、dma Logic Instance 2.7、RM配置(使用DMA的情况下必须配置此选项) 3、代码实现 1、概述 S32K3_低功耗LPSPI轮询…

Java基于微信小程序的房屋租赁、租房小程序,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

《TCP/IP详解 卷一》第12章 TCP初步介绍

目录 12.1 引言 12.1.1 ARQ和重传 12.1.2 滑动窗口 12.1.3 变量窗口&#xff1a;流量控制和拥塞控制 12.1.4 设置重传的超时值 12.2 TCP的引入 12.2.1 TCP服务模型 12.2.2 TCP可靠性 12.3 TCP头部和封装 12.4 总结 12.1 引言 关于TCP详细内容&#xff0c;原书有5个章…

【YOLO v5 v7 v8 小目标改进】新CNN架构 InceptionNeXt:怎么让大卷积核既好用又快

新CNN架构 InceptionNeXt&#xff1a;怎么让大卷积核既好用又快 提出背景问题: 如何提高大核心卷积的效率&#xff0c;同时保持或提升模型性能&#xff1f; 改进思路MetaNeXtInception深度卷积InceptionNeXt 小目标涨点YOLO v5 魔改YOLO v7 魔改YOLO v8 魔改 提出背景 论文&am…

【改进算法】【IHAOAVOA】天鹰优化算法和非洲秃鹫混合优化算法

目录 1 主要内容 IHAOAVOA流程图 主要创新点 2 部分代码 3 程序结果 4 下载链接 1 主要内容 该程序复现《IHAOAVOA: An improved hybrid aquila optimizer and African vultures optimization algorithm for global optimization problems》&#xff0c;天鹰优化算法&am…

【c++】理解vec.push_back(vector<int>())

vector<vector> vec; vec.push_back(vector()); vec.back().push_back(10); 定义一个二维向量&#xff08;动态数组&#xff09;: vector<vector> vec; 这行代码定义了一个名为vec的变量&#xff0c;它是一个向量&#xff08;动态数组&#xff09;&#xff0c;其中…

Apache Echarts介绍与入门

介绍 Apache ECharts 是一款基于 Javascript 的数据可视化图表库&#xff0c;提供直观&#xff0c;生动&#xff0c;可交互&#xff0c;可个性化定制的数据可视化图表。 官网地址&#xff1a;https://echarts.apache.org/zh/index.html 入门案例 Apache Echarts官方提供的快…

MySQL误truncate截断后数据恢复2024.3.1

近期很多MySQL数据丢失情况&#xff0c;很多是人为误操作导致。MySQL数据库丢失可能由truncate截断表、delete删除表中数据行、delete删除表、delete删除库、操作系统rm删除数据库文件、硬盘坏道等情况导致。本案例是一个误截断表导致的丢失。 不管哪种情况&#xff0c;第一时…

STM32USART串口数据包

文章目录 前言一、介绍部分数据包两种包装方式&#xff08;分割数据&#xff09;HEX数据包文本数据包 数据包的收发流程数据包的发送数据包的接收固定包长的hex数据包接收可变包长的文本数据包接收 二、实例部分固定包长的hex数据包接收连接线路代码实现 可变包长的文本数据包接…

JavaScript DOM操作笔记记录回忆总结

一、什么是DOM&#xff1f; 1、通过 HTML DOM&#xff0c;可访问 JavaScript HTML 文档的所有元素。 2、当网页被加载时&#xff0c;浏览器会创建页面的文档对象模型&#xff08;Document Object Model&#xff09; 二、操作DOM 1、在操作DOM之前&#xff0c;我们需要先获取到…

设计模式-结构型模式-外观模式

外观模式&#xff08;Facade&#xff09;&#xff0c;为子系统中的一组接口提供一个一致的界面&#xff0c;此模式定义了一个高层接口&#xff0c;这个接口使得这一子系统更加容易使用。[DP] 首先&#xff0c;定义子系统的各个组件接口和具体实现类&#xff1a; // 子系统组件接…

1美元持有ZKFair PFP-CyberArmy,潜在收益分析

3月2日&#xff0c;ZKFair PFP-CyberArmy 将在 Element 上正式开始Public Sale。

yolov9从头开始训练

yolov9从头开始训练 一、准备数据集 数据集相关文件存放布局如下 yolov9-datasets ├── train │ ├── images │ │ ├── image.jpg │ │ ├── │ └── labels │ ├── image.txt │ ├── ├── valid │ ├── images │ │ ├── image.jpg │ │ ├─…

Android minigbm框架普法

Android minigbm框架普法 引言 假设存在这么一个场景&#xff0c;我的GPU的上层实现走的不是标准的Mesa接口&#xff0c;且GPU也没有提专门配套的gralloc和hwcompoer实现。那么我们的Android要怎么使用到EGL和GLES库呢&#xff0c;并且此GPU驱动是支持drm实现的&#xff0c;也有…

【Sql Server】Update中的From语句,以及常见更新操作方式

欢迎来到《小5讲堂》&#xff0c;大家好&#xff0c;我是全栈小5。 这是《Sql Server》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对…

翻译论文:Beating Floating Point at its Own Game: Posit Arithmetic(一)

仅作记录学习使用&#xff0c;侵删 原文Beating Floating Point at its Own Game: Posit Arithmetic 参考翻译Posit: 替换IEE754的新方式 | SIGARCH 摘要 IEEE标准754浮点数&#xff08;浮点数&#xff09;的直接接点替换 Posit的优势 不需要区间算术或可变大小操作数 如…

Freesia 项目引用的依赖

UML图 项目总依赖 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.0</version> </parent> <groupId>com.freesia</groupId> <artifa…

Java ElasticSearch面试题

Java ES-ElasticSearch面试题 前言1、ElasticSearch是什么&#xff1f;2. 说说你们公司ES的集群架构&#xff0c;索引数据大小&#xff0c;分片有多少 &#xff1f;3. ES的倒排索引是什么&#xff1f;4. ES是如何实现 master 选举的?5. 描述一下 ES索引文档的过程&#xff1a;…