微服务之间的通讯安全(五)-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服务,多次快速请求,控制台结果如下,可以看到每秒钟,只有一个我们保护的资源被执行了。

  

3、Sentinel日志

  3.1、业务日志(${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

猜你喜欢

转载自www.cnblogs.com/caofanqi/p/12296278.html
jwt
今日推荐