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

news2024/11/16 10:53:24

为什么需要服务治理

在未引入服务治理模块之前,服务之间的通信是服务间直接发起并调用来实现的。只要知道了对应服务的服务名称、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
  }
]  

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux网络编程——网络基础

Linux网络编程——网络基础 1. 网络结构模式1.1 C/S 结构1.2 B/S 结构 2. MAC 地址3. IP地址3.1 简介3.2 IP 地址编址方式 4. 端口4.1 简介4.2 端口类型 5. 网络模型5.1 OSI 七层参考模型5.2 TCP/IP 四层模型 6. 协议6.1 简介6.2 常见协议6.3 UDP 协议6.4 TCP 协议6.5 IP 协议6…

05 OpenCV图像混合技术

文章目录 理论算子示例 理论 其中 的取值范围为0~1之间 算子 addWeighted CV_EXPORTS_W void addWeighted(InputArray src1, double alpha, InputArray src2, double beta,double gamma, OutputArray dst, int dtype -1 ); 参数1&#xff1a;输入图像Mat …

进程操作(Win32, C++)

CProcessUtils.h #pragma once#include <wtypesbase.h> #include <tchar.h> #include <vector> #include <map> #include <string>#ifdef _UNICODE using _tstring std::wstring; #else using _tstring std::string; #endif// 进程信息 typed…

element-plus表格合并

要实现这样的表格&#xff0c; 怎么做呢&#xff1f; 甚至是这种三级的呢&#xff1f; 官网的案例也是通过这个方法进行配置的&#xff0c;也就是说表格长什么样&#xff0c;关键在怎么处理的方法上。 这是官网的方法&#xff0c;可参考拓展&#xff1a; const arraySpanMeth…

SLAM ORB-SLAM2(21)基础矩阵的计算和评分

SLAM ORB-SLAM2&#xff08;21&#xff09;基础矩阵的计算和评分 1. 前言2. 基础矩阵2.1. 对级约束2.2. 推导2.3. 计算原理 3. ComputeF214. CheckFundamental 1. 前言 在 《SLAM ORB-SLAM2&#xff08;20&#xff09;查找基础矩阵》 中了解到 查找基础矩阵主要过程&#xff1…

nginx 配置浏览器不缓存文件 每次都会从服务器 请求新的文件

目录 解决问题方法说明 测试html环境js环境第一步然后修改内容 打开带有js缓存的页面强制刷新 配置nginx 每次打开页面都会重新请求index.js 文件重启nginx再次修改index.js 总结设置为全局 解决问题 适用于实时更新数据的&#xff0c;网页 可以让用户每次都是重新请求&#x…

《从0开始搭建实现apollo9.0》系列三 CANBUS模块解读

二、CANBUS代码 1、canbus模块的软件架构如下&#xff1a; 主要输入输出 输入&#xff1a;apollo::control::ControlCommand | 控制指令 输出&#xff1a; /apollo/chassis | apollo::canbus::Chassis | 车辆底盘信息接口数据&#xff0c;包括车辆速度、方向盘转角、档位、底盘…

Vue Html中插入本地视频(Video 标签)

在 Vue 中插入本地视频可以通过使用标签来实现。你可以将视频文件放在你的项目中的合适位置&#xff08;比如assets文件夹&#xff09;&#xff0c;然后在 Vue 组件中引用这个视频文件。html同理 首先&#xff0c;在你的 Vue 项目中的assets文件夹下放入你的视频文件&#xff…

兼容性比较好的浏览器推荐(2023手机浏览器排名)

浏览器在我们日常工作生活占据着重要的位置。浏览器是电脑的必备软件&#xff0c;也是手机端不可缺少的软件之一。如果你想要下载浏览器&#xff0c;却不知道哪个浏览器最好用&#xff0c;那么就看看本篇文章。下文给大家推荐2023年最热门、好用的手机浏览器&#xff0c;排行不…

计算机网络【网络安全】

计算机网络——网络安全 一、网络安全问题概述 网络安全威胁 网络安全面临两大类威胁&#xff0c;被动攻击和主动攻击 被动攻击 指攻击者从网络上窃听他人的通信内容&#xff0c;通常把这类攻击称为截获。 主动攻击 篡改 攻击者故意篡改网络上传送的报文 恶意程序 拒绝服…

java实现图片转pdf,并通过流的方式进行下载(前后端分离)

首先需要导入相关依赖&#xff0c;由于具体依赖本人也不是记得很清楚了&#xff0c;所以简短的说一下。 iText&#xff1a;PDF 操作库&#xff0c;用于创建和操作 PDF 文件。可通过 Maven 或 Gradle 引入 iText 依赖。 MultipartFile&#xff1a;Spring 框架中处理文件上传的类…

day08_分类品牌管理商品规格管理商品管理

文章目录 1 分类品牌管理1.1 菜单添加1.2 表结构介绍1.3 页面制作1.4 品牌列表加载1.4.1 后端接口BrandControllerBrandServiceBrandMapperBrandMapper.xml 1.4.2 前端对接brand.jscategoryBrand.vue 1.5 分类数据加载1.6 列表查询1.6.1 需求说明1.6.2 后端接口需求分析Categor…

软考基础知识2

1.DMA控制方式&#xff1a;直接内存存取。数据在内存与I/O设备间直接成块传送&#xff0c;不需要CPU的任何干涉&#xff0c;由DMA硬件直接执行完成。 例题&#xff1a; 2.程序计数器总是存下一个指令的地址。 例题&#xff1a; 3.可靠度的计算&#xff1a; 例题&#xff1a…

低碳策略全都有!EI论文:计及电转气协同的含碳捕集与垃圾焚烧虚拟电厂优化调度程序代码!

适用平台&#xff1a;MatlabYalmipCplex 参考文献&#xff1a;《计及电转气协同的含碳捕集与垃圾焚烧虚拟电厂优化调度》-电网技术 程序建立了碳交易市场下的计及电转气协同的含碳捕集与垃圾焚烧虚拟电厂优化调度模型&#xff0c;鉴于该模型具有高维非线性特点&#xff0c;求…

蓝桥杯算法题汇总

一.线性表&#xff1a;链式 例题&#xff1a;旋转链表 二.栈&#xff1a; 例题&#xff1a;行星碰撞问题 三.队列 三.数组和矩阵 例题&#xff1a;

亿道信息轻工业三防EM-T195,零售、制造、仓储一网打尽

厚度仅10.5mm&#xff0c;重量仅0.65千克的EM-T195&#xff0c;其紧凑而纤薄的设计为以往加固型平板带来了全新的轻薄概念。尽管设计时尚、轻薄&#xff0c;但经过军用认证的强固性仍然能够承受所有具有挑战性的环境条件。随身携带无负担的轻便性加上抗震功能使其成为餐厅、酒店…

Spring Initializer环境问题

1.基于jdk8与本地 环境准备 1)下载jdk8并安装 2&#xff09;下载maven 3.6.3并解压放入D盘maven目录下&#xff0c;去掉外层 设置阿里源 打开settings.xml,在mirrors标签之内增加&#xff0c;注意粘贴后</id>中的/有可能被删掉&#xff0c;要自己补上 <mirror>&l…

敏捷开发模型:一种灵活、协作和持续的软件开发方法

敏捷开发模型&#xff1a;一种灵活、协作和持续的软件开发方法 引言 在软件开发领域&#xff0c;随着市场需求的不断变化和技术的迅速发展&#xff0c;传统的瀑布模型逐渐暴露出其局限性。为了应对这些挑战&#xff0c;敏捷开发模型应运而生。敏捷开发模型强调灵活、协作和持…

Java基于springboot的厨艺交流平台的设计与实现代码

摘 要 使用旧方法对厨艺交流信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在厨艺交流信息的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误不能及时纠正等问题。 这次开发的厨艺交流平台功…

华为HCIP Datacom H12-821 卷4

1.单选题 下面哪些策略或工具不能够应用于 OSPF: A、access-list B、prefix-list C、route- Policy D、as-path filter 正确答案&#xff1a; D 解析&#xff1a; as-path-filter命令用来创建AS路径过滤器&#xff0c;OSPF属于IGP协议&#xff0c;不涉及到AS号。 2.单选题…