irpas技术客

Spring Cloud Alibaba 微服务解决方案 详解_Modify_lzq_alibaba 微服务

irpas 6467

1、Spring Cloud Alibaba

1.1、Spring Cloud Alibaba概述

官网地址:https://spring.io/projects/spring-cloud-alibaba 前文: Spring Cloud

Spring Cloud Alibaba 为分布式应用开发提供一站式解决方案。它包含开发分布式应用程序所需的所有组件,使您可以轻松地使用 Spring Cloud 开发应用程序。

使用Spring Cloud Alibaba,您只需添加一些注解和少量配置,即可将Spring Cloud应用连接到阿里巴巴的分布式解决方案,并通过阿里巴巴中间件构建分布式应用系统。

简单来说,Spring Cloud Alibaba 本质上就是Alibab基于Java自己封装的一些组件,在前面了解Spring Cloud的时候,Spring Cloud也就是在做微服务开发所提供的一系列组件。

1.2、Spring Cloud Alibaba 与 Spring Cloud

上面说到对于Spring Cloud Alibaba提供的一系列组件本质和Spring Cloud 提供的组件差不多,如下表:

Spring CloudSpring Cloud Alibaba服务注册中心Eureka、ConsulNacos流控(服务熔断)HystrixSentinel统一配置中心ConfigNacos服务通信、负载均衡Ribbon、OpenFeignDubbo RPC

2、Hello World

首先还是和Spring Cloud 项目一致,先构建一个父项目用来统一管理cloud和boot的版本。这里的Alibaba cloud 使用2.2.1版,而cloud和boot还是和前面的spring cloud使用H SR6和2.2.5版本,

github地址:https://github.com/lizuoqun/springcloudalibaba_parent (master分支)

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://·/mysql/downloads/MySQL-8.0/

在安装完成之后,修改远程连接并生效,使用以下命令:修改远程连接之后就可以使用sql工具进行连接就好了。

update user set host='%' where user='root'; flush privileges;

最后就是对当前这个数据库进行设置了,首先创建一个库用于Nacos的持久化,

CREATE DATABASE nacos DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci

而后对于数据库初始化需要一个nacos-mysql.sql文件,这个文件就在Nacos安装包的conf目录下 直接拉出来到sql工具当中执行。也就是将Nacos需要用到的表进行创建,而后在这个conf文件下修改application.properties文件,将数据源改成mysql,以及其余的mysql配置根据自身安装时的配置更改即可。

最后重启nacos。当在配置列表当中新加了一个配置之后,在mysql当中会存放在his_config_info表当中,这样也就完成了nacos的mysql本地持久化了。

4、Sentinel

4.1、Sentinel 概述

Sentinel 是什么? 分布式系统的流量防卫兵,类似之前Cloud的Hystrix。随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。

Sentinle是用来对现有微服务系统进行保护,也是用来替换Hystrix的。

Sentinel 基本概念

资源

资源是 Sentinel 的关键概念。它可以是 Java 应用程序中的任何内容,例如,由应用程序提供的服务,或由应用程序调用的其它应用提供的服务,甚至可以是一段代码。在接下来的文档中,我们都会用资源来描述代码块。只要通过 Sentinel API 定义的代码,就是资源,能够被 Sentinel 保护起来。大部分情况下,可以使用方法签名,URL,甚至服务名称作为资源名来标示资源。

规则

围绕资源的实时状态设定的规则,可以包括流量控制规则、熔断降级规则以及系统保护规则。所有规则可以动态实时调整。

4.2、Sentinel DashBoard

首先在使用Sentinel的时候,sentinel和sentinel DashBoard都需要,这里的Sentinel 是通过依赖得到的,而DashBoard是通过jar包进行启动,首先先到官网进行下载。下载得到jar包后,直接通过命令进行启动即可:默认端口是8080,当然了这里还是和前面安装nacos一样,也将这个jar包给放到虚拟机上进行管理。放在windows下也是可以的。

下载地址:https://github.com/alibaba/Sentinel/releases

java -jar sentinel-dashboard-1.8.2.jar # 修改端口进行启动 java -jar -Dserver.port=9999 sentinel-dashboard-1.8.2.jar

启动之后直接访问8080端口,账号密码都是sentinel进行登录。

4.3、Sentinel 服务

在 启动后,创建一个微服务注册到nacos上,在这里引入sentinel依赖,

<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency>

修改配置文件:

spring.cloud.sentinel.enabled=true spring.cloud.sentinel.transport.dashboard=192.168.101.128:8080 spring.cloud.sentinel.transport.port=8719

对接口进行监控

4.4、熔断规则——流量控制

资源名:唯一名称,默认请求路径针对来源:Sentinel可以针对调用者进行限流,填写微服务名,默认default(不区分来源)阈值类型/单机阀值: QPS(每秒钟的请求数量):当调用该api的QPS达到阈值的时候,进行限流。线程数:当调用该api的线程数达到闽值的时候,进行限流 是否集群:不需要集群流控模式: 直接:api达到限流条件时直接限流关联:当关联的资源达到阈值时,就限流自己。链路:只记录指定链路上的流量(指定资源从入口资源进来的流量,如果达到阈值,就进行限流)【API级别的针对来源】 效果 快速失败:直接失败,抛异常Warm up:根据codeFactor(冷加载因子,默认3)的值,从阈值/codeFactor,经过预热时长,才达到设置的QPS阈值排队等待:匀速排队,让请求以匀速通过,与值类型必须设置为QPS,否则无效。

如上图:新加了一个熔断规则对接口进行监控,首先对QPS也就是每秒请求数量设置为2,当直接在浏览器一直刷新,访问该接口,可以在下图看到,当一个时间段的访问数超过了2之后,其余的请求都会直接失败进行处理掉。

上面是QPS每秒请求数进行处理,而后改成线程数为2,这个时候就需要借助工具来进行测试了,在这里使用JMater来进行压力测试,设置线程组,每组一次发3个线程,每次限制2个线程进行访问,多余的线程也会直接失败处理。

JMeter压力测试:JMeter压力测试博文

4.5、熔断规则——熔断降级

原理:当监控到调用链路中某–个服务,出现异常(20个以上异常)自动触发培断,在触发之后对于谈服务调用不可用

RT:平均响应时间,秒级 平均响应时间 超出阈值 且 在时间窗口内通过的请求>=5,两个条件同时满足后触发降级,窗口期过后关闭断路器RT最大为4900,更大的需要通过 -Dcsp.sentinel.statistic.max.rt=XXXX 才能生效 异常比例,秒级 QPS >= 5 且异常比例(秒级统计)超过阈值时,触发降级;时间窗口结束后,关闭降级 异常数,分钟级 异常数(分钟统计)超过阈值时,触发降级;时间窗口结束后,关闭降级

4.6、熔断规则——热点参数限流

热点也就是经常访问的数据。很多时候我们希望统计某个热点数据中访问频次最高的 Top K 数据,并对其访问进行限制。比如:

商品 ID 为参数,统计一段时间内最常购买的商品 ID 并进行限制用户 ID 为参数,针对一段时间内频繁访问的用户 ID 进行限制

热点参数限流会统计传入参数中的热点参数,并根据配置的限流阈值与模式,对包含热点参数的资源调用进行限流。热点参数限流可以看做是一种特殊的流量控制,仅对包含热点参数的资源调用生效。

在业务类中添加代码

这里@SentinelResource注解的value属性要求唯一,一般与请求Mapping相同,将来在sentinel控制台添加热点key限流时可以用@SentinelResource注解的value作为资源名。@SentinelResource注解的blockHandler属性用于指定兜底方法,需要在兜底方法的参数列表中添加一个BlockException类型的参数 @GetMapping("/demo") @SentinelResource(value = "sentinelDemo", blockHandler = "blockHandler" , fallback = "fall") public String demo(Integer id){ if (id<0) throw new RuntimeException("id 无效"); return "demo ok"; } public String blockHandler(Integer id, BlockException e){ if(e instanceof FlowException){ return "已被流控"; } if(e instanceof DegradeException){ return "已被降级"; } return "===== 其余子类异常,这里就不一一列出来了 ====="; } public String fall(){ return "服务器异常"; }

在这里的BlockException是整个所有sentinel抛出的异常的一个父类,在这里我们直接进入到该类就可以看到他的所有的子类,


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #Alibaba #微服务 #1spring #Cloud #Alibaba1Spring