Sentinel 入门实践


placeholder image
admin 发布于:2023-02-05 09:54:17
阅读:loading

1.背景介绍

Sentinel是面向云原生微服务的高可用流控防护组件。随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。

上面的定义说的太官方,太高端,总结为我的一句话就是Sentinel这块的知识细节太多,需要拿出月以计数的时间来了解掌握,甚至需要配合以年为单位来实践应用才能有深度,够专业的掌握,我这几天的学习和实践皮毛水平都达不到,所以自不量力的来一个小小范围的总结,也算是给本期学习的技术技能画个句号,这几个月的框架学习就先到这里结束。还是那句话,Sentinel组件的深度掌握过于复杂,好在官网文档都是有中文版的,Github项目地址:https://github.com/alibaba/Sentinel,官网地址:https://sentinelguard.io/zh-cn/index.html,值得多看看。

2.控制台下载安装

Github官网最新的Sentinel releases版本为v1.8.6(截至2023年2月5日),下载的jar为可执行文件,直接使用“java -jar sentinel-dashboard-1.8.6.jar”即可打开运行,默认的端口为8080,默认登录用户名和密码均为sentinel,参考如下图所示:

最新版下载

image.png

Sentinel控制台默认是懒加载,当没有请求到达时不显示接入的微服务,需要被接入的微服务上有请求访问后才会显示服务资源。当然,此时仅仅只有一个Sentinel控制台,还未介绍到其它微服务的接入,实际控制台项目的下载运行在本次实践的最初过渡,作为一个比较简单的入手实践的开始。

集群流控示例

看了看Github上Sentinel的项目源码结构,发现sentinel-demo中包含29个demo,示例还是比较丰富的,于是使用IDEA Clone了一份Sentinel项目源码在本地来熟悉熟悉(默认下载的项目源码为master分支,切换到release-1.8),直接运行sentinel-dashboard模块下的com.alibaba.csp.sentinel.dashboard.DashboardApplication程序,即可启动控制台,如同上述控制台的下载安装一致。 

集群限流只是Sentinel众多功能中的其中一块,在sentinel-demo模块下有sentinel-demo-cluster示例,该实例下又包含sentinel-demo-cluster-embedded和sentinel-demo-cluster-server-alone两个模块项目,分别是嵌入式的集群限流和独立部署的集群限流。

Sentinel 集群限流服务端有两种启动方式:独立模式(Alone),即作为独立的 token server 进程启动,独立部署,隔离性好,但是需要额外的部署操作。独立模式适合作为 Global Rate Limiter 给集群提供流控服务。嵌入模式(Embedded),即作为内置的 token server 与服务在同一进程中启动。在此模式下,集群中各个实例都是对等的,token server 和 client 可以随时进行转变,因此无需单独部署,灵活性比较好。但是隔离性不佳,需要限制 token server 的总 QPS,防止影响应用本身。嵌入模式适合某个应用集群内部的流控。

a57b1e318ba6d05be153eed3c47ba8bb_50463606-c3d26c00-09c7-11e9-8373-1c27e2408f8b.png

(独立模式)

32a93f62ee37d89128cbe00c82670570_50463600-b7e6aa00-09c7-11e9-9580-6919f0d0a8a4.png

(嵌入模式)

本次使用简单点的嵌入式集群流控来实践,运行com.alibaba.csp.sentinel.demo.cluster.app.ClusterDemoApplication类的main函数,同时调整启动JVM的参数,在IDEA中创建三个启动运行类,启动命令和运行方式参考如下:

-Dcsp.sentinel.log.use.pid=true -Dproject.name=sentinle.cluster.demo.embedded -Dserver.port=8083 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dcsp.sentinel.api.port=8283

-Dcsp.sentinel.log.use.pid=true -Dproject.name=sentinle.cluster.demo.embedded -Dserver.port=8084 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dcsp.sentinel.api.port=8284

-Dcsp.sentinel.log.use.pid=true -Dproject.name=sentinle.cluster.demo.embedded -Dserver.port=8085 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dcsp.sentinel.api.port=8285

image.png

启动完毕后分别请求这三个端口服务程序的地址:http://127.0.0.1:8083/hello/world、http://127.0.0.1:8084/hello/world和http://127.0.0.1:8085/hello/world,此时再访问http://localhost:8080/将可看到如下多个服务的界面:

image.png

(机器列表)

image.png

(集群流控--Token Server)

image.png

(集群流控--Token Client)

image.png

(新增/编辑Token Server)

image.png

(流控规则)

image.png

(簇点链路)


image.png

(编辑流控规则)

Token Server 最大允许 QPS为6,各个节点集群阈值为2时,开启9个或以上的浏览器窗口,限流效果也一样,总是前面6个访问正常,后面的被限流。控制台对应的异常信息为:

image.png

6个窗口3限流.gif

(开启6个窗口,限流3个,正常访问3个,访问限流3个)

当Token Server失联后Client也显示为未连接了,但是限流仍然生效。此时若重新运行失联的Token Server服务(本例为8283端口),别忘了先请求一下接口,触发被流控可以从机器列表中看到失联的机器又健康了。但是集群流控中的Token Server和Token Client列表仍然显示的未知或未连接状态。此时手动移除Token Server后,再重新新增后,可以看到Token Server和Client显示正常,参考下图:

image.png

(关闭8023服务,模拟宕机)

TokenServer关闭后.gif

(TokenServer关闭后)

最后的话

(1)Sentinel是一个巨大的开源项目,想要有深度的掌握必须要经过大量的时间和实践,个人这点点掌握连入门都达不到(比如我始终感觉集群流控哪里不对,怪怪的),再加上本篇文章是本次学习的技术体系的最后一篇文章了,难免有点糊弄自己;

(2)Sentinel Github release v1.8.6的源码下载,略有改动(只是增加了Controller的函数和Nacos的配置地址)下载:

链接:https://pan.baidu.com/s/11rtVUC7SStytcf8WgceHKA 

提取码:1x32



 点赞


 发表评论

当前回复:作者

 评论列表


留言区