SpringCloudAlibaba
2024-02-18 13:49:35 0 举报
使用
SpringCloudAlibaba笔记、微服务
作者其他创作
大纲/内容
1.<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId></dependency>2.修改配置文件spring:cloud:sentinel:transport:dashboard: localhost:18080 # 指定控制台服务的地址
Sentinel容错限流
GatewayFilter单一路由过滤器
当请求量上来了第一个参数使用次数大于设定的这个阈值就会执行注解中指定的hotkeyHandler方法
流控效果
局部过滤器
Nacos服务配置
排队等待:让请求以均匀的速度通过,单机阈值为每秒通过数量,其余的排队等待; 它还会让设置一个超时时间,当请求超过超时间时间还未处理,则会被丢弃。
负载均衡基于客户端的远程调用
热点规则
当资源的每秒异常总数占通过量的比值超过阈值之后,资源进入降级状态,
id: 路由标识符,区别于其他 Route。uri: 路由指向的目的地 uri,即客户端请求最终被转发到的微服务。order: 用于多个 Route 之间的排序,数值越小排序越靠前,匹配优先级越高。predicate: 断言的作用是进行条件判断,只有断言都返回真,才会真正的执行路由。filter: 过滤器用于修改请求和响应信息。
自定义全局过滤器
1.下载Sentinel控制台jar包2.启动:java -jar -Dserver.port=18080 sentinel-dashboard-1.8.1.jar指定端口号是180803.用户名密码默认都是sentinel
基于线程数的限制区别在于QPS是说请求到达服务前的限制线程数指的是到达服务后,服务线程处理不完时进行限制配置规则操作和QPS限制一样
规则持久化
1.引入依赖<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency>2.添加配置文件注意:不能使用原来的application.yml作为配置文件,而是新建一个bootstrap.yml作为配置文件配置文件优先级(由高到低):bootstrap.properties -> bootstrap.yml -> application.properties -> application.yml3.在配置文件中加入配置spring:application:name: service-productcloud:nacos:config:server-addr: 127.0.0.1:8848 #nacos中心地址file-extension: yaml # 配置文件格式profiles:active: dev # 环境标识4.Nocas服务端配置5.配置刷新@RefreshScope//只需要在需要动态读取配置的类上添加此注解就可以public class NacosConfigController {@Value(\"${config.appName}\")private String appName;//2 注解方式@GetMapping(\"/nacos-config-test2\")public String nacosConfingTest2() {return appName;}}
断言工厂
设置一个每秒请求大于3就开始限流
自定义API维度
限流
@SentienlResource(value=\"\")
过滤器
1.skywaking一般只记录你的controller请求不会记录到实际的业务层,如果你想记录到impl业务层,那就需要你添加一个pom依赖和一个注解@Trace,同时想记录业务层传入参数的值和已经返回的结果值都需要加注解@Tag如右侧图
/*** 配置初始化的限流参数*/@PostConstructpublic void initGatewayRules() {Set<GatewayFlowRule> rules = new HashSet<>();rules.add(newGatewayFlowRule(\"product_api1\").setCount(1).setIntervalSec(1));rules.add(newGatewayFlowRule(\"product_api2\").setCount(1).setIntervalSec(1));GatewayRuleManager.loadRules(rules);} //自定义API分组@PostConstructprivate void initCustomizedApis() {Set<ApiDefinition> definitions = new HashSet<>();ApiDefinition api1 = new ApiDefinition(\"product_api1\").setPredicateItems(new HashSet<ApiPredicateItem>() {{// 以/product-serv/product/api1 开头的请求add(new ApiPathPredicateItem().setPattern(\"/productserv/product/api1/**\").setMatchStrategy(SentinelGatewayConstants.URL_MATCH_STRATEGY_PREFIX));}});ApiDefinition api2 = new ApiDefinition(\"product_api2\").setPredicateItems(new HashSet<ApiPredicateItem>() {{// 以/product-serv/product/api2/demo1 完成的url路径匹配add(new ApiPathPredicateItem().setPattern(\"/productserv/product/api2/demo1\"));}});definitions.add(api1);definitions.add(api2);GatewayApiDefinitionManager.loadApiDefinitions(definitions);}
Order服务开启限流,容错
Order订单服务端口号:8091服务名称:service-order
User服务开启限流,容错
向注册中心注册
链路模式
服务共享配置
系统规则
直接流控模式是最简单的模式,当指定的接口达到限流条件时开启限流。上面案例使用的就是直接流控模式。
关联流控模式指的是,当指定接口关联的接口达到限流条件时,开启对指定接口开启限流。
====================基于ribbon====================方式2:基于ribbon 在RestTemplate 的生成方法上添加@LoadBalanced注解@Bean @LoadBalancedpublic RestTemplate getRestTemplate() {return new RestTemplate();}@Autowiredprivate RestTemplate restTemplate;//直接使用微服务名字, 从nacos中获取服务地址String url = \"service-product\";//通过restTemplate调用商品微服务Product product = restTemplate.getForObject(\"http://\" + url + \"/product/\
平均响应时间
第4步客户端配置详情
1.下载Nacos服务端2.启动:#切换目录cd nacos/bin#命令启动startup.cmd -m standalone2.端口号默认88483.用户名密码默认都是nacos
1.<!--fegin组件--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>2.@EnableFeignClients//启动类添加开启Fegin
链路追踪Skywaking
实现鉴权功能
服务注册
异常比例
1.引入依赖<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency>2.添加配置文件注意:不能使用原来的application.yml作为配置文件,而是新建一个bootstrap.yml作为配置文件配置文件优先级(由高到低):bootstrap.properties -> bootstrap.yml -> application.properties -> application.yml3.在配置文件中加入配置spring:application:name: service-productcloud:nacos:config:server-addr: 127.0.0.1:8848 #nacos中心地址file-extension: yaml # 配置文件格式profiles:active: dev # 环境标识4.Nocas服务端配置5.配置刷新@RefreshScope//只需要在需要动态读取配置的类上添加此注解就可以public class NacosConfigController {@Value(\"${config.appName}\")private String appName;//2 注解方式@GetMapping(\"/nacos-config-test2\")public String nacosConfingTest2() {return appName;}}
======================熔断================== 熔断 在互联网系统中,当下游服务因访问压力过大而响应变慢或失败,上游服务为了保护系统整体的可用性,可以暂时切断对下游服务的调用。这种牺牲局部,保全整体的措施就叫做熔断。
1. 服务发现:服务注册:保存服务提供者和服务调用者的信息服务订阅:服务调用者订阅服务提供者的信息,注册中心向订阅者推送提供者的信息2. 服务配置:配置订阅:服务提供者和服务调用者订阅微服务相关的配置配置下发:主动将配置推送给服务提供者和服务调用者3. 服务健康检测检测服务提供者的健康情况,如果发现异常,执行服务剔除
====================基于RestTemplate================方式1:启动注册Bean@Bean public RestTemplate getRestTemplate() {return new RestTemplate();}搭配Nacos使用方式:@Autowiredprivate RestTemplate restTemplate;@Autowiredprivate DiscoveryClient discoveryClient;//从nacos注册列表里获取第一位服务注册的实例信息用.get(0),如果是多个实例就用 list来填充ServiceInstance serviceInstance =discoveryClient.getInstances(\"service-product\").get(0);String url = serviceInstance.getHost() + \":\" +serviceInstance.getPort();log.info(\">>从nacos中获取到的微服务地址为:\" + url);//通过restTemplate调用商品微服务Product product = restTemplate.getForObject(\"http://\" + url + \"/product/\
设置统一的全局阻断助器
限流常用算法1、固定窗口算法2、滑动窗口算法3、漏桶算法4、令牌桶算法
Sentinel 限流
熔断:熔断是指当下游服务器出现问题后会导致上游服务受牵连从而导致整条服务器链都崩溃,采取熔断措施在设定的时间周期内不在调用下游有问题的服务,等到了设定时间到期以后再去尝试调用,在窗口期时直接利用降级的方式指定当前服务中回调方法返回客户端
网关
异常数
三种熔断状态
1.添加nacosMaven依赖<!--nacos客户端--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency>2.在启动类上添加@EnableDiscoveryClient注解(专门用与注册发现)3.yml文件配置指向注册中心spring:cloud:nacos:discovery:server-addr: 127.0.0.1:8848
局部过滤器自定义
第1步: 点击簇点链路,我们就可以看到访问过的接口地址,然后点击对应的流控按钮,进入流控规则配置页面。新增流控规则界面如下:资源名:唯一名称,默认是请求路径,可自定义针对来源:指定对哪个微服务进行限流,默认指default,意思是不区分来源,全部限制阈值类型/单机阈值:QPS(每秒请求数量) : 当调用该接口的QPS达到阈值的时候,进行限流线程数:当调用该接口的线程数达到阈值的时候,进行限流是否集群:暂不需要集群
route维度
common公共模块存放所有实体类
GatewayFilter全局过滤器(对权限校验,安全性校验)
分布式事物Seata
注册服务Nacos
Warm Up:它从开始阈值到最大QPS阈值会有一个缓冲阶段,一开始的阈值是最大QPS阈值的1/3,然后慢慢增长,直到最大阈值,适用于将突然增大的流量转换为缓步增长的场景。
具体实现方式
<dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-spring-cloud-gateway-adapter</artifactId></dependency>
降级规则
1.添加nacosMaven依赖<!--nacos客户端--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency>2.在启动类上添加@EnableDiscoveryClient注解(专门用于注册发现)3.yml文件配置指向注册中心spring:cloud:nacos:discovery:server-addr: 127.0.0.1:8848
链路流控模式指的是,当从某个接口过来的资源达到限流条件时,开启限流。它的功能有点类似于针对来源配置项,区别在于: 针对来源是针对上级微服务,而链路流控是针对上级接口,也就是说它的粒度更细。
断言
直接模式
流控规则
负载均衡OpenFeign
==========执行流程============1. Gateway Client向Gateway Server发送请求2. 请求首先会被HttpWebHandlerAdapter进行提取组装成网关上下文3. 然后网关的上下文会传递到DispatcherHandler,它负责将请求分发给RoutePredicateHandlerMapping4. RoutePredicateHandlerMapping负责路由查找,并根据路由断言判断路由是否可用5. 如果过断言成功,由FilteringWebHandler创建过滤器链并调用6. 请求会一次经过PreFilter--微服务--PostFilter的方法,最终返回响应
1.当接入了getway和skywaking时,从客户端发起的请求经过了网关然后到达了某个服务上,在这个过程中skywaking是不会开启请求日志记录的需要修改2.如果想要将skywaking记录的日志持久化时在skywaking的配置文件里设置好数据库链接,用户名以及密码,保存即可,然后需要找一个能够链接数据库的jar包放入agent/plugins目录下
快速失败(默认) : 直接失败,抛出异常,不做任何额外的处理,是最简单的效果
User服务 端口:8071服务名称service-user
====================隔离=================== 它是指将系统按照一定的原则划分为若干个服务模块,各个模块之间相对独立,无强依赖。当有故障发生时,能将问题和影响隔离在某个模块内部,而不扩散风险,不波及其它模块,不影响整体的系统服务。常见的隔离方式有:线程池隔离和信号量隔离.
服务配置
NACOS注册中心
User服务的Nacos注册效果图省略
流量控制,其原理是监控应用流量的QPS(每秒查询率) 或并发线程数等指标,当达到指定的阈值时对流量进行控制,以避免被瞬时的流量高峰冲垮,从而保障应用的高可用性
Getway网关
Sentinel 限流,容错
Product商品服务端口:8081服务名称:service-product
===================降级===================== 降级其实就是为服务提供一个托底方案,一旦服务无法正常调用,就使用托底方案。
熔断开启状态(Open) 后续对该服务接口的调用不再经过网络,直接执行本地的fallback方法
熔断关闭状态(Closed) 服务没有故障时,熔断器所处的状态,对调用方的调用不做任何限制
负载均衡策略
容错方案
关联模式
授权规则
=================基于openfeign=====================1.引入依赖<!--fegin组件--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>2.启动类添加注解@EnableFeignClients//开启Fegin3.创建被调用服务的接口service//比如用户服务调用商品服务@FeignClient(\"service-product\")public interface ProductService {//指定调用提供者的哪个方法//@FeignClient+@GetMapping 就是一个完整的请求路径 http://serviceproduct/product/{pid}@GetMapping(value = \"/product/{pid}\")Product findByPid(@PathVariable(\"pid\") Integer pid); (必须指明参数修饰)}//在controller中//准备买1件商品@GetMapping(\"/order/prod/{pid}\")public Order order(@PathVariable(\"pid\") Integer pid) {log.info(\
当资源近 1 分钟的异常数目超过阈值之后会进行服务降级。注意由于统计时间窗口是分钟级别的,若时间窗口小于 60s,则结束熔断状态后仍可能再进入熔断状态。
熔断降级
Product服务开启限流,容错
半熔断状态(Half-Open) 尝试恢复服务调用,允许有限的流量调用该服务,并监控调用成功率。如果成功率达到预期,则说明服务已恢复,进入熔断关闭状态;如果成功率仍旧很低,则重新进入熔断关闭状态
Nacos配置中心
=====================超时================== 在上游服务调用下游服务的时候,设置一个最大响应时间,如果超过这个时间,下游未作出反应,就断开请求,释放掉线程
收藏
收藏
0 条评论
下一页