# spring-cloud-learning-plus **Repository Path**: gnehcnij/spring-cloud-learning-plus ## Basic Information - **Project Name**: spring-cloud-learning-plus - **Description**: springcloud学习进阶。 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-03-12 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # spring-cloud-learning-plus #### 介绍 springcloud学习进阶。 ![cloud升级](pic/cloud.png) ### 步骤 #### 1、创建父maven模块spring-cloud-learning-plus #### 2、创建maven模块payment8001 这个是服务提供者。 #### 2、创建maven模块order80 这个是服务消费者。在Controller中通过RestTemplate发起Restful风格请求,调用 payment8001 提供的服务。 #### 3、工程重构(创建模块commons-api) 把公用的utils、entities、exception等抽取掉api模块。 #### 4、引入服务注册中心eureka ##### 1. 什么是服务治理? ![什么是服务治理](pic/什么是服务治理.png) ##### 2. 什么是服务注册? ![什么是服务注册与发现](pic/什么是服务注册与发现1.png) ![什么是服务注册与发现](pic/什么是服务注册与发现2.png) ##### 3. Eureka两组件 ![Eureka两组件](pic/Eureka两组件.png) ##### 4. 新建Eureka Server 1. 创建maven模块eurekaServer7001 2. order80、payment8001注册进eureka server,改造这两个模块 ##### 4. Eureka Server集群 ###### 1. Eureka集群原理说明 ![Eureka集群原理说明](pic/Eureka集群原理说明.png) ##### 5. payment模块集群并使用@LoadBalanced赋予RestTemplate有负载均衡能力,默认是轮询 ##### 6. Actuator微服务信息完善 配置instanceId与显示ip地址 #### 5、服务发现Discovery 对于注册eureka里面的微服务,可以通过服务发现来获得该服务的信息。 以payment8001为例。 #### 6、eureka自我保护 ##### 1. 故障现象 ![故障现象](pic/故障现象.png) ##### 2. 导致原因 ![导致原因](pic/导致原因.png) 一句话:某时刻 一个微服务不可用了,Eureka不会立刻清理,依旧会对该服务的信息进行保存,属于CAP里面的AP分支。 ##### 3. 怎么禁止自我保护? ```properties # 出产默认,自我保护机制是开启的 eureka.server.enable-self-preservation=true ``` #### 7、引入zookeeper服务注册中心 1. 创建maven模块payment8003 2. 创建maven模块order81 #### 7、引入consul服务注册中心 ##### 1. 什么是consul? ![什么是consul](pic/什么是consul.png) ##### 2. 特性 ![features](pic/features.png) 1. 服务发现:提供HTTP/DNS两种发现方式 2. 健康检测:支持多种方式,HTTP、TCP、Docker、shell脚本定制化 3. KV存储:Key、Value的存储方式 4. 多数据中心:Consul支持多数据中心 5. 可视化界面 ##### 3. 项目搭建 1. 基于docker的consul集群 ```shell script docker run -d --name consul01 -p 8500:8500 -p 8300:8300 -p 8301:8301 -p 8302:8302 -p 8600:8600 consul agent -server -bootstrap-expect 2 -ui -bind=0.0.0.0 -client=0.0.0.0 docker inspect --format={{.NetworkSettings.IPAddress}} consul01 docker run -d --name consul03 -p 8502:8500 consul agent -server -ui -bind=0.0.0.0 -client=0.0.0.0 -join 172.17.0.9 docker exec -it consul01 consul members ``` consul参数 ``` –net=host: docker参数, 使得docker容器越过了net namespace的隔离,免去手动指定端口映射的步骤 -server: consul支持以server或client的模式运行, server是服务发现模块的核心, client主要用于转发请求 -advertise: 将本机私有IP传递到consul -retry-join: 指定要加入的consul节点地址,失败后会重试, 可多次指定不同的地址 -client: 指定consul绑定在哪个client地址上,这个地址可提供HTTP、DNS、RPC等服务,默认是>127.0.0.1 -bind: 绑定服务器的ip地址;该地址用来在集群内部的通讯,集群内的所有节点到地址必须是可达的,>默认是0.0.0.0 -allow_stale: 设置为true则表明可从consul集群的任一server节点获取dns信息, false则表明每次请求都会>经过consul的server leader -bootstrap-expect: 数据中心中预期的服务器数。指定后,Consul将等待指定数量的服务器可用,然后>启动群集。允许自动选举leader,但不能与传统-bootstrap标志一起使用, 需要在server模式下运行。 -data-dir: 数据存放的位置,用于持久化保存集群状态 -node: 群集中此节点的名称,这在群集中必须是唯一的,默认情况下是节点的主机名。 -config-dir: 指定配置文件,当这个目录下有 .json 结尾的文件就会被加载,详细可参考https://www.consul.io/docs/agent/options.html#configuration_files -enable-script-checks: 检查服务是否处于活动状态,类似开启心跳 -datacenter: 数据中心名称 -ui: 开启ui界面 -join: 指定ip, 加入到已有的集群中 原文链接:https://blog.csdn.net/junmoxi/article/details/90521818 ``` 2. 创建maven模块payment8004 3. 创建maven模块order82 4. 效果 ![consul](pic/consul.png) #### 8. 三个注册中心异同点 ![三个注册中心异同点](pic/三个注册中心异同点.png) ##### 1. CAP理论 CAP理论关注粒度是否是数据,而不是整体系统设计的策略,分区容错性要保证,所以要么是CP,要么是AP。 C: Consistency(强一致性) A: Availability(可用性) P: Partition tolerance(分区容错性) ![CAP1](pic/CAP1.png) ![CAP1](pic/CAP2.png) ##### 2. AP / CP 1. AP(eureka) ![AP](pic/AP.png) 2. CP(Zookeeper/Consul) ![AP](pic/CP.png) #### 9. 引入Ribbon ##### 1. 什么是Ribbon? ![什么是Ribbon](pic/什么是Ribbon.png) ##### 2. Ribbon目前也进入维护模式。 ![Ribbon目前也进入维护模式](pic/Ribbon目前也进入维护模式.png) Ribbon其实就是一个软负载均衡的客户端组件, 他可以和其他所需请求的客户端结合使用,和eureka结合只是其中一个实例。 ##### 3. LB(负载均衡) ![LB(负载均衡)](pic/LB(负载均衡).png) ###### 1. 集中式LB ![集中式LB](pic/集中式LB.png) ###### 2. 进程内LB ![进程内LB](pic/进程内LB.png) ##### 4. Ribbon核心组件IRule IRule:根据特定算法从服务列表中选取一个要访问的服务。 ![IRule算法](pic/IRule算法.png) - RoundRobinRule:轮询 - RandomRule:随机 - RetryRule:先按照RoundRobinRule的策略获取服务,如果获取服务失败则在指定时间内进行重试,获取可用的服务 - WeightedResponseTimeRule:对RoundRobinRule的扩展,响应速度越快的实例选择权重越多大,越容易被选择 - BestAvailableRule:会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务 - AvailabilityFilteringRule:先过滤掉故障实例,再选择并发较小的实例 - ZoneAvoidanceRule:复合判断server所在区域的性能和server的可用性选择服务器 #### 10. 引入openFeign服务调用 ##### 1. OpenFeign是什么? ![OpenFeign是什么](pic/OpenFeign是什么.png) OpenFeign是一个声明式的Web服务客户端,让编写Web服务客户端变得非常容易,只需创建一个接口并在接口上添加注解即可。 ##### 2. OpenFeign能干嘛? ![OpenFeign能干嘛](pic/OpenFeign能干嘛.png) ##### 3. Feign和OpenFeign两者区别? ![Feign和OpenFeign两者区别](pic/Feign和OpenFeign两者区别.png) ##### 4. 新建maven模块order83测试 ##### 5. OpenFeign超时控制 ```yaml # 设置feign客户端超时时间(OpenFeign默认支持ribbon) ribbon: # 指的是建立连接所用的时间,适用于网络状态正常的情况下,两端连接所用的时间 ReadTimeout: 5000 # 指的是建立连接后从服务器读取到可用资源所用的时间 ConnectTimeout: 5000 ``` ##### 6. OpenFeign日志打印功能 ![openFeign日志](pic/openFeign日志.png) ###### 1. 日志级别 ![日志级别](pic/日志级别.png) ###### 2. 日志配置 ```java @Configuration public class FeignConfig { /** * feignClient配置日志级别 */ @Bean public Logger.Level feignLoggerLevel() { // 请求和响应的头信息,请求和响应的正文及元数据 return Logger.Level.FULL; } } ``` ```yaml logging: level: # feign日志以什么级别监控哪个接口 com.atguigu.springcloud.service.PaymentFeignService: debug ``` #### 11. 引入Hystrix熔断器 ##### 1. 分布式系统面临的问题 复杂分布式体系结构中的应用程序,有数10个依赖关系,每个依赖关系在某些时候将不可避免地失败。 ![分布式系统面临的问题](pic/分布式系统面临的问题1.png) ![分布式系统面临的问题](pic/分布式系统面临的问题2.png) ##### 2. Hystrix是什么 ![hystrix是什么](pic/hystrix是什么.png) Hystrix已经停止更新进入维护状态。 ##### 2. Hystrix重要概念 在分布式环境中,不可避免地会有许多服务依赖项中的某些失败。Hystrix是一个库,可通过添加延迟容限和容错逻辑来帮助您控制这些分布式服务之间的交互。 Hystrix通过隔离服务之间的访问点,停止服务之间的级联故障并提供后备选项来实现此目的,所有这些都可以提高系统的整体弹性。 ###### 1. 服务降级 服务器忙,请稍后再试,不让客户端等待并立刻返回一个友好提示,fallback。 **哪些情况会发出降级:** - 程序运行异常 - 超时 - 服务熔断触发服务降级 - 线程池/信号量也会导致服务降级 ###### 2. 服务熔断 类比保险丝达到最大服务访问后,直接拒绝访问,拉闸限电,然后调用服务降级的方法并返回友好提示。 服务的降级 -> 进而熔断 -> 恢复调用链路 ###### 3. 服务限流 如秒杀高并发等操作,严禁一窝蜂的过来拥挤,大家排队,一秒钟N个,有序进行。 ###### 4. What Is Hystrix For? Hystrix旨在执行以下操作: - 通过第三方客户端库提供保护,并控制延迟和失败(通常通过网络)依赖项的故障。 - 停止复杂的分布式系统中的级联故障。 - 快速失败,迅速恢复。 - Fallback并在可能的情况下正常降级。 - 启用近乎实时的监视,警报和操作控制。 ###### 5. Hystrix的设计原则是什么? - 防止任何单个依赖项耗尽所有容器(例如Tomcat)用户线程。 - 减少负载并快速失败,而不是排队。 - 在可行的情况下提供备用,以保护用户免受故障的影响。 - 使用隔离技术(例如bulkhead, swimlane, circuit breaker模式)来限制任何一种依赖关系的影响。 - 通过近实时指标(metrics),监视和警报优化发现时间。 - 通过在Hystrix的大多数方面中以低延迟传播配置更改来优化恢复时间,并支持动态属性更改,这使您可以通过低延迟反馈环路进行实时操作修改。 - 防止整个依赖项客户端执行失败,而不仅仅是网络流量失败。