当前位置:   article > 正文

微服务(alibaba系列)必备架构nacos、seata、sentinel理论了解_nacos sentinel seta 各自职责

nacos sentinel seta 各自职责

1.Nacos

官网地址:home

文档地址:什么是 Nacos

nacos支持dubbo和spring-cloud。主要常用的功能是承担注册中心和配置中心的功能

注册中心:是微服务的必须的依靠

配置中心:可以把一些代码yml或者其他配置文件的内容配置到nacos中保存,当nacos中的配置信息发生改变,nacos自带动态刷新。不用重启微服务就能使配置生效

各种注册中心比较:

服务注册框架CAP模型web控制台
eurekaAP支持
zookeeperCP不支持
consulCP支持
nacosAP/CP(支持切换)支持

C:Consistency(强一致性)

A:Availability(可用性)

P:Partition tolerance(分区容错性)

当前微服务注册中心都会支持分区容错性

下载启动后可以通过 http://localhost:8848/nacos 直接访问  默认账户密码都是nacos

Nacos默认自带的是嵌入式数据库derby ruguo  需要做更加安全 的持久化配置可以修改nacos\conf下的配置文件修改为mysql连接信息

集群搭建了解(以下为官网架构图)

首先在三台nacos中配置好三台各自的集群信息,然后实际上就是通过nginx代理  负载均衡三台nacos

在项目代码中只需要向nginx地址注册服务信息即可

2.Seata

官网地址:Seata

文档地址:Seata 是什么

seata是用于解决分布式事务的数据一致性问题的框架。在我们的微服务中多个业务模块微服务甚至多个数据库的互相调用,如果发生异常则无法控制其他微服务的数据回滚。这个时候需要一个能统一控制微服务之间的调用事物协调的框架Seata。(单机版无分布式事务问题)

主要组件

Transaction ID全局唯一的事务ID+TC、TM、RM三个组件

TC - 事务协调者:维护全局和分支事务的状态,驱动全局事务提交或回滚。

TM - 事务管理器:定义全局事务的范围:开始全局事务、提交或回滚全局事务。

RM - 资源管理器:管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。

官网处理过程图形

使用:通过官网文档集成到项目中之后,只需要在service层方法上打一个注解 @GlobalTransactional

3.Sentinel

官网地址:https://github.com/alibaba/Sentinel

文档地址:https://github.com/alibaba/Sentinel/wiki/%E4%BB%8B%E7%BB%8D

Sentinel: 分布式系统的流量防卫兵

Sentinel 是什么?

随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。(官网原话)

Sentinel 具有以下特征:

丰富的应用场景: Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、实时熔断下游不可用应用等。

完备的实时监控: Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。

广泛的开源生态: Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。

完善的 SPI 扩展点: Sentinel 提供简单易用、完善的 SPI 扩展点。您可以通过实现扩展点,快速的定制逻辑。例如定制规则管理、适配数据源等。

集成代码

不使用前端控制台,直接在项目中使用

(注意在生成中使用java  -Dcsp.sentinel.log.dir=/var/log/sentinel/  可以避免sentinel默认将日志输出到root/logs/下导致磁盘容量满)

pom

  1. <!-- sentinel依赖-->
  2. <dependency>
  3. <groupId>com.alibaba.cloud</groupId>
  4. <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
  5. <version>2.2.4.RELEASE</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>org.springframework.boot</groupId>
  9. <artifactId>spring-boot-starter-actuator</artifactId>
  10. </dependency>

yml

  1. spring:
  2. application:
  3. prefix: demo
  4. name: ${spring.application.prefix}-admin-web
  5. cloud:
  6. sentinel:
  7. transport:
  8. post: 8722 #跟控制台交流的端口,随意指定一个未使用的端口即可
  9. dashboard: localhost:8080 #控制台地址

config类

  1. @Configuration
  2. public class SentinelConfig{
  3. @Bean
  4. public SentinelResourceAspect sentinelResourceAspect() {
  5. return new SentinelResourceAspect();
  6. }
  7. @PostConstruct
  8. private void initRules() {
  9. //=============================规则1=========================
  10. MyFlowRule rule1 = new MyFlowRule();
  11. rule1.setResource("rule1");//规则名称
  12. rule1.setGrade(RuleConstant.FLOW_GRADE_QPS);//如果设置0则按照线程数限流,如果设置1则按照QPS(每秒查询率)限流
  13. rule1.setCount(10); // 每秒调用最大次数为 10 次
  14. rule1.setControlBehavior(2)//0快速失败,1预警,2排队等候
  15. rule1.setMaxQueueingTimeMs(1000);//排队超时阈值
  16. //还有其他规则可在官网查看
  17. //=============================规则2=========================
  18. MyFlowRule rule2 = new MyFlowRule();
  19. rule2.setResource("rule2");
  20. rule2.setGrade(RuleConstant.FLOW_GRADE_QPS);
  21. rule2.setCount(10); // 每秒调用最大次数为 10 次
  22. List<FlowRule> rules = new ArrayList<>();
  23. rules.add(rule1);
  24. rules.add(rule2);
  25. // 将控制规则载入到 Sentinel
  26. FlowRuleManager.loadRules(rules);
  27. }
  28. }

ps:

value:配置类中的规则名称,上面代码用的"rule1"规则,每秒钟限制10次访问,
超过10次则默认快速失败即抛出异常

设置排队等候即上述配置类中的

  1. rule1.setControlBehavior(2)
  2. rule1.setMaxQueueingTimeMs(1000);

接口中使用配置规则名称

  1. @Log
  2. @ApiOperation(value = "分页查询")
  3. @GetMapping("page")
  4. @SentinelResource(value = "rule1",blockHandler = "sentinelBlockHandler")
  5. public Object page(String query) {
  6. FindWrapper<SjkshTableVo> fw = getWrapper(query, SjkshTableVo.class);
  7. IPage<SjkshTableDto> page = sjkshTableMgr.page(fw);
  8. return build(page, LIST);
  9. }
  10. public String sentinelBlockHandler(String s, int i, BlockException blockException) {
  11. return "hello BlockHandler";
  12. }


 

可视化控制台

可用控制台配置熔断降级规则


下载运行

https://github.com/alibaba/Sentinel/releases 下载运行jar

简单运行

java -jar sentinel-dashboard-1.7.1.jar  运行

访问sentinel管理界面   http://localhost:8080  登录账户密码均为 sentinel

自定义运行

java -Dserver.port=8181 -Dcsp.sentinel.dashboard.server=localhost:8181

-Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.0.jar

其中,-Dserver.port=8181 代表sentinel控制台项目的端口号,

-Dcsp.sentinel.dashboard.server=localhost:8181 代表本看板服务将会注册到自己的看板上,

-Dproject.name=sentinel-dashboard代表本看板服务的项目名称。

访问localhost:8181;用户名,密码均是sentinel

如果要自定义用户名和密码,在启动命令加上-Dsentinel.dashboard.auth.username=sentinel,
-Dsentinel.dashboard.auth.password=123456即可。

web可视化界面

流量控制:

        阈值类型:

                 可以通过新增某个接口的流量控制 

                  QPS(每秒请求数量):当前调用api的QPS达到阈值进行限流

                  线程数:当前调用api的线程数达到阈值进行限流

         流控模式:

                   直接:api自己到阈值条件,直接限流

                   关联:当关联资源达到阈值就限流自己

                   链路:指定调用链路上的流量达到阈值就限流

          流控效果:

                    快速失败:直接提示失败

                    warm up: 根据codeFactor(冷加载因子,源码中默认3),从阈值/codeFactor,经过预热时长,才慢慢达到                                         阈值

                     排队等待:字面意思排队等待

直接通过web控制台新增流控配置

降级熔断:

热点参数限流: 资源名使用@SentinalResource的属性取名(注意所有的sentinal控制台配置出错都走这个注解)

系统自适应限流:

持久化:把限流配置保存在Nacos的配置中心中就可以做到持久化,当服务重启,接口资源被重新调用过一次之后,就会出现在sentinal的控制台限流规则中

使用一下maven和配置

  1. <!-- SpringCloud ailibaba sentinel-datasource-nacos 持久化需要用到-->
  2. <dependency>
  3. <groupId>com.alibaba.csp</groupId>
  4. <artifactId>sentinel-datasource-nacos</artifactId>
  5. </dependency>
  1. spring:
  2. cloud:
  3. sentinel:
  4. transport:
  5. #配置Sentin dashboard地址
  6. dashboard: localhost:8080
  7. # 默认8719端口,假如被占用了会自动从8719端口+1进行扫描,直到找到未被占用的 端口
  8. port: 8719
  9. datasource:
  10. ds1:
  11. nacos:
  12. server-addr: localhost:8848
  13. dataId: sentinel-service
  14. groupId: DEFAULT_GROUP
  15. data-type: json
  16. rule-type: flow

  • resource:资源名
  • limitApp:流控针对的调用来源,default不区分来源
  • grade:限流阈值类型(0-根据并发数量来限流 1-根据QPS来进行流量控制)
  • count:限流阈值
  • strategy:调用关系限流策略
  • controlBehavior:流量控制效果(直接拒绝、WarmUP、匀速排队)
  • clusterMode:是否集群模式

注解简绍:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码探险家/article/detail/813893
推荐阅读
相关标签
  

闽ICP备14008679号