管道模式的妙用

Posted on Tue 09 June 2020 in Tech

GoF 的大作 “设计模式:可重用面向对象软件的基础”是软件工程界中的不朽名著,模式是人们用来讨论问题和解决方案的。 模式记录了那些重复出现的问题,成因和相应的解决方案。

Christopher Alexander 在模式语言中对模式的定义如下:

每个模式都是一个法则,由三部分组成,它表现为一种特定的上下文, 一个问题和一个解决方案之间的关系。

回顾一下管道模式,在计算机世界最熟悉的莫过于一条竖线,将上一条命令的输出和下一条命令的输入联系了起来,妙用无穷。

例如,找出spring 框架中代码行数最多的10个文件

find . -type f -name *.java| grep -v "src/test" | xargs wc -l | grep -v " total" |sort -n |tail -10

  • 查找 java 文件
  • 过滤掉测试文件
  • 统计文件行数
  • 过滤掉 wc -l 输出的 “n total” 行
  • 按每一行开头的数字排序
  • 找出最大的11 条
  • 找出最前面的10条

在一条管道里可以做什么?能做的事可太多了:

  • 过滤
  • 转换
  • 排序/比较
  • 限定
  • 等等

应用: * Web 应用常用的拦截器/过滤器,在请求被处理之前和之后拦截并操作一个请求和它的响应。 javax.servlet.Filter, 在Spring 中把它扩展成 Filter Chain

  • Netty 中大量应用的 channel pipeline

netty-channel-pipeline

  • JDK stream API
int sum = widgets.stream()
        .filter(b -> b.getColor() == RED)
        .mapToInt(b -> b.getWeight())
        .sum();
  • Spring integration pipeline 中的若干组件
  • 通道 channel
  • 过滤器 filter
  • 转换器 transformer
  • 路由器 router
  • 切分器 splitter
  • 聚合器 aggregator
  • 服务激活器 service activator
  • 通道适配器 channel adapter
  • 网关 gateway

  • Spring Cloud Netflix Zuul

zuul-core-architecture

Zuul 中定义了4种过滤器 1)pre 2)route 3)post 4) error zuul-request-lifecycle

reference