首页 > 其他分享 >SpringCloud-全面详解(学习总结---从入门到深化)

SpringCloud-全面详解(学习总结---从入门到深化)

时间:2023-03-07 16:05:36浏览次数:123  
标签:服务 SpringCloud Eureka --- 详解 注册 Spring org cloud


微服务架构进化论

SpringCloud-全面详解(学习总结---从入门到深化)_微服务

 单体应用阶段 (夫妻摊位)

在互联网发展的初期,用户数量少,一般网站的流量也很少,但硬 件成本较高。因此,一般的企业会将所有的功能都集成在一起开发 一个单体应用,然后将该单体应用部署到一台服务器上即可满足业务需求。

SpringCloud-全面详解(学习总结---从入门到深化)_spring_02

 生活中的单体应用

小夫妻俩刚结婚,手里资金有限,就想着开一个路边烧烤摊。丈夫 负责烤串做菜、妻子负责服务收银及上菜。这是一个典型的路边烧 烤摊的经营模式。

SpringCloud-全面详解(学习总结---从入门到深化)_Java_03

 垂直应用阶段 (门面饭店)

随着小夫妻俩经营有方、待客有道,开始有人愿意为了吃他们做的 烧烤排队了。夫妻俩一想,我们这俩人也干不过来啊,怎么办?招 人吧、扩大规模吧。

SpringCloud-全面详解(学习总结---从入门到深化)_Java_04

SpringCloud-全面详解(学习总结---从入门到深化)_Java_05

 分布式系统阶段 (酒店)

为了解决上一阶段遇到的问题:单个请求的处理速度下降。也就是 饭店针对单个订单做菜响应速度下降了,但是由于饭店的菜确实好吃、菜品精良,客流量又持续的增高。该店又再次面临扩容的问题。

1、为了解决客流量持续增高,夫妻又招聘了4位厨师

2、为了解决单个订单处理速度下降的问题,将厨师分为两组,一组专门做烧烤,一组专门做饭菜。专 业的人做专业的事情,注意力越集中,办事越熟练、效率越高。

SpringCloud-全面详解(学习总结---从入门到深化)_Spring Cloud_06

 服务治理阶段 (大酒店)

新的问题又出现了,有的顾客既点烧烤又点饭菜。导致后端两组厨 师之间沟通不畅,怎么组合套餐推送给前台?厨师之间怎么调用、 怎么沟通啊?谁是头?谁是大脑?谁记得A厨师的烧烤和B厨师的饭 菜是一桌的?

SpringCloud-全面详解(学习总结---从入门到深化)_spring_07

 随着服务数量的不断增加,服务中的资源浪费和调度问题日益突 出。此时需要增加一个调度中心来治理服务。调度中心可基于访问 压力来实时管理集群的容量,从而提高集群的利用率。

SpringCloud-全面详解(学习总结---从入门到深化)_Java_08

SpringCloud-全面详解(学习总结---从入门到深化)_spring_09

 微服务阶段 (五星大酒店)

饭店的规模越来越大了、岗位分工也越来越细了。真的成了超级大 饭店了,怎么管?

SpringCloud-全面详解(学习总结---从入门到深化)_Cloud_10

 

SpringCloud-全面详解(学习总结---从入门到深化)_微服务_11

 

SpringCloud-全面详解(学习总结---从入门到深化)_Java_12


1.分布式系统架构存在问题通过___解决。服务治理

2. 下列描述微服务架构正确的是____。将一套系统拆分成不同子系统部署在不同服务器上

 微服务的拆分规范和原则

SpringCloud-全面详解(学习总结---从入门到深化)_微服务_13

 压力模型拆分

压力模型简单来说就是用户访问量,我们要识别出某些超高并发量 的业务,尽可能把这部分业务独立拆分出来。

压力模型拆解为三个维度: 

1、高频高并发场景

SpringCloud-全面详解(学习总结---从入门到深化)_Spring Cloud_14

 

SpringCloud-全面详解(学习总结---从入门到深化)_Spring Cloud_15

 低频突发流量场景

SpringCloud-全面详解(学习总结---从入门到深化)_微服务_16

 原因:

秒杀场景它并不是高频场景(偶尔发生),但是它会产生突发 流量。再跟大家举一个例子,那就是“商品发布”,对新零售业务 来说,当开设一个线下大型卖场以后,需要将所有库存商品一键上架,这里的商品总数是个非常庞大的数字(几十万+),瞬 间就可以打出很高的QPS

 低频流量场景

SpringCloud-全面详解(学习总结---从入门到深化)_微服务_17

SpringCloud-全面详解(学习总结---从入门到深化)_微服务_18

 业务模型拆分

业务模型拆分的维度有很多,我们在实际项目中应该综合各个不同 维度做考量。我这里主要从主链路、领域模型和用户群体三个维度。

 主链路拆分

在电商领域"主链路"是一个很重要的业务链条,它是指用户完成下 单场景所必须经过的场景。按照我们平时买买买的剁手经验,可以 识别出很多核心主链路,比如商品搜索->商品详情页->购物车模块- >订单结算->支付业务,这是就是一条最简单的主链路。如果这是一 场战斗的话,那么主链路就是这场战斗的正面战场,我们必须力保 主链路不失守。

 核心主链路拆分,有以下几个目的:

1、异常容错:为主链路建立层次化的降级策略(多级降级),以及合理的熔断策略。

2、调配资源:主链路通常来讲都是高频场景,自然需要更多的计算资源,最主要的体现就是集群里分 配的虚机数量多。

3、服务隔离:主链路是主打输出的C位,把主链路与其他打辅助的业务服务隔离开来,避免边缘服务的异常情况影响到主链路。

 领域模型拆分

领域驱动设计DDD(Domain-Driven Design 领域驱动设计)不是 一个新概念,但老外们有个毛病,做什么事情特别喜欢提炼方法 论,本来一个非常简单的概念,愣是被吹到神乎其神高深莫测。

 用户群体拆分

根据用户群体做拆分,我们首先要了解自己的系统业务里有哪些用 户,比如说电商领域,我们有2C的小卖家,也有2B的大客户,在集团内部有运营、采购、还有客服小二等等。对每个不同的用户群体来说,即便是相同的业务领域,也有该群体其独有的业务场景。 用户群体相当于一个二级域,我们建议先根据主链路和领域模型做 一级域的拆分,再结合具体的业务分析,看是否需要在用户领域方向上做更细粒度的拆分。

压力模型拆分

 为什么选择Spring Cloud

SpringCloud-全面详解(学习总结---从入门到深化)_spring_19

 Spring Cloud与Netflix

Netflix是一家做视频网站的公司,之所以要说一下这个公司是因为 Spring Cloud在发展之初,Netflix做了很大的贡献。包括服务注册 中心Eureka、服务调用Ribbon、Feign,服务容错限流Hystrix、服务网关Zuul等众多组件都是Netflix贡献给Spring Cloud社区的。

 什么是SpringCloud

Spring Cloud是一个基于Spring Boot实现的微服务架构开发工具。 它为微服务架构中涉及的配置管理、服务治理、断路器、智能路由、控制总线、分布式会话和集群状态管理等操作提供了一种简单的开发方式。

 

SpringCloud-全面详解(学习总结---从入门到深化)_Java_20

 核心事件追踪

SpringCloud-全面详解(学习总结---从入门到深化)_Cloud_21

 服务注册中心选型

SpringCloud-全面详解(学习总结---从入门到深化)_微服务_22

 注意: 如果你的应用已经使用到了Hadoop、Kubernetes、Docker, 在Spring Cloud实施过程中可以考虑使用其关系户组件,避免 搭建两套注册中心,节省资源。

 分布式配置管理

目前可选的分布式配置管理中心,有阿里的Nacos、携程的 Apollo、和Spring Cloud Config。

 服务网关

服务网关这块就不多说了,没有任何悬念,Spring Cloud Gateway 在各方面都碾压Zuul,Zuul2也基本上是胎死腹中。

 熔断限流

Hystrix

2018年12月,Spring官方宣布Netflix的相关项目进入维护模式。不 再开发新的功能,但是Hystrix整体上还是比较稳定的,对于老用户 不必更换,影响也不大。

 resilience4j

Hystrix停更之后,Netflix官方推荐使用resilience4j,它是一个轻 量、易用、可组装的高可用框架,支持熔断、高频控制、隔离、限 流、限时、重试等多种高可用机制。

 Sentinel(重点)

Sentinel是阿里中间件团队开源的,面向分布式服务架构的轻量级 高可用流量控制组件,主要以流量为切入点,从流量控制、熔断降 级、系统负载保护等多个维度来帮助用户保护服务的稳定性。

Spring Boot

 Spring Cloud版本选择

SpringCloud-全面详解(学习总结---从入门到深化)_spring_23

 SpringCloud版本号由来

SpringCloud的版本号是根据英国伦敦地铁站的名字进行命名的, 由地铁站名称字母A-Z依次类推表示发布迭代版本。

 

SpringCloud-全面详解(学习总结---从入门到深化)_spring_24

 SpringCloud和SpringBoot版本对应关系

SpringCloud-全面详解(学习总结---从入门到深化)_Cloud_25

 注意事项: 其实SpringBoot与SpringCloud需要版本对应,否则可能会造成 很多意料之外的错误,比如eureka注册了结果找不到服务类 啊,比如某些jar导入不进来啊,等等这些错误。

 版本说明

SpringCloud-全面详解(学习总结---从入门到深化)_微服务_26

 从 Spring Cloud 2020.0.0-M1 开始,Spring Cloud 废除了这种英 国伦敦地铁站的命名方式,而使用了全新的 "日历化" 版本命名方 式。

1.SpringCloud版本选择尽量使用最新______版。GA

2. SpringCloud版本中GA版代表____。正式发布的版本

如何学习微服务Spring Cloud 

SpringCloud-全面详解(学习总结---从入门到深化)_Spring Cloud_27

 简单来说,就是“三大功能,两大特性”。

SpringCloud-全面详解(学习总结---从入门到深化)_spring_28

 三大功能是指微服务核心组件的功能维度,由浅入深层次递进;而两大特性是构建在每个服务组件之上的高可用性和高可扩展性。别看微服务框架组件多,其实你完全可以按照这三大功能模块,给它们有简入难对号入座。

SpringCloud-全面详解(学习总结---从入门到深化)_spring_29

 从哪里入手

SpringCloud-全面详解(学习总结---从入门到深化)_Java_30

 从微服务组件的功能维度来讲,服务间通信是最基础的功能特性,这个功能模块是最适合作为初学者学习微服务技术的切入 点。

1.学习微服务从哪里入手___。服务间通信

服务注册发现_什么是服务治理 

SpringCloud-全面详解(学习总结---从入门到深化)_Java_31

 为什么需要服务治理

在没有进行服务治理前,服务之间的通信是通过服务间直接相互调用来实现的。

 

SpringCloud-全面详解(学习总结---从入门到深化)_spring_32

 过程: 武当派直接调用峨眉派和华山派,同样,华山派直接调用武当 派和峨眉派如果系统不复杂,这样调用没什么问题。但在复杂 的微服务系统中,采用这样的调用方法就会产生问题。

 微服务系统中服务众多,这样会导致服务间的相互调用非常不便, 因为要记住提供服务的IP地址、名称、端口号等。这时就需要中间 代理,通过中间代理来完成调用。

 服务治理的解决方案

SpringCloud-全面详解(学习总结---从入门到深化)_spring_33

SpringCloud-全面详解(学习总结---从入门到深化)_Spring Cloud_34

 服务治理技术选型

SpringCloud-全面详解(学习总结---从入门到深化)_spring_35

 

SpringCloud-全面详解(学习总结---从入门到深化)_spring_36

分布式服务调用问题

 服务注册发现_Eureka概述

SpringCloud-全面详解(学习总结---从入门到深化)_Cloud_37

 Spring Cloud Eureka 是Netflix 开发的注册发现组件,本身是一个 基于 REST 的服务。提供注册与发现,同时还提供了负载均衡、故障转移等能力。

 

SpringCloud-全面详解(学习总结---从入门到深化)_微服务_38

 注意:

1、Eureka Server:服务器端。它提供服务的注册和发现功能,即实现服务的治理。

2、Service Provider:服务提供者。它将自身服务注册到Eureka Server中,以便“服务消费者” 能够通过服务器端提供的服务清单(注册服务列表)来调用它。

3、Service Consumer:服务消费者。它从 Eureka 获取“已注册的服务列表”,从而消费服务。

 比Zookeeper好在哪里呢

SpringCloud-全面详解(学习总结---从入门到深化)_Java_39

 当向注册中心查询服务列表时,我们可以容忍注册中心返回的是几分钟以前的注册信息,但不能接受服务直接down掉不可用。也就是说,服务注册功能对可用性的要求要高于一致性。

SpringCloud-全面详解(学习总结---从入门到深化)_Spring Cloud_40

 

SpringCloud-全面详解(学习总结---从入门到深化)_Java_41

 结论

Eureka看明白了这一点,因此在设计时就优先保证可用性。

学习效果反馈

1.Eureka 是Netflix 开发的___组件。  注册发现组件

2. Zookeeper服务治理问题是____。  选举leader的时间太长

 服务注册发现_微服务聚合父工程构建

New Project

SpringCloud-全面详解(学习总结---从入门到深化)_spring_42

 聚合总工程名称

SpringCloud-全面详解(学习总结---从入门到深化)_Cloud_43

 字符编码

SpringCloud-全面详解(学习总结---从入门到深化)_spring_44

 注解生效激活

SpringCloud-全面详解(学习总结---从入门到深化)_Java_45

 Java编译版本选择

SpringCloud-全面详解(学习总结---从入门到深化)_Cloud_46

 File Type过滤

SpringCloud-全面详解(学习总结---从入门到深化)_Spring Cloud_47

 父工程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>com.itbaizhan</groupId>
<artifactId>cloud</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<!-- 统一管理jar包版本 -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<spring-cloud.version>2021.0.0</spring-cloud.version>
<spring-boot.version>2.6.3</spring-boot.version>
</properties>
<!-- 子模块继承之后,提供作用:锁定版本+子 modlue不用写groupId和version -->
<dependencyManagement>
<dependencies>
<!--spring boot 2.6.3-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--spring cloud 2021.0.0-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>

IDEA开启Dashboard

普通的Run面板

SpringCloud-全面详解(学习总结---从入门到深化)_微服务_48

 Run Dashboard面板

SpringCloud-全面详解(学习总结---从入门到深化)_Cloud_49

 修改配置文件

在.idea/workspace.xml 文件中找到

<component name="RunDashboard">
<option name="ruleStates">
<list>
<RuleState>
<option name="name" value="ConfigurationTypeDashboardGroupingRule" />
</RuleState>
<RuleState>
<option name="name" value="StatusDashboardGroupingRule" />
</RuleState>
</list>
</option>
</component>

添加配置

<component name="RunDashboard">
<option name="ruleStates">
<list>
<RuleState>
<option name="name" value="ConfigurationTypeDashboardGroupingRule" />
</RuleState>
<RuleState>
<option name="name" value="StatusDashboardGroupingRule" />
</RuleState>
</list>
</option>
<option name="configurationTypes">
<set>
<option value="SpringBootApplicationConfigurationType" />
</set>
</option>
</component>

服务注册发现_搭建单机Eureka注册中心

创建cloud-eureka-server7001模块

SpringCloud-全面详解(学习总结---从入门到深化)_微服务_50

 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">
<parent>
<artifactId>cloud</artifactId>
<groupId>com.itbaizhan</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cloud-eureka-server7001</artifactId>
<dependencies>
<!-- 服务注册发现Eureka-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

</project>

写yml文件

server:
port: 7001
eureka:
instance:
# eureka服务端的实例名字
hostname: localhost
client:
# 表示是否将自己注册到Eureka Server
register-with-eureka: false
# 表示是否从Eureka Server获取注册的服务信息
fetch-registry: false
# 设置与 Eureka server交互的地址查询服务和注册服务都需要依赖这个地址
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

主启动类

/**
* 主启动类
*/
@Slf4j
@SpringBootApplication
@EnableEurekaServer
public class EurekaMain7001 {
public static void main(String[] args) {
SpringApplication.run(EurekaMain7001.class,args);
log.info("*************** Eureka 服务启动成功 端口 7001 ***********");
}
}

测试

访问浏览器localhostL:7001

SpringCloud-全面详解(学习总结---从入门到深化)_Cloud_51

 服务注册发现_解读Eureka注册中心UI界面

SpringCloud-全面详解(学习总结---从入门到深化)_spring_52

 DS Replicas

SpringCloud-全面详解(学习总结---从入门到深化)_微服务_53

 

SpringCloud-全面详解(学习总结---从入门到深化)_微服务_54

 Instances currently registered with Eureka

注册到Eurka服务上的实例信息。

SpringCloud-全面详解(学习总结---从入门到深化)_Spring Cloud_55

 参数:

  1、Application:服务名称。配置的spring.application.name属性

  2、AMIs:n/a (1),字符串n/a+实例的数量,我不了解

  3、Availability Zones:实例的数量

  4、Status:实例的状态 + eureka.instance.instance‐id的值。


实例的状态分为UP、DOWN、STARTING、 OUT_OF_SERVICE、UNKNOWN.

1、UP: 服务正常运行,特殊情况当进入自我保护模式,所有的服务依然是UP状态,所以需要做好熔断重试等容错机制应对灾难性网络出错情况

2、OUT_OF_SERVICE : 不再提供服务,其他的Eureka Client将调用不到该服务,一般有人为的调用接口设置的,如:强制下线。

3、UNKNOWN: 未知状态

4、STARTING : 表示服务正在启动中

5、DOWN: 表示服务已经宕机,无法继续提供服务

General Info

SpringCloud-全面详解(学习总结---从入门到深化)_微服务_56

  

SpringCloud-全面详解(学习总结---从入门到深化)_Spring Cloud_57

 Instance Info

SpringCloud-全面详解(学习总结---从入门到深化)_Spring Cloud_58

 

SpringCloud-全面详解(学习总结---从入门到深化)_Spring Cloud_59

 服务注册发现_创建服务提供者

SpringCloud-全面详解(学习总结---从入门到深化)_Java_60

创建cloud-provider-payment8001模块 

SpringCloud-全面详解(学习总结---从入门到深化)_微服务_61

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">
<parent>
<artifactId>cloud</artifactId>
<groupId>com.itbaizhan</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cloud-provider-payment8001</artifactId>
<dependencies>
<!-- 引入Eureka client依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
</dependency>
</dependencies>
</project>

写yml文件

server:
port: 8001
eureka:
client:
service-url:
# Eureka server 地址
defaultZone: http://localhost:7001/eureka/

标签:服务,SpringCloud,Eureka,---,详解,注册,Spring,org,cloud
From: https://blog.51cto.com/u_15949848/6103201

相关文章

  • 多线程设计模式-全面详解(学习总结---从入门到深化)
    目录​​SingleThreadExecution设计模式​​​​机场过安检​​​​ 非线程安全​​​​ 问题分析​​​​首字母相同却未通过检查​​​​为何出现首字母不相同的情况......
  • HTMLReport使用2 | HTMLReport使用方法详解
    (2|HTMLReport的使用)注:以下实例来源于官网。1日志为测试报告中添加过程日志;多线程下,在报告中会分别记录每个线程的日志,同时会产生与测试报告同名的测试log文件。......
  • 测试开发-怎么能忘记打卡呢-神器AppleScript
    写在前面昨天的主题反响不错,今天继续给大家介绍一款我自认为比较好用的东西,MacOS下的AppleScript,AppleScript像是mac电脑给开发者留下的一个入口一样,他不同于其他语言......
  • pytest - 结合 allure 报告
    修改报告内fixture方法名展示@allure.title("我是fixture")defsetup_session(autouse=True,scope="session")print("setup")yieldprint("teardown")......
  • centos7部署element-plus
    element-plus官网实在是太不稳定了,所以自己搭建了一套在本地,流程如下:环境安装yuminstallnodeyuminstallnpmnodeinstall-gpnpm从gitee拉取代码wget-P/......
  • spring源码02-xml配置文件解析过程
    本文主要讲解spring通过xml进行配置时对xml的加载和解析过程、自定义标签的处理,重点是流程,不说明详细细节;一、创建ClassPathXmlApplicationContext对象//创建容器,并启动......
  • Httprunner4 - 使用环境变量
    python设置环境变量importos#设置环境变量os.environ["token"]=token#获取环境变量token=os.environ["token"]token=os.getenv("token")#移除环境变......
  • 【android】android-检测耳机的插入和拔出动作
    在android系统中,检测耳机的插入和拔出,也是通过广播实现的,可以建立一个BroadcastReceiver监听"android.intent.action.HEADSET_PLUG"这个Intent。在这个Intent中包含以......
  • Linux使用DataX3.0 ~笔记-持续更新中
     一、Liunx上安装DataX查看当前系统版本查看系统的名称,命令:uname查看具体的系统版本,命令:cat/etc/redhat-release查看是否具备jdk和python环境:查看jdk版本,命......
  • 创建型:工厂模式-工厂方法、抽象工厂
    问题简单工厂中我们通过参数来返回不同的产品对象,如果管理的对象过多,这个工厂函数会比较庞大,且当我们需要增加一个新的产品时,需要修改这个工厂方法,违反开闭原则(对拓展开......