微服务之间的通讯安全(五)-JWT优化之日志、错误处理、限流及JWT改造后执行流程梳理
1、Sentinel是什么
Sentinel是阿里巴巴在2018年开源的面向分布式服务架构的轻量级流量控制组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统负载保护等多个维度来帮助您保障微服务的稳定性。
Sentinel里面涉及两个基本概念:资源和规则。a、资源是 Sentinel 的关键概念。它可以是 Java 应用程序中的任何内容,例如,由应用程序提供的服务,或由应用程序调用的其它应用提供的服务,甚至可以是一段代码。只要通过 Sentinel API 定义的代码,就是资源,能够被 Sentinel 保护起来。b、围绕资源的实时状态设定的规则,可以包括流量控制规则、熔断降级规则以及系统保护规则。所有规则可以动态实时调整。
Sentinel的使用可以分为两个部分:核心库 (Java客户端)和控制台(Dashboard)。a、核心库不依赖任何框架/库,能够运行与Java7以上的版本,对SpringCloud/Dubbo等框架也有较好的支持。b、控制台主要负责管理推送规则、监控、集群限流分配管理、机器发现等。
2、Sentinel客户端限流demo(以订单微服务为例)
2.1、在引入Sentinel依赖
<dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-core</artifactId> <version>1.7.1</version> </dependency>
2.2、定义资源,createOrder为资源名称,这是使用编码方式,也支持注解方式。
2.3、定义规则,createOrder资源规则为每秒QPS为1
/** * Sentinel 规则创建,实现ApplicationListener监听ContextRefreshedEvent,系统启动完成后就会执行 * * @author caofanqi * @date 2020/2/11 15:50 */ @Component public class SentinelConfig implements ApplicationListener<ContextRefreshedEvent> { @Override public void onApplicationEvent(ContextRefreshedEvent event) { List<FlowRule> rules = new ArrayList<>(); FlowRule rule = new FlowRule(); //设置资源名 rule.setResource("createOrder"); //根据QPS进行限流 rule.setGrade(RuleConstant.FLOW_GRADE_QPS); // 设置每秒只能有一个请求通过. rule.setCount(1); rules.add(rule); FlowRuleManager.loadRules(rules); } }
2.4、启动认证服务器,订单服务器,进行测试。
这里测试不用通过网关访问,直接访问order服务,多次快速请求,控制台结果如下,可以看到每秒钟,只有一个我们保护的资源被执行了。
${user_home}/logs/csp/sentinel-record.log.xxx),可以看到我们设置的规则
3.2、拦截详情日志(${user_home}/logs/csp/sentinel-block.log),无论触发了限流、熔断降级还是系统保护,它们的秒级拦截详情日志都在这里。如果没有发生拦截,则该日志不会出现。
格式如:(2014-06-20 16:35:10|1|sayHello(java.lang.String,long),FlowException,default,origin|61,0),依次含义为:2014-06-20 16:35:10为时间戳;1为该秒发生的第一个资源;sayHello(java.lang.String,long)为资源名称;xxxException为拦截的原因, 通常 FlowException 代表是被限流规则拦截,DegradeException 则表示被降级,SystemBlockException 则表示被系统保护拦截;default为生效规则的调用来源(参数限流中代表生效的参数);origin被拦截资源的调用者,可以为空;61,0,61 被拦截的数量,0无意义可忽略;
3.3、秒级监控日志(${user_home}/logs/csp/${app_name}-${pid}-metrics.log),所有的资源都会产生秒级日志。内容由 I 分隔开,含义依次为,时间戳、格式化之后的时间戳、资源名、通过的请求、被阻止的请求、成功执行完成的请求个数、异常的数量、资源的平均响应时间。最后面的三组无意义。
4、Sentinel控制台(dashboard)的使用
4.1、启动控制台
4.1.1、获取 Sentinel 控制台,从https://github.com/alibaba/Sentinel/releases页面下载最新版本jar包
4.1.2、使用命令 java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar 启动控制台,-Dserver.port=8080 用于指定 Sentinel 控制台端口为 8080,对控制台本身加入了流量控制功能, -Dcsp.sentinel.dashboard.server=localhost:8080 向 Sentinel 接入端指定控制台的地址,-Dproject.name=sentinel-dashboard 向 Sentinel 指定应用名称。默认的用户名密码都是sentinel,如果想要指定,可以通过-Dsentinel.dashboard.auth.username=指定用户名,-Dsentinel.dashboard.auth.password=指定密码。
访问项目地址http://localhost:8080/,登陆后如下,其中应用列表中只有sentinel-dashboard是它自己。
4.2、客户端接入控制台
4.2.1、客户端应用引入jar包
<dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-transport-simple-http</artifactId> <version>1.7.1</version> </dependency>
4.2.2、配置启动参数,应用启动时加入 JVM 参数 -Dcsp.sentinel.dashboard.server=consoleIp:port 指定控制台地址和端口。
4.2.3、触发客户端初始化,确保客户端有访问量,Sentinel 会在客户端首次调用的时候进行初始化,开始向控制台发送心跳包。我们这里启动后,在执行一次创建订单的请求。控制台收到客户端心跳包之后,会在左侧导航栏中显示该客户端信息。如果控制台能够看到客户端的机器信息,则表明客户端接入成功了。
簇点链路中显示刚刚调用的资源
"实时监控"汇总资源信息,同一个服务下的所有机器的簇点信息会被汇总,并且秒级地展示在"实时监控"下
在流控规则中,可以看到我们配置的规则
5、Sentinel对SpringCloud的支持
5.1、将之前导入的两个依赖替换为spring-cloud-starter-alibaba-sentinel
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> <version>0.9.0.RELEASE</version> </dependency>
5.2、将jvm启动参数去掉,在配置文件中进行配置
spring: application: name: order-server cloud: sentinel: transport: #会在应用对应的机器上启动一个Http Server,该Server会与Sentinel控制台做交互。 #比如Sentinel控制台添加了一个限流规则,会把规则数据push给这个Http Server接收,Http Server再将规则注册到Sentinel中。 port: 8719 #Sentinel控制台地址 dashboard: localhost:8080
5.3、启动项目,与之前的效果相同
项目源码:https://github.com/caofanqi/study-security/tree/dev-sentinel1