SpringCloudAlibaba
服务的注册和发现:Nacos注册中心
//获取服务列表
List<ServiceInstance> instances = discoveryClient.getInstances(SysCommon.productService);
//从服务中获取第一个服务(正常情况下应该通过负载均衡获取服务器)
ServiceInstance serviceInstance = instances.get(0);
//获取服务地址
String url = serviceInstance.getHost() + SysCommon.colon + serviceInstance.getPort();
//服务调用 restTemplate.getForObject("地址", Product.class);
RestTemplate发送请求
Get:getForEntity —第一个参数为服务地址(URL也可以为URI),注意通过注册中心的服务名进行调用才能实现负载均衡;
—第二个参数为返回响应体需要封装成什么类型;
—如果调用地址需要携带参数可以使用占位符,{数字}或{参数名}然后添加第三或更多参数,如果使用的为{数字} 则参数为这个参数对应的值,如果使用{参数名}则第三个参数为一个map,key和前面占位符保持一致,map的 value为这个占位符需要替换的值;
--------返回值为一个HTTP请求的封装,是一个ResponseEntity类型。可以获取到状态码,响应头,响应体等。
getForObject —参数同上。
--------返回值为你封装的参数类型。
Post:postForEntity —第一个参数服务地址
—第一个上传的参数
—第一个返回封装的类型
--------返回值同GET
postForObject----同Get
postForLocation—参数同上
--------返回值为一个URI
PUT:put —参数同postForEntity,无返回值
DELETE:通过delete方法调用,无返回值
负载均衡
添加@LoadBalance注解开启
@Bean
@LoadBalanced
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
Ribbon负载均衡策略共七种
常用:轮询RoundRobinRule、随机RandomRule
可以通过修改配置文件选择调整Ribbon的负载均衡策略
基于Feign的服务调用
Feign默认支持Ribbon,使用注意契约
@RequestMapping(method = RequestMethod.GET,value = "/product/{pid}")
容错Sentinel
为什么要考虑容错:
当一个有依赖关系的微服务系统中,服务之间的关系为A调用B调用C调用D
场景:当服务C挂了,服务B不知道C挂了仍在发送请求,但却得不到响应,大量请求堆积然后B也挂了,A也挂了产生雪崩
容错方案:隔离、超时、限流、熔断、降级
隔离
它是指将系统按照一定的原则划分为若干个服务模块,各个模块之间相对独立,无强依赖。当有故障发
生时,能将问题和影响隔离在某个模块内部,而不扩散风险,不波及其它模块,不影响整体的系统服
务。常见的隔离方式有:线程池隔离和信号量隔离.
超时
在上游服务调用下游服务的时候,设置一个最大响应时间,如果超过这个时间,下游未作出反应,就断
开请求,释放掉线程。
限流
限流就是限制系统的输入和输出流量已达到保护系统的目的。为了保证系统的稳固运行,一旦达到的需要
限制的阈值,就需要限制流量并采取少量措施以完成限制流量的目的。
资源名:请求的资源的路径
针对来源:服务名,默认为default
阈值类型:
QPS(每秒的请求数量):当api达到设定的阈值时进行限流。
线程数:当调用该api的线程数达到阈值时进行限流。
单机阈值:设置的QPS或线程数阈值。
流控模式
直接:达到设定的阈值直接进行限流
关联:当依赖的资源达到阈值时限流自己
链路:指定的入口资源进来的流量达到阈值会限流
流控效果:
快速失败:发生流控时抛出FlowException
WarmUp:预热模式使流量缓慢增加
排队等待:匀速器
熔断
在互联网系统中,当下游服务因访问压力过大而响应变慢或失败,上游服务为了保护系统整体的可
用性,可以暂时切断对下游服务的调用。这种牺牲局部,保全整体的措施就叫做熔断。
熔断关闭状态(Closed):服务没有故障时,熔断器所处的状态,对调用方的调用不做任何限制
熔断开启状态(Open):后续对该服务接口的调用不再经过网络,直接执行本地的fallback方法
半熔断状态(Half-Open):尝试恢复服务调用,允许有限的流量调用该服务,并监控调用成功率。如果成功率达到预期,则说明服务已恢复,进入熔断关闭 状态;如果成功率仍旧很低,则重新进入熔断开启状态。
状态 | 说明 |
---|---|
OPEN | 表示熔断开启,拒绝所有请求 |
HALF_OPEN | 探测恢复状态,如果接下来的一个请求顺利通过则结束熔断,否则继续熔断 |
CLOSED | 表示熔断关闭,请求顺利通过 |
降级
降级其实就是为服务提供一个托底方案,一旦服务无法正常调用,就使用托底方案。
降级规则参数说明
1、慢调用比例:使用场景—当调用第三方接口, 响应的速度缓慢并影响到了当前接口,将其熔断。
属性 | 说明 |
---|---|
最大RT | 需要设置的阈值,超过该值则为慢应用 |
比例阈值 | 慢调用占所有的调用的比率,范围:[0~1] |
熔断时长 | 在这段时间内发生熔断、拒绝所有请求 |
最小请求数 | 即允许通过的最小请求数,在该数量内不发生熔断 |
2、异常比例:使用场景—当产生异常的比例较高时,将其熔断。
属性 | 说明 |
---|---|
异常比例阈值 | 异常比例=发生异常的请求数÷请求总数取值范围:[0~1] |
熔断时长 | 在这段时间内发生熔断、拒绝所有请求 |
最小请求数 | 即允许通过的最小请求数,在该数量内不发生熔断 |
3、异常数:使用场景—当产生的异常达到一定的数量,将其熔断。
属性 | 说明 |
---|---|
异常数 | 请求发生异常的数量 |
熔断时长 | 在这段时间内发生熔断、拒绝所有请求 |
最小请求数 | 即允许通过的最小请求数,在该数量内不发生熔断 |
Seata分布式事务
使用情形:一个分布式微服务的项目,业务需要调用三个服务完成,为了保证全局的数据一致性,当一个服务出现异常后执行回滚操作保证数据一致性。
在事务的开始使用@GlobalTransactional注解
1、Seata下载------github
2、修改script\config-center文件夹下的congfig.txt配置
3、执行\script\config-center\nacos文件加下的nacos-config.sh将配置注册到nacos配置中心
nacos-config.sh -h ‘Nacos地址’ -p ‘Nacos端口’ -g ‘分组’ -u ‘Nacos用户名’-w ‘Nacos密码’ -t ‘命名空间’
执行完后在Nacos的配置中心可以看到相关配置
4、创建seata数据库,使用\script\server\db文件加下的sql文件快速创建表
5、修改seata-server-1.3.0\seata\conf文件加下的file.conf、registry.conf
6、打开seata-server-1.3.0\seata\bin文件下的seata-server.sh
ZipKin链路追踪
**Trace:**类似于树结构的Span集合,表示一条调用链路,存在唯一标识。
**span:**表示调用链路来源,通俗的理解span就是一次请求信息。