1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
| // 这里生成了一个值是tcp.Router的map
func (m *Manager) BuildHandlers(rootCtx context.Context, entryPoints []string) map[string]*tcp.Router {
entryPointsRouters := m.getTCPRouters(rootCtx, entryPoints)
entryPointsRoutersHTTP := m.getHTTPRouters(rootCtx, entryPoints, true)
entryPointHandlers := make(map[string]*tcp.Router)
for _, entryPointName := range entryPoints {
entryPointName := entryPointName
routers := entryPointsRouters[entryPointName]
// 这里返回了一个hanlder,这个就是处理请求的handler
handler, err := m.buildEntryPointHandler(ctx, routers, entryPointsRoutersHTTP[entryPointName], m.httpHandlers[entryPointName], m.httpsHandlers[entryPointName])
entryPointHandlers[entryPointName] = handler
}
return entryPointHandlers
}
// buildEntryPointHandler 方法实现
func (m *Manager) buildEntryPointHandler(ctx context.Context, configs map[string]*runtime.RouterInfo) (http.Handler, error) {
router, err := rules.NewRouter()
for routerName, routerConfig := range configs {
// 这里调用buildRouterHandler去build一个handler
handler, err := m.buildRouterHandler(ctxRouter, routerName, routerConfig)
err = router.AddRoute(routerConfig.Rule, routerConfig.Priority, handler)
}
// 这里增加一个recovery的middle
chain := alice.New()
chain = chain.Append(func(next http.Handler) (http.Handler, error) {
return recovery.New(ctx, next)
})
return chain.Then(router)
}
// buildRouterHandler 方法实现
func (m *Manager) buildRouterHandler(ctx context.Context, routerName string, routerConfig *runtime.RouterInfo) (http.Handler, error) {
// 这里调用 buildHTTPHandler 去获取一个handler对象
handler, err := m.buildHTTPHandler(ctx, routerConfig, routerName)
// 这里把handler和其他的合并成一个handler
handlerWithAccessLog, err := alice.New(func(next http.Handler) (http.Handler, error) {
return accesslog.NewFieldHandler(next, accesslog.RouterName, routerName, nil), nil
}).Then(handler)
return m.routerHandlers[routerName], nil
}
// buildHTTPHandler 实现
func (m *Manager) buildHTTPHandler(ctx context.Context, router *runtime.RouterInfo, routerName string) (http.Handler, error) {
// 这里调用了BuildHTTP获取一个lb
sHandler, err := m.serviceManager.BuildHTTP(ctx, router.Service)
// 这里把lb和其他的Middlewares合并成一个chain
mHandler := m.middlewaresBuilder.BuildChain(ctx, router.Middlewares)
tHandler := func(next http.Handler) (http.Handler, error) {
return tracing.NewForwarder(ctx, routerName, router.Service, next), nil
}
chain := alice.New()
if m.metricsRegistry != nil && m.metricsRegistry.IsRouterEnabled() {
chain = chain.Append(metricsMiddle.WrapRouterHandler(ctx, m.metricsRegistry, routerName, provider.GetQualifiedName(ctx, router.Service)))
}
return chain.Extend(*mHandler).Append(tHandler).Then(sHandler)
}
|