# Road To Coding **Repository Path**: anton97/road ## Basic Information - **Project Name**: Road To Coding - **Description**: Spring Cloud (Alibaba)实践仓库,包括:Eureka、ZooKeeper、Consul、Ribbon、OpenFeign、Hystrix、GateWay、Config、Bus、Stream、Sleuth、Nacos、Sentinel、Seata以及其他。 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2022-04-24 - **Last Updated**: 2023-01-11 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Spring Cloud (Alibaba)实践概述 **CAP** C:Consistency (强一致性) A:Availability (可用性) P:Partition tolerance (分区容错性) -------------------------------------------------------------------------- **_Spring Cloud_** ## Eureka-服务注册与发现 Eureka Sever作为服务注册功能的服务器,它是服务注册中心。 而系统中的其他微服务,使用Eureka的客户端连接到 Eureka Server并维持心跳连接。 这样系统的维护人员就可以通过Eureka Server来监控系统中各个微服务是否正常运行。 Eureka包含两个组件:Eureka Server和Eureka Client **Eureka Server提供服务注册服务** 各个微服务节点通过配置启动后,会在EurekaServer中进行注册,这样EurekaServer中的服务 注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观看到。 **EurekaClient通过注册中心进行访问** 它是一个Java客户端,用于简化Eureka Server的交互,客户端同时也具备一个内置的、 使用轮询(round-robin)负载算法的负载均衡器。在应用启动后,将会向Eureka Server 发送心跳(默认周期为30秒)。如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳, EurekaServer将会从服务注册表中把这个服务节点移除(默认90秒) **实质:存key服务命取value闭用地址** 1.先启动eureka注册中心 2.启动服务提供者payment支付服务 3.支付服务启动后会把自身信息 4.消费者order服务在需要调用接口时,使用服务别名去注册中心获取实际的RPC远程调用地址 5.消费者调用地址后,实际是利用HttpClient技术实现远程调用 **Eureka集群环境构建** 搭建Eureka注册中心集群,实现负载均衡+故障容错(互相注册,相互守望) 使用@LoadBalanced注解赋予RestTemplate负载均衡的能力 Ribbon和Eureka整合后Consumer可以直接调用服务而不用再关心地址和端口号,且该服务还有负载功能。 ## ZooKeeper(Eureka停更) ZooKeeper的服务节点是临时节点 ## Consul Consul是一套开源的分布式服务发现和配置管理系统,由HashiCorp 公司用Go语言开发。 提供了微服务系统中的服务治理、配置中心、控制总线等功能。这些功能中的每一个都可以根据需要单独使用, 也可以一起使用以构建全方位的服务网格,总之Consul提供了一种完整的服务网格解决方案。 能干嘛? 服务发现 - 提供HTTP和DNS两种发现方式。 健康监测 - 支持多种方式,HTTP、TCP、Docker、Shell脚本定制化 KV存储 - Key、Value的存储方式 多数据中心 - Consul支持多数据中心 可视化Web界面 ## 三个注册中心异同点 | 组件名 | 语言 | CAP | | ---- | ---- | ---- | | Eureka | Java | AP | | Consul | Go | CP | | Zookeeper | Java | CP | CA - 单点集群,满足—致性,可用性的系统,通常在可扩展性上不太强大。 CP - 满足一致性,分区容忍必的系统,通常性能不是特别高。 AP - 满足可用性,分区容忍性的系统,通常可能对一致性要求低一些。 ## Ribbon 主要功能是提供客户端的软件负载均衡算法和服务调用。 Ribbon本地负载均衡,在调用微服务接口时候,会在注册中心上获取注册信息服务列表之后 缓存到JVM本地,从而在本地实现RPC远程服务调用技术。 Ribbon在工作时分成两步: 第一步先选择EurekaServer ,它优先选择在同一个区域内负载较少的server。 第二步再根据用户指定的策略,在从server取到的服务注册列表中选择一个地址。 Ribbon默认负载轮询算法原理 默认负载轮训算法: rest接口第几次请求数 % 服务器集群总数量 = 实际调用服务器位置下标,每次服务重启动后rest接口计数从1开始。 ## OpenFeign Feign旨在使编写Java Http客户端变得更容易。Feign集成了Ribbon 前面在使用Ribbon+RestTemplate时,利用RestTemplate对http请求的封装处理, 形成了一套模版化的调用方法。但是在实际开发中,由于对服务依赖的调用可能不止一处, 往往一个接口会被多处调用,所以通常都会针对每个微服务自行封装一些客户端类来包装这些依赖服务的调用。 所以,Feign在此基础上做了进一步封装,由他来帮助我们定义和实现依赖服务接口的定义。 在Feign的实现下,我们只需创建一个接口并使用注解的方式来配置它(以前是Dao接口上面标注Mapper注解, 现在是一个微服务接口上面标注一个Feign注解即可),即可完成对服务提供方的接口绑定, 简化了使用Spring cloud Ribbon时,自动封装服务调用客户端的开发量。 ## Hystrix Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败, 比如超时、异常等,Hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性。 服务降级? 服务器忙,请稍后再试,不让客户端等待并立刻返回一个友好提示,fallback 哪些情况会出发降级? 程序运行导常 超时 服务熔断触发服务降级 线程池/信号量打满也会导致服务降级 服务熔断 类比保险丝达到最大服务访问后,直接拒绝访问,拉闸限电,然后调用服务降级的方法并返回友好提示。 服务的降级 -> 进而熔断 -> 恢复调用链路 服务限流? 秒杀高并发等操作,严禁一窝蜂的过来拥挤,大家排队,一秒钟N个,有序进行。 **熔断机制** 熔断机制是应对雪崩效应的一种微服务链路保护机制。当扇出链路的某个微服务出错不可用或者响应时间太长时, 会进行服务的降级,进而熔断该节点微服务的调用,快速返回错误的响应信息。当检测到该节点微服务调用响应正常后, 恢复调用链路。 在Spring Cloud框架里,熔断机制通过Hystrix实现。Hystrix会监控微服务间调用的状况,当失败的调用到一定阈值, 缺省是5秒内20次调用失败,就会启动熔断机制。熔断机制的注解是@HystrixCommand。 **熔断类型** 熔断打开:请求不再进行调用当前服务,内部设置时钟一般为MTTR(平均故障处理时间),当打开时长达到所设时钟则进入半熔断状态。 熔断关闭:熔断关闭不会对服务进行熔断。 熔断半开:部分请求根据规则调用当前服务,如果请求成功且符合规则则认为当前服务恢复正常,关闭熔断。 ## GateWay Gateway旨在提供一种简单而有效的方式来对API进行路由,以及提供一些强大的过滤器功能,例如:熔断、限流、重试等。 为了提升网关的性能,SpringCloud Gateway是基于WebFlux框架实现的,而WebFlux框架底层则使用了高性能的Reactor模式通信框架Netty。 **SpringCloud Gateway特性** 基于Spring Framework 5,Project Reactor和Spring Boot 2.0进行构建; 动态路由:能够匹配任何请求属性; 可以对路由指定Predicate (断言)和Filter(过滤器); 集成Hystrix的断路器功能; 集成服务发现功能; 易于编写的Predicate (断言)和Filter (过滤器); 请求限流功能; 支持路径重写。 **三大核心概念** 1.Route(路由) - 路由是构建网关的基本模块,它由ID,目标URI,一系列的断言和过滤器组成,如断言为true则匹配该路由; 2.Predicate(断言) - 参考的是Java8的java.util.function.Predicate,开发人员可以匹配HTTP请求中的所有 内容(例如请求头或请求参数),如果请求与断言相匹配则进行路由; 3.Filter(过滤) - 指的是Spring框架中GatewayFilter的实例,使用过滤器,可以在请求被路由前或者之后对请求进行修改。 **工作流程** 客户端向Spring Cloud Gateway发出请求。然后在Gateway Handler Mapping 中找到与请求相匹配的路由, 将其发送到GatewayWeb Handler。 Handler再通过指定的过滤器链来将请求发送到我们实际的服务执行业务逻辑,然后返回。 过滤器之间用虚线分开是因为过滤器可能会在发送代理请求之前(“pre”)或之后(“post")执行业务逻辑。 Filter在“pre”类型的过滤器可以做参数校验、权限校验、流量监控、日志输出、协议转换等,在“post”类型的过滤器中可以做 响应内容、响应头的修改,日志的输出,流量监控等有着非常重要的作用。 核心逻辑:路由转发 + 执行过滤器链。 ## Config SpringCloud Config为微服务架构中的微服务提供集中化的外部配置支持,配置服务器为各个不同微服务应用的所有环境提供了一个中心化的外部配置。 SpringCloud Config分为服务端和客户端两部分。 服务端也称为分布式配置中心,它是一个独立的微服务应用,用来连接配置服务器并为客户端提供获取配置信息,加密/解密信息等访问接口。 客户端则是通过指定的配置中心来管理应用资源,以及与业务相关的配置内容,并在启动的时候从配置中心 获取和加载配置信息,配置服务器默认采用git来存储配置信息,这样就有助于对环境配置进行版本管理,并且 可以通过git客户端工具来方便的管理和访问配置内容。 ## Bus消息总线 Spring Cloud Bus配合Spring Cloud Config使用可以实现配置的动态刷新。 基本原理 ConfigClient实例都监听MQ中同一个topic(默认是Spring Cloud Bus)。当一个服务刷新数据的时候, 它会把这个信息放入到Topic中,这样其它监听同一Topic的服务就能得到通知,然后去更新自身的配置。 ## Stream Stream是一个构建消息驱动微服务的框架。 应用程序通过inputs 或者 outputs 来与Spring Cloud Stream中binder对象交互。 通过我们配置来binding(绑定),而Spring Cloud Stream 的binder对象负责与消息中间件交互。 通过定义绑定器Binder作为中间层,实现了应用程序与消息中间件细节之间的隔离。 ## Sleuth链路监控 -------------------------------------------------------------------------- **_Spring Cloud Alibaba_** ## Nacos **Nacos就是注册中心+配置中心的组合 -> Nacos = Eureka + Config + Bus** **Nacos支持AP和CP模式的切换** ## Nacos集群配置(Linux) ## Sentinel Hystrix与Sentinel比较: Hystrix: 需要我们程序员自己手工搭建监控平台 没有一套web界面可以给我们进行更加细粒度化得配置流控、速率控制、服务熔断、服务降级 Sentinel: 单独一个组件,可以独立出来。 直接界面化的细粒度统一配置。 ## Seata 致力于在微服务架构下提供高性能和简单易用的分布式事务服务。 **分布式事务处理过程的一ID+三组件模型:** Transaction ID XID 全局唯一的事务ID 三组件概念 TC (Transaction Coordinator) - 事务协调者:维护全局和分支事务的状态,驱动全局事务提交或回滚。 TM (Transaction Manager) - 事务管理器:定义全局事务的范围:开始全局事务、提交或回滚全局事务。 RM (Resource Manager) - 资源管理器:管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。 处理过程: 1.TM向TC申请开启一个全局事务,全局事务创建成功并生成一个全局唯一的XID; 2.XID在微服务调用链路的上下文中传播; 3.RM向TC注册分支事务,将其纳入XID对应全局事务的管辖; 4.TM向TC发起针对XID的全局提交或回滚决议; 5.TC调度XID下管辖的全部分支事务完成提交或回滚请求。 ----------------------------------------------------------------------- ## Spring -- Spring注解式开发 手写Spring、mybatis ## JavaEE 算法题、BIO、NIO、Reactor、LeetCode、Java核心技术II