Skip to content

Commit

Permalink
补充完成责任链的笔记
Browse files Browse the repository at this point in the history
  • Loading branch information
fatpo committed Dec 5, 2020
1 parent 7838333 commit 47dbe87
Showing 1 changed file with 178 additions and 6 deletions.
184 changes: 178 additions & 6 deletions source/_posts/设计模式之责任链.md
Original file line number Diff line number Diff line change
Expand Up @@ -112,15 +112,187 @@ class FilterChain implements Filter{
}
```

# 推荐项目接入责任链
# 推荐项目接入责任链 之 过滤器

上面那个 demo 其实对我想要的业务需求,没什么卵用,真的打算接入的时候,spring 里面不好接入,失败。

不过我们项目的各种过滤器,确实用到了上面 demo 的责任链:
我们项目的各种过滤器,确实用到了上面 demo 的责任链:
```dtd
曝光过滤 -> 最近推荐过滤 -> 正排过滤 -> 负反馈过滤 -> 业务方指定内容过滤 ...
```

代码和上面的 demo 大同小异,就不赘言。

我要的
# 推荐项目接入责任链 之 主流程改造

代码是照着 java 的 filter+filterChain 改造的:
```dtd
https://docs.oracle.com/javaee/7/api/toc.htm
```

经过几天的改造,大概实现了主流程的设计模式,暂时无尿性,全流程测试正常,压测正常。

先定义好工作结点:
```java
public interface TaskNode {
boolean doTask(RecomReq req, RecomRsp rsp, RecomConfig config, TaskNodeChain chain);
}
```

在定义好工作结点链:
```java

import java.util.ArrayList;
import java.util.List;

public class TaskNodeChain {
List<TaskNode> tasks = new ArrayList<>();
int pos = 0;

/**
* 把工作节点导入责任链中
*
* @param node 工作节点
* @return 当前责任链(可链式编程)
*/
public TaskNodeChain addNode(TaskNode node) {
tasks.add(node);
return this;
}

public void doTask(RecomReq req, RecomRsp rsp, RecomConfig config) {
if (pos == tasks.size()) {return;}
TaskNode node = tasks.get(pos);
pos ++;

node.doTask(req, rsp, config, this);
}
}
```

定义具体的工作结点,降级服务:
```java
import org.springframework.stereotype.Service;

@Service
public class DownGradeTaskNode implements TaskNode {
@Override
public boolean doTask(RecomReq req, RecomRsp rsp, RecomConfig config, TaskNodeChain chain) {
// 判断是否需要降级
if (isNeedDownGrade()) {
// false 表示中断后续的责任链,这里返回即可
return false;
}

// 把球传给责任链中的下个节点
chain.doTask(req, rsp, config);
return true;
}

private boolean isNeedDownGrade() {
return true;
}
}

```

定义具体的工作结点,用户结果缓存服务:
```java

import org.springframework.stereotype.Service;

@Service
public class ResultCacheTaskNode implements TaskNode{
@Override
public boolean doTask(RecomReq req, RecomRsp rsp, RecomConfig config, TaskNodeChain chain) {
// 判断是否需要降级
if (canRunCache()){
// false 表示中断后续的责任链,这里返回即可
return false;
}

// 把球传给责任链中的下个节点
chain.doTask(req, rsp, config);


// 更新用户结果缓存
updateResultCache();

return true;
}

private boolean canRunCache(){
return true;
}


private void updateResultCache(){
;
}
}
```

定义具体的工作结点,热度兜底服务:
```java
import org.springframework.stereotype.Service;

@Service
public class FallbackTaskNode implements TaskNode{
@Override
public boolean doTask(RecomReq req, RecomRsp rsp, RecomConfig config, TaskNodeChain chain) {
// do 热度兜底的业务逻辑 fallback
// 返回 false 表示不能有后续结点了
return false;
}
}
```
定义具体的工作结点,真正的推荐服务:
```java
import org.springframework.stereotype.Service;

@Service
public class RecommendTaskNode implements TaskNode {
@Override
public boolean doTask(RecomReq req, RecomRsp rsp, RecomConfig config, TaskNodeChain chain) {
// 真正推荐业务逻辑
// do recommend()l

// 把球传给责任链中的下个节点
chain.doTask(req, rsp, config);
return true;
}
}
```


最后定义的控制责任链的逻辑结点:
```java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class ApiControlChain {

@Autowired
private DownGradeTaskNode downGradeTaskNode;

@Autowired
private ResultCacheTaskNode resultCacheTaskNode;

@Autowired
private FallbackTaskNode fallbackTaskNode;

@Autowired
private RecommendTaskNode recommendTaskNode;

public void doRecommend(RecomReq req) {
TaskNodeChain chain = new TaskNodeChain();

// 定值责任链的节点顺序,有些业务 chain 可能要用户缓存,有些可能不需要,有些要热度兜底,有些不需要
chain.addNode(downGradeTaskNode)
.addNode(resultCacheTaskNode)
.addNode(recommendTaskNode)
.addNode(fallbackTaskNode);

// 开始推荐
chain.doTask(req, new RecomRsp(), new RecomConfig());
}
}
```

0 comments on commit 47dbe87

Please sign in to comment.