【SpringCloud】之入门级及nacos的集成使用

  🎉🎉欢迎来到我的CSDN主页!🎉🎉

🏅我是君易--鑨,一个在CSDN分享笔记的博主。📚📚

🌟推荐给大家我的博客专栏《SpringCloud开发之入门级及nacos》。🎯🎯

🎁如果感觉还不错的话请给我关注加三连吧!🎁🎁


一、SpringCloud简介

1. 基本概述

        Spring Cloud 是一个用于构建分布式系统的开源框架,它基于 Java 编程语言,并以 Spring 框架基础。Spring Cloud 提供了一组工具和库,用于快速开发分布式系统中的各种模块,例如服务发现、配置管理、负载均衡、断路器、数据流等。

2. 其组件和功能

        以下是 Spring Cloud 的一些主要组件和功能:

Spring Cloud 的一些主要组件和功能
组件和功能说明
服务发现(Service Discovery)Spring Cloud 提供了服务发现机制,使得微服务能够动态注册和发现其他服务。这有助于构建弹性和可伸缩的系统。

配置管理(Configuration Management)

Spring Cloud Config 允许将配置集中管理,使得微服务应用能够更灵活地配置和更新。
负载均衡(Load Balancing)Spring Cloud 支持多种负载均衡策略,帮助分散请求负载,提高系统的可用性和性能。
断路器模式(Circuit Breaker)Spring Cloud Netflix Hystrix 提供了断路器模式的实现,用于防止分布式系统中的故障在一定程度上影响整个系统。
API 网关(API Gateway)Spring Cloud Gateway 和 Zuul 是两个常用的 API 网关,用于管理微服务的路由和过滤。
分布式追踪(Distributed Tracing)Spring Cloud Sleuth 和 Zipkin 提供了分布式系统中请求的跟踪和监控功能,有助于快速定位和解决问题。
分布式数据流(Data Flow)Spring Cloud Data Flow 是一个用于构建和部署大规模数据处理系统的框架。
消息驱动(Messaging)Spring Cloud Stream 和 Spring Cloud Bus 提供了消息驱动的能力,支持事件驱动架构。

         总体而言,Spring Cloud 为构建微服务架构提供了一整套解决方案,使得开发者能够更容易地实现微服务架构中的各种功能和模块,同时提供了一些对分布式系统中常见问题的解决方案。它建立在 Spring Boot 的基础之上,充分利用了 Spring 生态系统的优势。

组成图解

二、核心组件业务讲解

1. Eureka 

        Eureka是微服务架构中的注册中心,专门负责服务的注册与发现。

        订单服务想要调用库存服务、仓储服务,或者是积分服务,怎么调用?
        订单服务压根儿就不知道人家库存服务在哪台机器上啊!他就算想要发起一个请求,都不知道发送给 谁,有心无力。

 图解说明

Eureka Client:负责将这个服务的信息注册到Eureka Server

Eureka Server :注册中心,里面有一个注册表,保存了各个服务所在的机器和端口号

2.  Feign

        现在订单服务确实知道库存服务、积分服务、仓库服务在哪里了,同时也监听着哪些端口号了。

        但是新问题又来了:如何从订单服务跟其他服务建立网络连接,接着发送请求过去。

图解说明

3.  Ribbon

集群服务:库存服务部署在了 5 台机器上
192.168.169:9000
192.168.170:9000
192.168.171:9000
192.168.172:9000
192.168.173:9000
        Ribbon就是专门解决这个问题的。它的作用是负载均衡,会帮你在每次请求时选择一台机器,均匀的把
        请求分发到各个机器上
        首先Ribbon 会从 Eureka Client 里获取到对应的服务注册表,也就知道了所有的服务都部署在了哪些机器上,在监听哪些端口号。
        然后Ribbon 就可以使用默认的 Round Robin 算法,从中选择一台机器
Feign 就会针对这台机器,构造并发起请求。

 图解演示说明

4. Hystrix

        在微服务架构里,一个系统会有很多的服务。
        以上面的业务场景为例:订单服务在一个业务流程里需要调用三个服务。
        现在假设订单服务自己最多只有100 个线程可以处理请求,然后呢,积分服务不幸的挂了,每次订单服 务调用积分服务的时候,都会卡住几秒钟,然后抛出— 个超时异常 出现问题: 微服务架构中的服务雪崩问题。 如果系统处于高并发的场景下,大量请求涌过来的时候,订单服务的100 个线程都会卡在请求积分 服务这块。导致订单服务没有一个线程可以处理请求,然后就会导致别人请求订单服务的时候,发现订单服务也挂了,不响应任何请求了
Hystrix 是隔离、熔断以及降级的一个框架。
        比如订单服务请求库存服务是一个线程池,请求仓储服务是一个线程池,请求积分服务是一个线程池。 每个线程池里的线程就仅仅用于请求那个服务。
        积分服务挂了
        会导致订单服务里的那个用来调用积分服务的线程都卡死不能工作!
但是由于订单服务调用库存服务、仓储服务的这两个线程池都是正常工作的,所以这两个服务不会受到 任何影响。 这个时候如果别人请求订单服务,订单服务还是可以正常调用库存服务扣减库存,调用仓储服务通知发货。
        只不过调用积分服务的时候,每次都会报错。但是如果积分服务都挂了,每次调用都要去卡住几秒钟!所以我们直接对积分服务熔断不就得了,比如在5 分钟内请求积分服务直接就返回了,不要去走网络请求卡住几秒钟,这个过程,就是所谓的熔断!
        那人家又说,兄弟,积分服务挂了你就熔断,好歹你干点儿什么啊!别啥都不干就直接返回啊?没问题,咱们就来个降级: 每次调用积分服务,你就在数据库里记录一条消息,说给某某用户增加了多少积分,因为积分服务挂 了,导致没增加成功!
        这样等积分服务恢复了,你可以根据这些记录手工加一下积分。这个过程,就是所谓的降级

图解演示说明

 5. Zuul

        这个组件是负责网络路由的。
        一 般微服务架构中都必然会设计一个网关在里面,像android、 ios pc 前端、微信小程序、 H5 等等。 不用去关心后端有几百个服务,就知道有一个网关,所有请求都往网关走,网关会根据请求中的一些特 征,将请求转发给后端的各个服务。有一个网关之后,还有很多好处,比如可以做统一的降级、限流、认证授权、安全,等等。
         组件总和:
        Eureka:各个服务启动时, Eureka Client 都会将服务注册到 Eureka Server ,并 Eureka Client 还 可以反过来从Eureka Server 拉取注册表,从而知道其他服务在哪里
        Ribbon:服务间发起请求的时候,基于 Ribbon 做负载均衡,从一个服务的多台机器中选择一台。
        Feign:基于 Feign 的动态代理机制,根据注解和选择的机器,拼接请求 URL 地址,发起请求。
        Hystrix:发起请求是通过 Hystrix 的线程池来走的,不同的服务走不同的线程池,实现了不同服务。调用的隔离,避免了服务雪崩的问题
        Zuul:如果前端、移动端要调用后端系统,统一从 Zuul 网关进入,由 Zuul 网关转发请求给对应的服务。
         流程:
1. 请求统一通过 API 网关( Zuul )来访问内部服务 .
2. 网关接收到请求后,从注册中心( Eureka )获取可用服务
3. Ribbon 进行均衡负载后,分发到后端具体实例
4. 微服务之间通过 Feign 进行通信处理业务
5. Hystrix 负责处理服务超时熔断

 图解演示说明

 三、springCloud关系

        Spring Cloud 包含很多子项目: Netflix Alibaba 两个标准使用最多

 1. Spring Cloud Netflix 第一代

        针对多种 Netflix 组件提供的开发工具包,其中包括 Eureka Ribbon Feign Hystrix Zuul、 Archaius 等。
  • Netflix Eureka:一个基于 Rest 服务的服务治理组件,包括服务注册中心、服务注册与服务发现机 制的实现,实现了云端负载均衡和中间层服务器的故障转移。
  • Netflix Ribbon:客户端负载均衡的服务调用组件。
  • Netflix Hystrix:容错管理工具,实现断路器模式,通过控制服务的节点,从而对延迟和故障提供 更强大的容错能力。
  • Netflix Feign:基于 Ribbon Hystrix 的声明式服务调用组件。
  • Netflix Zuul:微服务网关,提供动态路由,访问过滤等服务。
  • Netflix Archaius:配置管理 API,包含一系列配置管理 API,提供动态类型化属性、线程安全配置 操作、轮询框架、回调机制等功能。

2. Spring Cloud Alibaba 第二代 

        同 Spring Cloud 一样, Spring Cloud Alibaba 也是一套微服务解决方案。
        Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用微服务的 必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。
        依托 Spring Cloud Alibaba ,只需要添加一些注解和少量配置,就可以将 Spring Cloud 应用接入阿里微服务解决方案,通过阿里中间件来迅速搭建分布式应用系统。

「阿里开源组件」  

  1. Nacos:阿里巴巴开源产品,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平 台。
  2. Sentinel:面向分布式服务架构的轻量级流量控制产品,把流量作为切入点,从流量控制、熔断降 级、系统负载保护等多个维度保护服务的稳定性。
  3. RocketMQ:一款开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠的 消息发布与订阅服务。
  4. DubboApache Dubbo™ 是一款高性能 Java RPC 框架,用于实现服务通信。
  5. Seata:阿里巴巴开源产品,一个易于使用的高性能微服务分布式事务解决方案。

「阿里商业化组件」

  1. Alibaba Cloud ACM:一款在分布式架构环境中对应用配置进行集中管理和推送的应用配置中心产 品。
  2. Alibaba Cloud OSS:阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供 的海量、安全、低成本、高可靠的云存储服务。您可以在任何应用、任何时间、任何地点存储和访 问任意类型的数据。
  3. Alibaba Cloud SchedulerX:阿里中间件团队开发的一款分布式任务调度产品,提供秒级、精准、 高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。
  4. Alibaba Cloud SMS:覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速 搭建客户触达通道。

 二者区别

四、SpringCloud的集成使用

1. 创建一个主项目

        我们在开发工具中创建一个主项目用于定义一些pom依赖,防止一些子项目重复的引入。我们创建一个Maven项目作为主项目。(确保在又网络的情况下)

         然后我们对其的pom文件进行修改。

 

 

2. 导入我们所需的依赖

        我们这里导入我们所需要的一些依赖,这里注意版本很重要,可以借鉴下述网址进行获取相应的依赖,获取直接使用我所提供的版本进行操作使用。(因为版本不同可能会导致后续开发出现问题以及方法使用出现问题)

版本关系
SpringBoot
SpringCloud
Spring Cloud Dependencies
SpringCloud 中文学习指南
Spring Cloud Alibaba

2.1 定义我们所需要的版本

        在定义之前我们先把一些创建项目生成自带的给删除掉

         接下来定义我们的版本

<!--  定义版本-->
  <properties>
    <spring-boot.version>2.4.1</spring-boot.version>
    <spring-cloud.version>2020.0.0</spring-cloud.version>
    <spring-cloud-alibaba.version>2021.1</spring-cloud-alibaba.version>
  </properties>

 

        然后就是导入所需的pom依赖,但是我们的pom依赖不是导入在 dependencies的标签中;而是dependencyManagement的标签中,该标签使来定义依赖的,并不能使用,只用于提供版本。

<!--  下面是导入我们的依赖-->
  <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>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-dependencies</artifactId>
      <version>${spring-cloud.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>

         我们的主项目不写代码,因此删除那些生成自带的东西。只保留pom.xml文件

 

3. 创建子项目用于写代码

        我们在主项目下新建两个新的项目,项目是SpringBoot项目。注意创建时的依赖选择

 

         创建好的子项目的pom文件中将自带的版本以及依赖直接删除不要,还有跳过编译的也要去掉

        在子项目中继承主项目的依赖

 <parent>
        <groupId>com.yx</groupId>
        <artifactId>cloud</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

         我们可以对其子项目版本介绍的pom文件的进行删减,保留如下即可

 

4. 主项目定义依赖 

         在主项目中定义其依赖

 

        在我们主项目中引入了依赖之后,我们对应的子项目中就会有了,但是我们对应的子项目可以根据自己的业务需求导入自身所需要的依赖 

 5. 主项目中定义子项目

        不标记子项目无法使用主项目定义的依赖

 6. 模拟

        生成者生产鸡腿,消费者拿到鸡腿。需要在两个子项目中编写两个不同的控制类

 6.1 生产者

ProviderController.java
package com.yx.provider;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ProviderController {
@RequestMapping("/run")
public String run() {
return "🍗";
}
}

       yml文件的端口号不要与消费者一致

 

6.2 消费者

 ConsumerController.java
package com.yx.consumer;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
public class ConsumerController {

//restTemplate相当于HttpClient,用于发送请求
    @RequestMapping
public String run() {
//    实例化restTemplate
    RestTemplate restTemplate = new RestTemplate();
//    跳转到生产者去
    return restTemplate.getForObject("http://localhost:8080/run", String.class);
}
}

        对应的yml文件的端口不要一致

 

 测试

        将两个项目运行启动测试 

        两个项目的调用实现了。 

五、 nacos的集成使用

1. 下载访问

         我们使用 nacos先去到官网进行下载

网址:Nacos 快速开始

        下载完成之后,解压在bin目录下有启动文件

         双击启动

         在网页中访问指定地址

http://localhost:8848/nacos 

        登陆之后,会进入到nacos中 

2. 将子项目注册到nacos中

         在对应的子项目的yml文件做改动

2.1 生成者

2.2 消费者

        导入nacos的pom依赖到主项目中

 <dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  </dependency>

 

        还要在每个子项目的启动类上标注使用nacos

 

 

3. 启动项目进行查看

        我们启动运行项目,在nacos官网中进行查看

        我们可以将消费者的跳转路径进行更改 

 4. 导入ribbon的依赖

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

 

ribbon 状态 : 停止更新
替代方案 : Spring Cloud Loadbalancer

          因为我们的restTemplate不具备负载均衡,因此要导入一个配置类或者将方法写在启动类

消费者

         重启服务即可使用,测试


 🎉🎉本期的博客分享到此结束🎉🎉

📚📚各位老铁慢慢消化📚📚

🎯🎯下期博客博主会带来新货🎯🎯

🎁三连加关注,阅读不迷路 !🎁

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

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

相关文章

数据库内核那些事|细说PolarDB优化器查询变换:IN-List变换

导读 数据库的查询优化器是整个系统的"大脑"&#xff0c;一条SQL语句执行是否高效在不同的优化决策下可能会产生几个数量级的性能差异&#xff0c;因此优化器也是数据库系统中最为核心的组件和竞争力之一。阿里云瑶池旗下的云原生数据库PolarDB MySQL版作为领先的云…

36-javascript输出方式,弹框:普通,confirm弹框,prompt弹框,控制台输出:普通,warm,error

1.页面打印 <body><p>你真是一个小机灵鬼</p><script>// 页面打印document.write("打印内容");</script> </body> 2.覆盖文档 <body><p>你真是一个小机灵鬼</p><script>// 覆盖文档window.onload f…

模型容器与AlexNet构建

一、模型容器——Containers nn.Sequential 是 nn.module的容器&#xff0c;用于按顺序包装一组网络层 Sequential 容器 nn.Sequential 是 nn.module的容器&#xff0c;用于按顺序包装一组网络层 • 顺序性&#xff1a;各网络层之间严格按照顺序构建 • 自带forward()&#xf…

HACKTHEBOX通关笔记——Poison(退役)

调试网络连通性 拿到IP我们还是做一下nmap扫描&#xff0c;快速速率扫描结合-A详细扫描&#xff0c;事半功倍 nmap --rate-min 5000 -p- 10.129.58.204 -vnmap -A -p 22,80 10.129.58.204 -v 发现http是一个可以读取文件的页面 这台主机似乎没办法做目录扫描&#xff0c;一扫…

电脑找不到ffmpeg.dll的解决方法有哪些,分享5种可靠的方法

在计算机编程和多媒体处理领域&#xff0c;ffmpeg.dll是一个非常重要的动态链接库文件。它是由FFmpeg项目开发和维护的&#xff0c;FFmpeg是一个开源的音视频处理框架&#xff0c;提供了一套完整的音视频编解码、转码、流化、滤镜等功能。ffmpeg.dll是FFmpeg库的一部分&#xf…

SwiftUI之深入解析Alignment Guides的超实用实战教程

一、Alignment Guide 简介 Alignment guides 是一个强大的布局工具&#xff0c;但通常未被充分利用。在很多情况下&#xff0c;它们可以帮助我们避免更复杂的选项&#xff0c;比如锚点偏好。如下所示&#xff0c;对对齐的更改也可以自动&#xff08;并且容易地&#xff09;动画…

MySQL语法及IDEA使用MySQL大全

在项目中我们时常需要写SQL语句&#xff0c;或简单的使用注解直接开发&#xff0c;或使用XML进行动态SQL之类的相对困难的SQL&#xff0c;并在IDEA中操控我们的SQL&#xff0c;但网上大都图方便或者觉得太简单了&#xff0c;完全没一个涵盖两个方面的讲解。 单表&#xff1a; …

GO语言笔记3-指针

指针的概念 先看一段代码的输出 package main import "fmt" func main(){ var age int 18fmt.Println("age的内存地址值是:",&age)//age的内存地址值是: 0xc000012090// 定义一个指针变量// *int 是一个指针类型&#xff0c;可以理解为指向int类型的…

TEMU 新手小白必看!2024入驻流程/入驻类目/入驻资料等详细流程讲解

2023 TEMU 可谓是赚足眼球&#xff0c;流量持续上涨&#xff0c;2024年相信不少卖家们已经跃跃欲试&#xff0c;但大陆卖家如何入驻TEMU&#xff1f;哪些品类适合入驻&#xff1f;又有哪些入驻要求和资料&#xff1f;别急&#xff0c;今天东哥就一一给大家详细讲解&#xff0c;…

Python操作excel-读取、表格填充颜色区分

1.场景分析 遇到一个需要读取本地excel数据&#xff0c;处理后打入到数据库的场景&#xff0c;使用java比较重&#xff0c;python很好的解决了这类问题 2.重难点 本场景遇到的重难点在于&#xff1a; 需要根据表格内的背景颜色对数据进行筛选 读取非默认Sheet 总是出现Value…

UE5 使用动画模板创建多个动画蓝图

我们制作游戏的时候&#xff0c;角色会根据不同的武器表现出来不同的攻击动画&#xff0c;待机动画以及移动动画。如果我们在UE里面实现这个需求&#xff0c;是通过复制粘贴的方式修改&#xff0c;还是有更好的方式。 这里就需要介绍一下动画模板&#xff0c;我们可以将动画蓝图…

在黑马程序员大学的2023年终总结

起笔 时间真快&#xff0c;转眼又是年末。是时候给2023做个年终总结了&#xff0c;为这一年的学习、生活以及成长画上一个圆满的句号。 这一年相比去年经历了很多事情&#xff0c;接下来我会一一说起 全文大概4000字&#xff0c;可能会占用你15分钟左右的时间 经历 先来给大…

外包干了3个多月,技术退步明显

先说一下自己的情况&#xff0c;本科生&#xff0c;19年通过校招进入广州某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…

【STM32】WDG看门狗

1 WDG简介 WDG&#xff08;Watchdog&#xff09;看门狗 看门狗可以监控程序的运行状态&#xff0c;当程序因为设计漏洞、硬件故障、电磁干扰等原因&#xff0c;出现卡死或跑飞现象时&#xff0c;看门狗能及时复位程序&#xff0c;避免程序陷入长时间的罢工状态&#xff0c;保…

解决不同请求需要的同一实体类参数不同(分组校验validation)

问题概述 新增目录是自动生成id&#xff0c;不需要id参数&#xff1b;更新目录需要id&#xff0c;不能为空 pom.xml中已有spring-boot-starter-validation依赖 <!--validation(完成属性限制&#xff0c;参数校验)--><dependency><groupId>org.springframew…

设计模式的艺术P1基础—2.4-2.11 面向对象设计原则

设计模式的艺术P1基础—2.4-2.11 面向对象设计原则 2.4 面向对象设计原则概述 向对象设计的目标之一在于支持可维护性复用&#xff0c;一方面需要实现设计方案或者源代码的重用&#xff0c;另一方面要确保系统能够易于扩展和修改&#xff0c;具有较好的灵活性。 面向对象设计…

NSSCTF EasyP

开启环境&#xff1a; 这一题我们通过分析需要知道一些知识&#xff1a; 1.$_SERVER[‘PHP_SELF’] &#xff1a;正在执行脚本的文件名 例子&#xff1a;127.0.0.1/pikachu/index.php 显示&#xff1a;/pikachu/index.php 2.S​ERVER[′REQUESTU​RI′]&#xff1a;与 _SERV…

小巧且兼具高性能的小模型 TinyLlama 等

TinyLlama-1.1B 小模型在边缘设备上有着广泛的应用&#xff0c;如智能手机、物联网设备和嵌入式系统&#xff0c;这些边缘设备通常具有有限的计算能力和存储空间&#xff0c;它们无法有效地运行大型语言模型。因此&#xff0c;深入探究小型模型显得尤为重要。 来自新加坡科技…

【C语言】操作符

操作符分类 算术操作符移位操作符位操作符赋值操作符单目操作符关系操作符逻辑操作符条件操作符逗号操作符下标引用、函数调用和结构成员操作符 算术操作符 除了 % 操作符之外&#xff0c;其他的几个操作符可以作用于整数和浮点数。 对于 / 操作符如果两个操作数都为整数&am…

AMEYA360 | 热敏电阻的工作原理及作用 热敏电阻厂商有哪些

摘要&#xff1a;热敏电阻是一种传感器电阻&#xff0c;其电阻值随着温度的变化而改变。热敏电阻的工作原理是使用传感器来帮助调节温度高低&#xff0c;作用包括电压调节&#xff0c;音量控制&#xff0c;时间延迟和电路保护。热敏电阻具有测温、温度补偿、过热保护、液面测量…