全部产品

故障排查之限流

更新时间:2020-10-09 15:09:46

本文汇总梳理了限流功能使用过程中遇到的常见问题,主要内容如下:

熔断限流没有效果

解决步骤如下:

  1. 确认 SOFA 的版本 ≥ 3.3.0。
  2. 接入动态配置客户端和限流熔断
    1. <dependency>
    2. <groupId>com.alipay.sofa</groupId>
    3. <artifactId>ddcs-enterprise-sofa-boot-starter</artifactId>
    4. </dependency>
    5. <dependency>
    6. <groupId>com.alipay.sofa</groupId>
    7. <artifactId>guardian-sofa-boot-starter</artifactId>
    8. </dependency>
  3. 确认客户使用的 REST 协议的限流方式,步骤如下:

    1. 检查代码的编写,验证 Facade 接口、实现类和 XML 配置。接口定义如下:接口.png
    2. XML 中配置实现类的bean,同时发布 REST 协议的服务。xml配置.png
  4. 将应用部署到 CAFE 进行测试,步骤如下:

    1. 部署完成,通过查看 Guardian 的 guardian-default.log 日志文件,确认 Guardian 组件已经成功注册。guardian-log.png
    2. 在 SOFA 控制台配置具体的限流条件:配置的应用名称必须和 applicatioin.properties 中的spring.application.name 值一致。配置值.png
    3. 配置完成以后,需要重新启动限流熔断的开关,然后,通过查看 Guardian 的 guardian-default.log 日志文件确认应用程序成功打印了配置信息的日志,如下所示:日志打印.png
    4. 确认以上信息无误后,在浏览器进行访问,验证效果。可通过 guardian-limit-stat.log 查看成功通过的请求。stat日志.png

在配置的 logs 文件夹下没有限流日志文件目录

在启动类中添加自定义路径,限流的日志文件,将在设置的目录生成。示例如下:
System.setProperty("user.home","/tmp/localfile")

熔断限流 REST + AOP 使用中间件注意事项

主要是使用 rest-enterprise-sofa-boot-starterrpc-enterprise-sofa-boot-starter 时的注意事项。

  1. 引入上述中间件时,都还需要引入下述依赖:

    1. <dependency>
    2. <groupId>com.alipay.sofa</groupId>
    3. <artifactId>ddcs-enterprise-sofa-boot-starter</artifactId>
    4. </dependency>
    5. <dependency>
    6. <groupId>com.alipay.sofa</groupId>
    7. <artifactId>guardian-sofa-boot-starter</artifactId>
    8. </dependency>
  2. 引入 rpc-enterprise-sofa-boot-starter时,还需要引入下述依赖,否则限流不起作用。

    1. <dependency>
    2. <groupId>org.springframework.boot</groupId>
    3. <artifactId>spring-boot-autoconfigure</artifactId>
    4. </dependency>
    5. <dependency>
    6. <groupId>com.alipay.sofa</groupId>
    7. <artifactId>tracer-enterprise-sofa-boot-starter</artifactId>
    8. </dependency>
    • 如果不引入 tracer,限流日志报如下错误:报错日志.png
    • 如果只引入 tracer 的依赖,未引入自动配置的依赖,则报下述错误:报错日志2.png
  3. 无论引入哪个依赖 定义接口的时候 需要自定义一个异常,一个异常处理器,用于限流成功后抛出异常,并且把异常处理结果返回给前端。A376CE61-91D6-42E6-8758-0A379E9D4994.png

限流支持哪些客户端场景?

目前主要支持下述几种客户端:

  • Spring MVC

    • 代码侵入:无
    • 限流方法:Web URL
  • SOFA RPC Bolt

    • 代码侵入:无
    • 限流方法:接口方法
  • 普通 Spring Bean

    • 代码侵入:结合 AOP
    • 限流方法:接口方法

不支持以下客户端:

  • SOFA RPC REST

    • 代码侵入:无
    • 限流方法:接口方法 / Web URL
  • SOFA REST(RESTEASY)

    • 代码侵入:无
    • 限流方法:接口方法 / Web URL

当前,对于SOFA REST,只能通过 AOP 的方式去拦截 REST 对应的 bean 来实现限流,示例如下:

  1. 设计要拦截的接口方法,示例如下:
    1. @Path(URLConstants.REST_API_PEFFIX + "/users")
    2. @Consumes(RestConstants.DEFAULT_CONTENT_TYPE)
    3. @Produces(RestConstants.DEFAULT_CONTENT_TYPE)
    4. public interface SampleRestFacade {
    5. @GET
    6. @Path("/{userName}")
    7. public RestSampleFacadeResp<DemoUserModel> userInfo(@PathParam("userName") String userName) throws CommonException;
    8. }
  2. 定义 bean,示例如下:
    1. <bean id="sampleRestFacadeRest" class="com.hula.sofa.demos.guardian.endpoint.impl.SampleRestFacadeRestImpl"/>
  3. AOP 配置,示例如下:
    1. <import resource="classpath:META-INF/spring/guardian-sofalite.xml" />
    2. <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
    3. <property name="interceptorNames">
    4. <list>
    5. <value>guardianExtendInterceptor</value>
    6. </list>
    7. </property>
    8. <property name="beanNames">
    9. <list>
    10. <!-- 配置需要被拦截的 bean -->
    11. <value>sampleRestFacadeRest</value>
    12. </list>
    13. </property>
    14. <!-- 如要使用 CGLIB 代理,取消下面这行的注释 -->
    15. <!-- <property name="optimize" value="true" /> -->
    16. </bean>
  4. 限流界面配置,示例如下:限流界面配置.png