SpringCloud【微服务架构进化论、微服务的拆分规范和原则、为什么选择Spring Cloud、什么是服务治理 】(一)-全面详解(学习总结---从入门到深化)

简介: SpringCloud【微服务架构进化论、微服务的拆分规范和原则、为什么选择Spring Cloud、什么是服务治理 】(一)-全面详解(学习总结---从入门到深化)



微服务架构进化论

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

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

生活中的单体应用

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

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

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

分布式系统阶段 (酒店)

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

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

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

服务治理阶段 (大酒店)

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


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

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

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

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

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

微服务的拆分规范和原则


压力模型拆分

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

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

1、高频高并发场景


低频突发流量场景


原因:

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

低频流量场景

业务模型拆分

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

主链路拆分

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

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

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

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

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

领域模型拆分

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

用户群体拆分

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

1.下列属于拆分模型的是___。压力模型拆分

为什么选择Spring Cloud


Spring Cloud与Netflix

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

什么是SpringCloud

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

核心事件追踪

服务注册中心选型

注意: 如果你的应用已经使用到了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是阿里中间件团队开源的,面向分布式服务架构的轻量级 高可用流量控制组件,主要以流量为切入点,从流量控制、熔断降 级、系统负载保护等多个维度来帮助用户保护服务的稳定性。

1.Spring Cloud是一个基于_____实现的微服务架构开发工具。Spring Boot

Spring Cloud版本选择

SpringCloud版本号由来

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

SpringCloud和SpringBoot版本对应关系

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

版本说明

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

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

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

如何学习微服务Spring Cloud

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

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

从哪里入手

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

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

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

为什么需要服务治理

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

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

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

服务治理的解决方案

服务治理技术选型

1.服务治理解决___问题。分布式服务调用问题

服务注册发现_Eureka概述

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

注意:

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

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

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

比Zookeeper好在哪里呢

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

结论

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

学习效果反馈

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

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

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

New Project

聚合总工程名称

字符编码

注解生效激活

Java编译版本选择

File Type过滤

父工程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.tong</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面板

Run Dashboard面板

修改配置文件

在.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模块

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.tong</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

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

DS Replicas

Instances currently registered with Eureka

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

参数:

 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

Instance Info

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

创建cloud-provider-payment8001模块

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.tong</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/
目录
相关文章
|
2月前
|
SQL 分布式计算 Hadoop
Azkaban【基础 01】核心概念+特点+Web界面+架构+Job类型(一篇即可入门Azkaban工作流调度系统)
【2月更文挑战第6天】Azkaban【基础 01】核心概念+特点+Web界面+架构+Job类型(一篇即可入门Azkaban工作流调度系统)
72 0
|
19小时前
|
消息中间件 存储 数据库
RabbitMQ入门指南(二):架构和管理控制台的使用
RabbitMQ是一个高效、可靠的开源消息队列系统,广泛用于软件开发、数据传输、微服务等领域。本文主要介绍了RabbitMQ架构和管理控制台的使用等内容。
RabbitMQ入门指南(二):架构和管理控制台的使用
|
1月前
|
运维 负载均衡 监控
探索微服务架构下的服务治理实践
【2月更文挑战第24天】 在当前软件开发领域,微服务架构已成为构建复杂系统的主流选择。它通过将大型单一应用程序分解为一组小的、松耦合的服务来提供灵活性和可维护性。然而,随之而来的是服务治理的挑战,包括服务发现、配置管理、负载均衡、熔断机制等。本文将深入探讨在微服务架构中实现有效服务治理的策略与技术实践,分享个人在这一过程中的感悟和经验教训。
|
1月前
|
消息中间件 存储 SQL
Flume【基础知识 01】简介 + 基本架构及核心概念 + 架构模式 + Agent内部原理 + 配置格式(一篇即可入门Flume)
【2月更文挑战第18天】Flume【基础知识 01】简介 + 基本架构及核心概念 + 架构模式 + Agent内部原理 + 配置格式(一篇即可入门Flume)
444 0
|
1月前
|
安全 Java API
Spring Boot 接口规范如何遵守?
【2月更文挑战第17天】
49 4
Spring Boot 接口规范如何遵守?
|
1月前
|
设计模式 运维 微服务
探索微服务架构下的服务治理与调优实践
【2月更文挑战第15天】 在当前软件开发领域,微服务架构已成为一种流行的设计模式,其通过拆分传统单体应用为一系列小型、自治的服务来提高系统的可维护性和扩展性。然而,随着服务数量的增加,如何有效管理和调优这些服务成为了开发和运维团队面临的挑战。本文将深入探讨在微服务架构下,如何实施服务治理以及调优策略,旨在为读者提供一套实用的技术方案和经验分享。
15 1
|
1月前
|
运维 监控 负载均衡
Go语言中微服务架构设计与原则
【2月更文挑战第14天】本文将深入探讨在Go语言环境下,微服务架构的设计原则和实践。我们将讨论如何根据微服务架构的核心概念,如服务拆分、独立部署、容错处理、服务治理等,来构建一个稳定、可扩展、可维护的Go语言微服务系统。
|
7天前
|
API 数据库 开发者
构建高效可靠的微服务架构:后端开发的新范式
【4月更文挑战第8天】 随着现代软件开发的复杂性日益增加,传统的单体应用架构面临着可扩展性、维护性和敏捷性的挑战。为了解决这些问题,微服务架构应运而生,并迅速成为后端开发领域的一股清流。本文将深入探讨微服务架构的设计原则、实施策略及其带来的优势与挑战,为后端开发者提供一种全新视角,以实现更加灵活、高效和稳定的系统构建。
14 0
|
22天前
|
负载均衡 测试技术 持续交付
高效后端开发实践:构建可扩展的微服务架构
在当今快速发展的互联网时代,后端开发扮演着至关重要的角色。本文将重点探讨如何构建可扩展的微服务架构,以及在后端开发中提高效率的一些实践方法。通过合理的架构设计和技术选型,我们可以更好地应对日益复杂的业务需求,实现高效可靠的后端系统。
|
22天前
|
监控 持续交付 API
构建高效可扩展的微服务架构
在当今快速迭代和竞争激烈的软件市场中,构建一个高效、可扩展且易于维护的后端系统变得尤为重要。微服务架构作为一种流行的分布式系统设计方式,允许开发者将应用程序划分为一系列小型、自治的服务,每个服务负责执行特定的业务功能。本文将探讨如何利用现代技术栈搭建一个符合这些要求的微服务架构,并讨论其潜在的挑战与解决方案。我们将涵盖服务划分策略、容器化、服务发现、API网关、持续集成/持续部署(CI/CD)以及监控和日志管理等关键主题,以帮助读者构建出既可靠又灵活的后端系统。