SpringCloud快速入门

2023-10-29

1.初识 SpringCloud

1.1.微服务

微服务的特点:

  • 单一职责:微服务中每一个服务都对应唯一的业务能力,做到单一职责
  • 微:微服务的服务拆分粒度很小,例如一个用户管理就可以作为一个服务。每个服务虽小,但“五脏俱全”。
  • 面向服务:面向服务是说每个服务都要对外暴露Rest风格服务接口API。并不关心服务的技术实现,做到与平台和语言无关,也不限定用什么技术实现,只要提供 Rest 的接口即可。
  • 自治:自治是说服务间互相独立,互不干扰
    • 团队独立:每个服务都是一个独立的开发团队,人数不能过多。
    • 技术独立:因为是面向服务,提供Rest接口,使用什么技术没有别人干涉
    • 前后端分离:采用前后端分离开发,提供统一Rest接口,后端不用再为PC、移动段开发不同接口
    • 数据库分离:每个服务都使用自己的数据源
    • 部署独立,服务间虽然有调用,但要做到服务重启不影响其它服务。有利于持续集成和持续交付。每个服务都是独立的组件,可复用,可替换,降低耦合,易维护

1.2.简介

Spring 最擅长的就是集成,把世界上最好的框架拿过来,集成到自己的项目中。官网

SpringCloud 也是一样,它将现在非常流行的一些技术整合到一起,实现了诸如:配置管理,服务发现,智能路由,负载均衡,熔断器,控制总线,集群状态等等功能。其主要涉及的组件包括:

  • Eureka:服务治理组件,包含服务注册中心,服务注册与发现机制的实现。(服务治理,服务注册/发现)
  • Zuul:网关组件,提供智能路由,访问过滤功能
  • Ribbon:客户端负载均衡的服务调用组件(客户端负载)
  • Feign:服务调用,给予Ribbon和Hystrix的声明式服务调用组件 (声明式服务调用)
  • Hystrix:容错管理组件,实现断路器模式,帮助服务依赖中出现的延迟和为故障提供强大的容错能力。(熔断、断路器,容错)

附图一张,看不懂没关系,回头再回顾

出处:写的不错

GYgqeJ.jpg

2.Eureka 注册中心

总的来说,Eureka 就是一个服务发现框架。写的不错

我们就可以来看关于 Eureka 的一些基础概念了,你会发现这东西理解起来怎么这么简单。

服务发现:其实就是一个“中介”,整个过程中有三个角色:服务提供者(出租房子的)、服务消费者(租客)、服务中介(房屋中介)

服务提供者: 就是提供一些自己能够执行的一些服务给外界。

服务消费者: 就是需要使用一些服务的“用户”。

服务中介: 其实就是服务提供者和服务消费者之间的“桥梁”,服务提供者可以把自己注册到服务中介那里,而服务消费者如需要消费一些服务(使用一些功能)就可以在服务中介中寻找注册在服务中介的服务提供者。

服务注册 Register

官方解释:当 Eureka 客户端向 Eureka Server 注册时,它提供自身的元数据,比如IP地址、端口,运行状况指示符URL,主页等。

结合中介理解:房东 (提供者 Eureka Client Provider)在中介 (服务器 Eureka Server) 那里登记房屋的信息,比如面积,价格,地段等等(元数据 metaData)。

服务续约 Renew

官方解释:Eureka 客户会每隔30秒(默认情况下)发送一次心跳来续约。 通过续约来告知 Eureka ServerEureka 客户仍然存在,没有出现问题。 正常情况下,如果 Eureka Server 在90秒没有收到 Eureka 客户的续约,它会将实例从其注册表中删除。

结合中介理解:房东 (提供者 Eureka Client Provider) 定期告诉中介 (服务器 Eureka Server) 我的房子还租(续约) ,中介 (服务器Eureka Server) 收到之后继续保留房屋的信息。

获取注册列表信息 Fetch Registries

官方解释:Eureka 客户端从服务器获取注册表信息,并将其缓存在本地。客户端会使用该信息查找其他服务,从而进行远程调用。该注册列表信息定期(每30秒钟)更新一次。每次返回注册列表信息可能与 Eureka 客户端的缓存信息不同, Eureka 客户端自动处理。如果由于某种原因导致注册列表信息不能及时匹配,Eureka 客户端则会重新获取整个注册表信息。 Eureka 服务器缓存注册列表信息,整个注册表以及每个应用程序的信息进行了压缩,压缩内容和没有压缩的内容完全相同。Eureka 客户端和 Eureka 服务器可以使用JSON / XML格式进行通讯。在默认的情况下 Eureka 客户端使用压缩 JSON 格式来获取注册列表的信息。

结合中介理解:租客(消费者 Eureka Client Consumer) 去中介 (服务器 Eureka Server) 那里获取所有的房屋信息列表 (客户端列表 Eureka Client List) ,而且租客为了获取最新的信息会定期向中介 (服务器 Eureka Server) 那里获取并更新本地列表。

服务下线 Cancel

官方解释:Eureka客户端在程序关闭时向Eureka服务器发送取消请求。 发送请求后,该客户端实例信息将从服务器的实例注册表中删除。该下线请求不会自动完成,它需要调用以下内容:DiscoveryManager.getInstance().shutdownComponent();

结合中介理解:房东 (提供者 Eureka Client Provider) 告诉中介 (服务器 Eureka Server) 我的房子不租了,中介之后就将注册的房屋信息从列表中剔除。

服务剔除 Eviction

官方解释:在默认的情况下,当Eureka客户端连续90秒(3个续约周期)没有向Eureka服务器发送服务续约,即心跳,Eureka服务器会将该服务实例从服务注册列表删除,即服务剔除。

结合中介理解:房东(提供者 Eureka Client Provider) 会定期联系 中介 (服务器 Eureka Server) 告诉他我的房子还租(续约),如果中介 (服务器 Eureka Server) 长时间没收到提供者的信息,那么中介会将他的房屋信息给下架(服务剔除)。

2.1.简易模拟一个微服务

GJJArF.png

模拟一个服务调用的场景,搭建两个工程:leyou-service-provider(服务提供方)和 leyou-service-consumer(服务调用方)。方便后面学习微服务架构

  • 服务提供方:使用 mybatis 操作数据库,实现对数据的增删改查;并对外提供rest接口服务。

  • 服务消费方:使用 restTemplate 远程调用服务提供方的 rest 接口服务,获取数据。

什么是 RestTemplate?

RestTemplateSpring提供的一个访问Http服务的客户端类,怎么说呢?就是微服务之间的调用是使用的 RestTemplate

2.1.1.搭建EurekaServer:

  1. 导入依赖:
  <!-- Eureka客户端 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
    </dependencies>
    
    <!-- SpringCloud的依赖 -->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Finchley.SR2</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
  1. 修改配置:
server:
  port: 10086 # 端口
spring:
  application:
    name: eureka-server # 应用名称,会在Eureka中显示
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:${
   server.port}/eureka
    register-with-eureka: false # 把自己注册到eureka服务列表
    fetch-registry: false # 拉取eureka服务信息
  server:
    enable-self-preservation: false # 关闭自我保护
    eviction-interval-timer-in-ms: 5000 # 每隔5秒钟,进行一次服务列表的清理
  1. 修改引导类,在类上添加@EnableEurekaServer注解:
@SpringBootApplication
@EnableEurekaServer // 声明当前springboot应用是一个eureka服务中心
public class LeyouEurekaApplication {
   

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

2.1.2.注册到Eureka

注册服务,就是在服务上添加Eureka的客户端依赖,客户端代码会自动把服务注册到EurekaServer中。

修改 leyou-service-provider工程

  1. 在pom.xml中,添加springcloud的相关依赖。(省略)
  2. 在application.yml中,添加springcloud的相关依赖。
server:
  port: 8081
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/leyou
    username: root
    password: root
    driverClassName: com.mysql.jdbc.Driver
  application:
    name: service-provider # 应用名称,注册到eureka后的服务名称
mybatis:
  type-aliases-package: cn.leyou.service.pojo
eureka:
  client:
    service-url: # EurekaServer地址
      defaultZone: http://127.0.0.1:10086/eureka
  1. 通过添加@EnableDiscoveryClient来开启Eureka客户端功能
@SpringBootApplication
@EnableDiscoveryClient
public class LeyouServiceProviderApplication {
   

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

2.1.3.从Eureka获取服务

接下来我们修改 leyou-service-consumer,尝试从EurekaServer获取服务。

  1. 在pom.xml中,添加springcloud的相关依赖。(省略)
  2. 在application.yml中,添加springcloud的相关依赖。
server:
  port: 80
spring:
  application:
    name: service-consumer
eureka:
  client:
    service-url:
      defaultZone: http://localhost:10086/eureka
  1. 在启动类开启Eureka客户端
@SpringBootApplication
@EnableDiscoveryClient // 开启Eureka客户端
public class ItcastServiceConsumerApplication {
   

    @Bean
    public RestTemplate restTemplate(){
   
        return new RestTemplate();
    }

    public static void main(String[] args) {
   
        SpringApplication.run(ItcastServiceConsumerApplication.class, args);
    }
}
  1. 修改UserController代码,用DiscoveryClient类的方法,根据服务名称,获取服务实例:
@Controller
@RequestMapping
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringCloud快速入门 的相关文章

  • JavaMail Gmail 问题。 “准备启动 TLS”然后失败

    mailServerProperties System getProperties mailServerProperties put mail smtp port 587 mailServerProperties put mail smtp
  • 如何将 Java 赋值表达式转换为 Kotlin

    java中的一些东西就像 int a 1 b 2 c 1 if a b c System out print true 现在它应该转换为 kotlin 就像 var a Int 1 var b Int 2 var c Int 1 if a
  • 线程自动利用多个CPU核心?

    假设我的应用程序运行 2 个线程 例如渲染线程和游戏更新线程 如果它在具有多核 CPU 当今典型 的移动设备上运行 我是否可以期望线程在可能的情况下自动分配给不同的核心 我知道底层操作系统内核 Android linux内核 决定调度 我的
  • 解决错误:日志已在具有多个实例的atomikos中使用

    我仅在使用atomikos的实时服务器上遇到问题 在我的本地服务器上它工作得很好 我在服务器上面临的问题是 init 中出错 日志已在使用中 完整的异常堆栈跟踪 java lang RuntimeException Log already
  • IntelliJ IDEA 创建的 JAR 文件无法运行

    我在 IntelliJ 中编写了一个跨越几个类的程序 当我在 IDE 中测试它时它运行良好 但是 每当我按照教程将项目制作成 jar 可执行文件时 它就不会运行 双击 out 文件夹中的文件时 该文件不会运行 并显示 无法启动 Java J
  • java.io.IOException: %1 不是有效的 Win32 应用程序

    我正在尝试对 XML 文档进行数字签名 为此我有两个选择 有一个由爱沙尼亚认证中心为程序员创建的库 还有一个由银行制作的运行 Java 代码的脚本 如果使用官方 认证中心 库 那么一切都会像魅力一样进行一些调整 但是当涉及到银行脚本时 它会
  • 在数据流模板中调用 waitUntilFinish() 后可以运行代码吗?

    我有一个批处理 Apache Beam 作业 它从 GCS 获取文件作为输入 我的目标是根据执行后管道的状态将文件移动到两个 GCS 存储桶之一 如果管道执行成功 则将文件移动到存储桶 A 否则 如果管道在执行过程中出现任何未处理的异常 则
  • 在具有相同属性名称的不同数据类型上使用 ModelMapper

    我有两节课说Animal AnimalDto我想用ModelMapper将 Entity 转换为 DTO 反之亦然 但是对于具有相似名称的一些属性 这些类应该具有不同的数据类型 我该如何实现这一目标 动物 java public class
  • Spring Data 与 Spring Data JPA 与 JdbcTemplate

    我有信心Spring Data and Spring Data JPA指的是相同的 但后来我在 youtube 上观看了一个关于他正在使用JdbcTemplate在那篇教程中 所以我在那里感到困惑 我想澄清一下两者之间有什么区别Spring
  • 检查 protobuf 消息 - 如何按名称获取字段值?

    我似乎无法找到一种方法来验证 protobuf 消息中字段的值 而无需显式调用其 getter 我看到周围的例子使用Descriptors FieldDescriptor实例到达消息映射内部 但它们要么基于迭代器 要么由字段号驱动 一旦我有
  • Java直接内存:在自定义类中使用sun.misc.Cleaner

    在 Java 中 NIO 直接缓冲区分配的内存通过以下方式释放 sun misc Cleaner实例 一些比对象终结更有效的特殊幻像引用 这种清洁器机制是否仅针对直接缓冲区子类硬编码在 JVM 中 或者是否也可以在自定义组件中使用清洁器 例
  • 将多模块 Maven 项目导入 Eclipse 时出现问题 (STS 2.5.2)

    我刚刚花了最后一个小时查看 Stackoverflow com 上的线程 尝试将 Maven 项目导入到 Spring ToolSuite 2 5 2 中 Maven 项目有多个模块 当我使用 STS 中的 Import 向导导入项目时 所
  • Tomcat 6找不到mysql驱动

    这里有一个类似的问题 但关于类路径 ClassNotFoundException com mysql jdbc Driver https stackoverflow com questions 1585811 classnotfoundex
  • Java - 不要用 bufferedwriter 覆盖

    我有一个程序可以将人员添加到数组列表中 我想做的是将这些人也添加到文本文件中 但程序会覆盖第一行 因此这些人会被删除 如何告诉编译器在下一个空闲行写入 import java io import java util import javax
  • 如何测试 spring-security-oauth2 资源服务器安全性?

    随着 Spring Security 4 的发布改进了对测试的支持 http docs spring io spring security site docs 4 0 x reference htmlsingle test我想更新我当前的
  • 将 JTextArea 内容写入文件

    我在 Java Swing 中有一个 JTextArea 和一个 提交 按钮 需要将textarea的内容写入一个带有换行符的文件中 我得到的输出是这样的 它被写为文件中的一个字符串 try BufferedWriter fileOut n
  • 将2-3-4树转换为红黑树

    我正在尝试将 2 3 4 树转换为 java 中的红黑树 但我无法弄清楚它 我将这两个基本类编写如下 以使问题简单明了 但不知道从这里到哪里去 public class TwoThreeFour
  • java迭代器内部是如何工作的? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一个员工列表 List
  • com.jcraft.jsch.JSchException:身份验证失败

    当我从本地磁盘上传文件到远程服务器时 出现这样的异常 com jcraft jsch JSchException Auth fail at org apache tools ant taskdefs optional ssh Scp exe
  • Jackson 将单个项目反序列化到列表中

    我正在尝试使用一项服务 该服务为我提供了一个带有数组字段的实体 id 23233 items name item 1 name item 2 但是 当数组包含单个项目时 将返回该项目本身 而不是包含一个元素的数组 id 43567 item

随机推荐

  • flutter get 命令行工具

    mac终端执行 flutter pub global activate get cli 这个安装完以后会提示英文提示你要把一个 目录添加到mac环境变量中 下面的目录是你安装完以后提示你放到环境变量里的目录 export PATH PATH
  • [MacOs]用外置硬盘制作MacOs系统盘

    文章目录 背景 设备 步骤 下载指定系统 制作启动盘 安装系统 背景 最近我的mac air出了点问题 经检查应该是硬盘问题 由于最近得待在老家没办法维修又需要用 只能用外置的硬盘做个系统盘来将就一下使用 设备 需要两个存储设备 不小于32
  • 马上:头疼:安卓黑屏,白屏,网卡,sdcard挂载等问题深入分析解决

    白屏 设备一段时间使用后 白屏 需要重启 经线上日志和以下相关代码初步分析是AMS 窗口显示问题 检查相关业务代码 发现Activity有可能被finish多次 导致失败 还有多次startActivity if isFinishing r
  • MySQL数据库误删回滚

    某次一不小心 用了delete from xxx 删除了几条重要数据 在网上找了很多方法 但都比较零散 打算记录本次数据找回的过程 大致分为以下几步 1 查看binlog是否开启 log bin是ON 就说明打开了 OFF就是关闭状态 以下
  • linux查看nginx安装路径

    linux查看nginx安装路径 有几种方法可以查看nginx的安装路径 使用which命令 which nginx 这个命令会返回nginx的二进制文件路径 一般也是安装路径 查看nginx的进程 得到安装路径 ps aux grep n
  • python爬虫高级教程,JS逆向之百度翻译

    环境 python版本号 系统 游览器 python 3 7 2 win7 google chrome 关于本文 本文将会通过爬虫的方式实现简单的百度翻译 本文中的代码只供学习 不允许作为于商务作用 商务作用请前往api fanyi bai
  • 浅谈控制反转(IoC)

    Inversion of Control 什么是控制反转 程序的流程控制权相对于传统的面向过程编程而言发生了反转 下面是维基百科的描述 In software engineering inversion of control IoC is
  • jest测试ajax,搭建Jest前端测试框架总结

    先说一下我要使用Jest的原因 由于开发提测了一个js的公共组件 需要测试人员对此组件的功能进行测试 因为提测的直接就是js文件 所以我们也就只能对其中的方法进行类白盒测试 知道了为什么测 那接下来就是怎么测 很容易的想到了需要一个测试框架
  • 60-200-040-使用-命令-MySQL查看引擎的命令

    文章目录 1 查看存储引擎 2 MySAM 和 InnoDB对比 1 查看存储引擎 mysql gt show ENGINES Engine Support
  • 调制与解调(1)——初认识

    在深入项目前 还需要对调制解调做深入学习 1 基本概念 调制 调制就是使一个信号 如光 高频电磁振荡等 的某些参数 如振幅 频率等 按照另一个欲传输的信号 如声音 图像等 的特点变化的过程 调制是通过改变高频载波的幅度 相位或者频率 使其随
  • 基于VS2019配置opencv4.0

    文章目录 1 前言 2 不说废话 直接上图干净利落 2 1 创建新空白项目 2 2 添加一个主文件 2 3 配置opencv环境 2 4 链接器配置 2 5 将opencv添加到计算机环境中 2 6 文件复制 3 运行测试环境 1 前言 不
  • 安信可SX1278LORA通讯试验

    LoRa 的名字是远距离无线电 Long Range Radio 作为一种线性调频扩频的调制技术 最早由法 国几位年轻人创立的一家创业公司 Cycleo 推出 2012 年 Semtech 收购了这家公司 并将这一调制技术 封装到芯片中 基
  • 3D游戏第八次作业

    3D游戏第八次作业 一 简单粒子制作 按参考资源要求 制作一个粒子系统 参考资源 使用 3 3 节介绍 用代码控制使之在不同场景下效果不一样 1 模拟烟花发射 效果展示 实现 给空对象挂载一个名为moveup的粒子系统模拟烟花发射 Emis
  • java中对象属性可以是另外一个对象或对象的参考

    7 对象的属性可以是另外一个对象或对象的参考 通过这种方法可以迅速构建一个比较大的系统 class Motor Light lights Handle left right KickStart ks Motor lights new Lig
  • 改变MySQL的默认编码

    etc mysql my cnf mysqld character set server utf8 collation server utf8 unicode ci init connect SET collation connection
  • 论文阅读-Exploring Frequency Adversarial Attacks for Face Forgery Detection(探索用于人脸伪造检测的频率对抗性攻击)

    一 论文信息 论文名称 Exploring Frequency Adversarial Attacks for Face Forgery Detection 会议 CVPR 2022 作者团队 二 动机 虽然现有的人脸伪造分类器在检测伪造图
  • Java实现异步的几种方式

    Java实现异步的几种方式 异步编程在对响应时间近乎严苛的今天 受到了越来越多的关注 尤其是在IO密集型业务中 对比传统的同步模式 异步编程可以提高服务器的响应时间和处理业务的能力 从而达到快速给用户响应的效果 代码前置 方法中会直接使用到
  • spring boot引入logback.xml

    logback xml
  • 使用@Value("${xxxx}")注解从配置文件读取值

    使用 Value xxxx 注解从配置文件读取值 记录一下自己学习配置文件读取的方法 假设配置文件为 config properties 1 从配置文件中读取值的用法 Value user username private String u
  • SpringCloud快速入门

    文章目录 1 初识 SpringCloud 1 1 微服务 1 2 简介 2 Eureka 注册中心 2 1 简易模拟一个微服务 2 1 1 搭建EurekaServer 2 1 2 注册到Eureka 2 1 3 从Eureka获取服务