zoukankan      html  css  js  c++  java
  • 微服务之间的通讯安全(五)-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

  • 相关阅读:
    centos 7 服务器网卡做bond
    python 函数参数
    python 文件操作
    Linux 150命令之 文件和目录操作命令 cd pwd cp mv touch
    创建https证书
    Linux 150命令之 文件和目录操作命令 ls
    zabbix 2.2.2 安装部署
    NTP错误总结
    NTP时间服务器
    150命令之线上查询及帮助命令 man hellp
  • 原文地址:https://www.cnblogs.com/caofanqi/p/12296278.html
Copyright © 2011-2022 走看看