From b40da3eff8186cbd2a89f13b58472f3f073cd019 Mon Sep 17 00:00:00 2001 From: Xargin Date: Mon, 28 May 2018 12:18:01 +0800 Subject: [PATCH] update --- ch6-web/ch6-08-layout-of-web-project.md | 15 +++++++++------ images/ch6-08-control-flow.png | Bin 14998 -> 26939 bytes 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/ch6-web/ch6-08-layout-of-web-project.md b/ch6-web/ch6-08-layout-of-web-project.md index 52de9e3..0930326 100644 --- a/ch6-web/ch6-08-layout-of-web-project.md +++ b/ch6-web/ch6-08-layout-of-web-project.md @@ -22,20 +22,23 @@ ![controller-logic-dao](../images/ch6-08-controller-logic-dao.png) -划分为 CLD 三层之后,在 C 层我们可能还需要同时支持多种协议。本章前面讲到的 thrift、gRPC 和 http 并不是一定只选择其中一种,有时我们需要支持其中的两种,比如同一个接口,我们既需要效率较高的 thrift,也需要方便 debug 的 http 入口。这样请求的流程会变成下面这样: +划分为 CLD 三层之后,在 C 层之前我们可能还需要同时支持多种协议。本章前面讲到的 thrift、gRPC 和 http 并不是一定只选择其中一种,有时我们需要支持其中的两种,比如同一个接口,我们既需要效率较高的 thrift,也需要方便 debug 的 http 入口。即除了 CLD 之外,还需要一个单独的 protocol 层,负责处理各种交互协议的细节。这样请求的流程会变成下面这样: ![control-flow](../images/ch6-08-control-flow.png) +这样我们 controller 中的入口函数就变成了下面这样: + ```go func CreateOrder(ctx context.Context, req *CreateOrderStruct) (*CreateOrderRespStruct, error) { } ``` -CreateOrder 有两个参数,ctx 用来传入 trace_id 一类的需要串联请求的全局参数,req 里存储了我们创建订单所需要的所有输入信息。返回结果是一个响应结构体和错误。可以认为,我们的代码运行到 logic 层之后,就没有任何与“协议”相关的代码了。在这里你找不到 http.Request,也找不到 http.ResponseWriter,也找不到任何与 thrift 或者 gRPC 相关的字眼。 +CreateOrder 有两个参数,ctx 用来传入 trace_id 一类的需要串联请求的全局参数,req 里存储了我们创建订单所需要的所有输入信息。返回结果是一个响应结构体和错误。可以认为,我们的代码运行到 controller 层之后,就没有任何与“协议”相关的代码了。在这里你找不到 http.Request,也找不到 http.ResponseWriter,也找不到任何与 thrift 或者 gRPC 相关的字眼。 + +在 protocol 层,处理 http 协议的大概代码如下: ```go - -// in logic +// in protocol layer type CreateOrderRequest struct { OrderID `json:"order_id"` // ... @@ -45,7 +48,7 @@ func HTTPCreateOrderHandler(wr http.ResponseWriter, r *http.Request) { var params CreateOrderRequest ctx := context.TODO() // bind data to req - logicResp,err := logic.CreateOrder(ctx, ¶ms) + logicResp,err := controller.CreateOrder(ctx, ¶ms) if err != nil {} // ... } @@ -53,7 +56,7 @@ func HTTPCreateOrderHandler(wr http.ResponseWriter, r *http.Request) { 理论上我们可以用同一个 request struct 组合上不同的 tag,来达到一个 struct 来给不同的协议复用的目的。不过遗憾的是在 thrift 中,request struct 也是通过 IDL 生成的,其内容在自动生成的 ttypes.go 文件中,我们还是需要在 thrift 的入口将这个自动生成的 struct 映射到我们 logic 入口所需要的 struct 上。gRPC 也是类似。这部分代码还是需要的。 -聪明的读者可能已经可以看出来了,协议细节处理这一层实际上有大量重复劳动,每一个接口在协议这一层的处理,无非是把数据从协议特定的 struct(例如 http.Request,thrift 的被包装过了) 读出来,再绑定到我们协议相关的 struct 上,再把这个 struct 映射到 logic 入口的 struct 上,这些代码实际上长得都差不多。差不多的代码都遵循着某种模式,那么我们可以对这些模式进行简单的抽象,用 codegen 来把繁复的协议处理代码从工作内容中抽离出去。 +聪明的读者可能已经可以看出来了,协议细节处理这一层实际上有大量重复劳动,每一个接口在协议这一层的处理,无非是把数据从协议特定的 struct(例如 http.Request,thrift 的被包装过了) 读出来,再绑定到我们协议无关的 struct 上,再把这个 struct 映射到 controller 入口的 struct 上,这些代码实际上长得都差不多。差不多的代码都遵循着某种模式,那么我们可以对这些模式进行简单的抽象,用 codegen 来把繁复的协议处理代码从工作内容中抽离出去。 还是举个例子: diff --git a/images/ch6-08-control-flow.png b/images/ch6-08-control-flow.png index ac3e5dc6da4a231c0f84f001a2d9aa600541ce3e..a55419fde9b8367df2b55ba567653df54f45b8bc 100644 GIT binary patch literal 26939 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

n4}#>H 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

  • o2m97phPF-f!?!(DHd>?OeabWf)v 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