Spring Cloud中国社区官网:http://springcloud.cn
Spring Cloud中国社区论坛:http://bbs.springcloud.cn
Spring Cloud中国社区文档:http://docs.springcloud.cn
转存失败重新上传取消
1、创建项目
2、字符编码
3、注解生效激活
4、Java编译版本
1、流程
(1)、建module
(2)、改pom
父module
子module
(3)、写yml
(4)、主启动类
(5)、业务类
建表sql
entities --> 主实体
JSON封装CommonResult结果集
dao
service --> 接口及实现类
Controller
(6)、测试
1、流程
大致与生产者相同
(1)、Controller
(2)、RestTemplate
(3)、配置类
1、引入maven依赖
2、设置
Ctrl+Alt+Shift+/
1、观察问题
实体类冗余
2、新建
创建公共模块commons
3、POM
4、entities
5、maven命令clean、install
6、订单80和支付8001分别改造
(1)、什么是服务治理?
Spring Cloud封装了Netflix 公司开发的Eureka模块来实现服务治理
在传统的rpc远程调用框架中,管理每个服务与服务之间依赖关系比较复杂,管理比较复杂,所以需要使用服务治理,管理服务于服务之间依赖关系,可以实现服务调用、负载均衡、容错等,实现服务发现与注册。
(2)、什么是服务注册?
Eureka采用了CS的设计架构,Eureka Sever作为服务注册功能的服务器,它是服务注册中心。而系统中的其他微服务,使用Eureka的客户端连接到 Eureka Sever并维持心跳连接。这样系统的维护人员就可以通过Eureka Server来监控系统中各个微服务是否正常运行。
在服务注册与发现中,有一个注册中心。当服务器启动的时候,会把当前自己服务器的信息比如服务地址通讯地址等以别名方式注册到注册中心上。另一方(消费者服务提供者),以该别名的方式去注册中心上获取到实际的服务通讯地址,然后再实现本地RPC调用RPC远程调用框架核心设计思想:在于注册中心,因为使用注册中心管理每个服务与服务之间的一个依赖关系(服务治理概念)。在任何rpc远程框架中,都会有一个注册中心(存放服务地址相关信息(接口地址)
(3)、Eureka两组件
Eureka包含两个组件: Eureka Server和Eureka Client
Eureka Server提供服务注册服务
各个微服务节点通过配置启动后,会在EurekaServer中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观看到。
EurekaClient通过注册中心进行访问
是一个Java客户端,用于简化Eureka Server的交互,客户端同时也具备一个内置的、使用轮询(round-robin)负载算法的负载均衡器。在应用启动后,将会向Eureka Server发送心跳(默认周期为30秒)。如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳, EurekaServer将会从服务注册表中把这个服务节点移除(默认90秒)
服务端
(1)、引入服务端maven依赖
(2)、application.yml配置文件
(3)、开启服务端注解
(4)、访问7001端口 成功
http://localhost:7001/
客户端
(5)、引入客户端maven依赖
(6)、修改yml
(7)、开启客户端注解
(1)、参考原Eureka服务模块新建
(2)、改POM
(3)、修改映射配置
修改hosts文件
(4)、写yml
互相注册到对方
其他服务修改配置,同时注册到两个注册中心
(5)、主启动
(6)、其他配置
两个地址服务端的url地址不能写死,要写Eureka中的服务名称,并开启RestTemplate的负载均衡功能
注意:启动服务必须先启动Eureka注册中心,再启动生产者,再启动消费者。
(1)、主机名称:服务名称修改
Eureka下
(2)、访问信息有IP信息提示
对于注册进Eureka里面的微服务,可以通过服务发现来获得该服务的信息。
(1)、获取DiscoveryClient
(2)、启动类添加注解
(1)、故障现象
(2)、导致原因
某时刻某,某个微服务不可用了,Eureka不会立刻清理,依旧会对该微服务的信息进行保存,属于CAP里面的AP分支。为了防止EurekaClient可以正常运行,但是与EurekaServer网络不通情况下,EurekaServer不会立刻将EurekaClient服务剔除。
什么是自我保护模式?
默认情况下,如果EurekaServer在一定时间内没有接收到某个微服务实例的心跳,EurekaServer将会注销该实例(默认90秒)。但是当网络分区故障发生(延时、卡顿、拥挤)时,微服务与EurekaServer之间无法正常通信,以上行为可能变得非常危险了——因为微服务本身其实是健康的,此时本不应该注销这个微服务。Eureka通过“自我保护模式”来解决这个问题——当EurekaServer节点在短时间内丢失过多客户端时(可能发生了网络分区故障),那么这个节点就会进入自我保护模式。
(3)、怎么禁止自我保护
(1)、引pom
排除依赖冲突
(2)、写yml
(3)、主启动类
(4)、Controller
(1)、引pom
同上提供者
(2)、改yml
同上提供者
(3)、主启动类
同上提供者
(4)、业务类
(1)、是什么
Consul是一套开源的分布式服务发现和配置管理系统,由HashiCorp公司用Go语言开发。
提供了微服务系统中的服务治理、配置中心、控制总线等功能。这些功能中的每一个都可以根据需要单独使用,也可以一起使用以构建全方位的服务网格,总之Consul提供了一种完整的服务网格解决方案。
它具有很多优点。包括:基于raft协议,比较简洁;支持健康检查,同时支持HTTP和DNS协议支持跨数据中心的WAN集群提供图形界面跨平台,支持Linux、Mad、Windows。
(2)、能干嘛
(3)、去哪下
https://www.consul.io/downloads
(4)、怎么玩
https://www.springcloud.cc/spring-cloud-consul.html
(1)、引pom
(2)、改yml
(3)、主启动类
(4)、业务类Controller
与其他注册中心基本相同
与其他注册中心基本相同
(1)、简介
Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的.
简单的说,Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法和服务调用。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。简单的说,就是在配置文件中列出Load Balancer(简称LB)后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询、随机连接等)去连接这些机器。我们很容易使用Ribbon实现自定义的负载均衡算法。
(2)、作用
LB负载均衡(Load Balance)是什么
简单的说就是将用户的请求平摊的分配到多个服务上,从而达到系统的HA(高可用)。常见的负载均衡有软件Nginx,LVS,硬件F5等。
Ribbon本地负载均衡客户端VS Nginx服务端负载均衡区别
Nginx是服务器负载均衡,客户端所有请求都会交给nginx,然后由nginx实现转发请求。即负载均衡是由服务端实现的。
Ribbon本地负载均衡,在调用微服务接口时候,会在注册中心上获取注册信息服务列表之后缓存到VM本地,从而在本地实现RPC远程服务调用技术。
(1)、架构说明
Ribbon其实就是一个软负载均衡的客户端组件,他可以和其他所需请求的客户端结合使用,和eureka结合只是其中的一种方案。
(2)、引pom
客户端引入Eureka时,Eureka已集成了Ribbon,如果使用Eureka可以不用再次引入。
(3)、二说RestTemplate的使用
官网
getForObject方法/getForEntity方法
JSON串-->postForObject
更详细的信息-->postForEntity
postForObject/postForEntity
GET请求方法
POST请求方法
(1)、概述
lRule:根据特定算法中从服务列表中选取一个要访问的服务
负载均衡策略,出厂默认使用轮询
(2)、如何替换
注意:不可以放在被ComponentScan扫描的位置,需要另建独立于启动类包下的位置。
新建package
规则类
主启动类添加注解
(1)、原理
负载均衡算法: rest接口第几次请求数%服务器集群总数量=实际调用服务器位置下标,每次服务重启动后rest接口计数从1开始。
List instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
如:List [0] instances = 127.0.0.1:8002
List [1] instances = 127.0.0.1:8001
8001+8002组合成为集群,它们共计2台机器,集群总数为2,按照轮询算法原理:
当总请求数为1时: 1%2=1对应下标位置为1,则获得服务地址为127.0.0.1:8001当总请求数位2时:2%2=О对应下标位置为0,则获得服务地址为127.0.0.1:8002当总请求数位3时:3%2=1对应下标位置为1,则获得服务地址为127.0.0.1:8001当总请求数位4时:4 %2=О对应下标位置为0,则获得服务地址为127.0.0.1:8002如此类推.....
(2)、源码
choose
(3)、手写
(1)、OpenFeign是什么?
Feian是一个声明式的Web服务客户端,让编写Web服务客户端变得非常容易,只需创建一个接口并在接口上添加注解
Feign是一个声明式WebService客户端。使用Feign能让编写Web Service客户端更加简单。
它的使用方法是定义一个服务接口然后在上面添加注解。Feign也支持可拔插式的编码器和解码器。 Spring Cloud对Feign进行了封装,使其支持了Spring MVC标准注解和HttpMessageConverters。Feign可以与Eureka和Ribbon组合使用以支持负载均衡。
(2)、能干嘛?
Feign旨在使编写Java Http客户端变得更容易。
前面在使用Ribbon+RestTemplate时,利用RestTemplate对http请求的封装处理,形成了一套模板化的调用方法,但是在实际开发中,由于对服务依赖的调用可能不止一处,往往一个按口会被多处调用,所以,Feign在此基础上进一步封装,有他来帮助我们定义和实现依赖服务接口的定义,Fein的实现下这些依赖服务的调用。所以,Feign在此基础上做了进一步封装,在Feignde是线下,我们只需创建一个接口并使用注解的方式来配置它(以前是Dao接口上面标注Mapper注解,现在是一个微服务接口上面标注一个
Feign注解即可),即可完成对服务提供方的接口绑定,简化了使用Spring cloud Ribbon时,自动封装服务调用客户端的开发量。
Feign集成了Ribbon
利用Ribbon维护了Payment的服务列表信息,并且通过轮询实现了客户端的负载均衡。而与Ribbon不同的是,通过feign只需要定义服务绑定接口且以声明式的方法,优雅而简单的实现了服务调用
(3)、Feign和OpenFeign两者区别?
(1)、接口+注解
Feign在消费端使用
(2)、引pom
OpenFeign整合了Ribbon,也具备负载均衡功能。
(3)、改yml
(4)、主启动类
消费端主启动类添加注解 激活并开启Feign
(5)、业务类
@FeignClient中的参数,调用那个服务就写那个服务的名字。
调用
默认Feign客户端只等待一秒钟,但是服务端处理需要超过1秒钟,导致Feign客户端不想等待了,直接返回报错。为了避免这样的情况,有时候我们需要设置Feign客户端的超时控制。
延时配置
1、日志级别
2、配置
3、YML里需要开启日志的Feign客户端
(1)、分布式系统面临的问题
服务雪崩
多个微服务之间调用的时候,假设微服务A调用微服务B和微服务C,微服务B和微服务C又调用其它的微服务,这就是所谓的“扇出”。如果扇出的链路上某个微服务的调用响应时间过长或者不可用,对微服务A的调用就会占用越来越多的系统资源,进而引起系统崩溃,所谓的“雪崩效应”。
对于高流量的应用来说,单一的后端依赖可能会导致所有服务器上的所有资源都在几秒钟内饱和。比失败更糟糕的是,这些应用程序还可能导致服务之间的延迟增加,备份队列,线程和其他系统资源紧张,导致整个系统发生更多的级联故障。这些都表示需要对故障和延迟进行隔离和管理,以便单个依赖关系的失败,不能取消整个应用程序或系统。
(2)、是什么
Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时、异常等,Hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性。
"断路器”本身是一种开关装置,当某个服务单元发生故障之后,通过断路器的故障监控(类似熔断保险丝),向调用方返回一个符合预期的、可处理的备选响应(FallBack),而不是长时间的等待或者抛出调用方无法处理的异常,这样就保证了服务调用方的线程不会被长时间、不必要地占用,从而避免了故障在分布式系统中的蔓延,乃至雪崩。
(3)、能干嘛
(4)、官网资料
(5)、停更
(1)、服务降级
(2)、服务熔断
(3)、服务限流
(1)、构建
1)、引pom
2)、改yml
3)、Service
4)、Controller
(2)、高并发测试
20000个并发
(3)、故障现象和导致原因
故障现象
服务器压力过大,导致其他方法调用十分卡顿
导致原因
tomcat的默认的工作线程数被打满了,没有多余的线程来分解压力和处理。
(4)、上诉结论
(5)、如何解决?解决的要求
(6)、服务降级
服务端
降级配置
方法上添加 @HystrixCommand注解,配置超时设置。
主启动类添加@EnableEurekaClient注解,表示回路
目前问题 解决问题
客户端
配置
引入maven依赖
yml 开启
主启动类
问题:
1)、随着系统的不断庞大,需要配置多个降级的时候,代码过于膨胀。
解决:配置全局通用降级
2)、和业务逻辑混在一起,代码混乱。
解决:
为远程接口添加统一的fallback类
fallback类要实现远程接口
(7)、服务熔断
1)、断路器
2)、熔断机制
熔断机制是应对雪崩效应的一种微服务链路保护机制。当扇出链路的某个微服务出错不可用或者响应时间太长时,会进行服务的降级,进而熔断该节点微服务的调用,快速返回错误的响应信息。
当检测到该节点微服务调用响应正常后,恢复调用链路。
在Spring Cloud框架里,熔断机制通过Hystrix实现。Hystrix会监控微服务间调用的状况,
当失败的调用到一定阈值,缺省是5秒内20次调用失败,就会启动熔断机制。熔断机制的注解是@HystrixCommand。
3)、实操
service
controller
4)、原理(总结)
熔断类型
官网步骤
断路器在什么情况下开始起作用
断路器开启或者关闭的条件
断路器打开之后
所有配置
(8)、服务限流
见 Alibabasentinel
(1)、概述
除了隔离依赖服务的调用以外,Hystrix还提供了准实时的调用监控(Hystrix Dashboard),Hystrix会持续地记录所有通过Hystrix发起的请求的执行信息,并以统计报表和图形的形式展示给用序,包括每秒执行多少请求多少成功,多少失败等。Netflix通过hystrix-metrics-event-stream项目实现了对以上指标的监控。Spring Cloud也提供了Hystrix Dashboard的整合,对监控内容转化成可视化界面。
(2)、仪表盘
pom
yml
主启动类添加注解
其他模块引入pom
所有微服务的提供类都需要监控依赖配置
访问:http://localhost:9001/hystrix
注意!!!
(3)、断路器演示
访问:http://localhost:9001/hystrix
7色
1圈
1线
整图说明