一、责任链模式
为了避免请求发送者与多个请求处理者耦合在一起,于是将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。
二、责任链模式应用场景
网关权限控制责任链模式
在网关作为微服务程序的入口,拦截客服端所有的请求实现权限控制,比如先判断api接口限流、黑名单、用户会话、参数过滤。
API接口限流-》黑名单拦截-》用户会话-》参数过滤
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/f65d88200c1f4e4686f920417af1c12a.png
代码实现:
1、项目结构
2、责任链抽象类(核心)
public abstract class GatewayHandler {
/**
* 下一个handler
*/
protected GatewayHandler nextGatewayHandler;
/**
* 使用抽象定义共同方法的行为
*/
public abstract void service();
/**
* 设置下一个GatewayHandler
* @param nextGatewayHandler
*/
public void setNextGatewayHandler(GatewayHandler nextGatewayHandler){
this.nextGatewayHandler = nextGatewayHandler;
}
/**
* 执行下一个handler
*/
protected void nextService() {
if (nextGatewayHandler != null) {
nextGatewayHandler.service();
}
}
}
3、第一关:网关限流判断处理器
public class CurrentLimitHandler extends GatewayHandler {
@Override
public void service() {
System.out.println("第一关网关限流判断.....");
nextService();
}
}
4、第二关:黑名单拦截处理器
public class BlacklistHandler extends GatewayHandler {
@Override
public void service() {
System.out.println("第二关黑名单过滤.....");
nextService();
}
}
5、第三关:用户会话拦截
public class ConversationHandler extends GatewayHandler {
@Override
public void service() {
System.out.println("第三关用户会话拦截....");
}
}
6、工厂类
作用是把整个责任链串联起来,返回第一个
public class FactoryHandler {
public CurrentLimitHandler getFirstGatewayHandler() {
// 第一关
CurrentLimitHandler currentLimitHandler = new CurrentLimitHandler();
// 第二关
BlacklistHandler blacklistHandler = new BlacklistHandler();
currentLimitHandler.setNextGatewayHandler(blacklistHandler);
// 第三关
ConversationHandler conversationHandler =