1.引言
在sentinel的流控规则,与授权规则中,都提供了来源区分。
比如流控规则:这里的针对来源,表示针对哪些调用来源进行限流
- 默认值default表示不区分来源,即任何调用来源都限流
- 如果需要指定来源进行限流,比如说调用端有:app、pc
- 针对app调用要限流,针对pc调用不限流,该如何实现呢?
- 需要注意:sentinel默认是只认default,其它不认识!!!

比如授权规则:这里流控应用,表示针对哪些应用调用需要授权,或者禁止
- 配合选择白名单,表示流控应用中指定的应用,允许访问
- 配合选择黑名单,表示流控应用中指定的应用,不允许访问
- 需要注意:sentinel默认是不提供来源区分,因此授权规则默认情况下用不了
- 那如果需要使用授权规则,该如何实现呢?

2.扩展RequestOriginParser
要想实现流控规则中的针对来源,以及授权规则中指定流控应用。sentinel给我们提供了一个接口
java
public interface RequestOriginParser {
String parseOrigin(HttpServletRequest var1);
}
我们只需要扩展RequestOriginParser接口,即可实现区分来源的业务场景需求,要实现区分来源,得有来源标识,这里我有两个建议
- http请求参数中,传递来源标识
- http请求头中,传递来源标识
在实际项目中,我建议从http请求头中,传递来源标识,这样会让请求更加优雅一些!放到请求参数中,会使得请求参数稍微难堪!比如这样的:http://ip:port/shop/add?origin=app,非要加【?origin=app】这一段来传递来源标识,丑陋,非常丑陋!
但是在我的这个案例中,为了演示方便,我还是选择丑陋的方式了,小伙伴们谅解!
java
@Component
public class MyRequestOriginParser implements RequestOriginParser {
/**
* 解析来源
* @param request
* @return
*/
public String parseOrigin(HttpServletRequest request) {
// 1.这里从请求参数中获取origin(实际应用中,建议从http请求头获取更佳!)
String origin = request.getParameter("origin");
return origin;
}
}
3.测试效果
启动应用,分别测试流控规则针对来源,以及授权规则,看看效果吧!
3.1.流控规则
配置流控规则,指定流控规则来源app

访问端点:http://127.0.0.1:8080/sentinel/grade/1?origin=app,疯狂刷新,流控了!
访问端点:http://127.0.0.1:8080/sentinel/grade/1?origin=pc,疯狂刷新,没有发生流控!
3.2.授权规则
配置授权规则,指定流控应用:app,并选择白名单,表示只允许app端访问

访问端点:http://127.0.0.1:8080/sentinel/grade/1?origin=app,可以正常访问!
访问端点:http://127.0.0.1:8080/sentinel/grade/1?origin=pc,禁止访问,提示没有授权!
shell
{"status":500,"msg":"error,没有访问权限!"}
提前友情提示:原计划我们下一篇要分享【扩展sentinel之支持restful url】,因在sentinel新的版本中,已经支持了restful 风格url,那么该篇文章我们就省略了。
有小伙伴可能会有疑问,什么是restful风格url?
- 在sentinel早先版本中,应该是1.6以前版本,会把具体的请求url作为资源
- 比如说:http://127.0.0.1:8080/sentinel/grade/1;http://127.0.0.1:8080/sentinel/grade/2会被当做两个资源
- 而其实我们期望的资源,应该是:http://127.0.0.1:8080/sentinel/grade/{userId},这样的
- 那么在新版本中,我们这里使用的是1.8版本,它已经是我们期望的了
- 如果有小伙伴使用早期版本,或者说感兴趣,可以参考sentinel提供的接口UrlCleaner