krakend-ce
/
backend_factory.go
89 строк · 3.9 Кб
1package krakend
2
3import (
4"context"
5"fmt"
6
7otellura "github.com/krakend/krakend-otel/lura"
8amqp "github.com/krakendio/krakend-amqp/v2"
9cel "github.com/krakendio/krakend-cel/v2"
10cb "github.com/krakendio/krakend-circuitbreaker/v2/gobreaker/proxy"
11httpcache "github.com/krakendio/krakend-httpcache/v2"
12lambda "github.com/krakendio/krakend-lambda/v2"
13lua "github.com/krakendio/krakend-lua/v2/proxy"
14martian "github.com/krakendio/krakend-martian/v2"
15metrics "github.com/krakendio/krakend-metrics/v2/gin"
16oauth2client "github.com/krakendio/krakend-oauth2-clientcredentials/v2"
17opencensus "github.com/krakendio/krakend-opencensus/v2"
18pubsub "github.com/krakendio/krakend-pubsub/v2"
19ratelimit "github.com/krakendio/krakend-ratelimit/v3/proxy"
20"github.com/luraproject/lura/v2/config"
21"github.com/luraproject/lura/v2/logging"
22"github.com/luraproject/lura/v2/proxy"
23"github.com/luraproject/lura/v2/transport/http/client"
24httprequestexecutor "github.com/luraproject/lura/v2/transport/http/client/plugin"
25)
26
27// NewBackendFactory creates a BackendFactory by stacking all the available middlewares:
28// - oauth2 client credentials
29// - http cache
30// - martian
31// - pubsub
32// - amqp
33// - cel
34// - lua
35// - rate-limit
36// - circuit breaker
37// - metrics collector
38// - opencensus collector
39func NewBackendFactory(logger logging.Logger, metricCollector *metrics.Metrics) proxy.BackendFactory {
40return NewBackendFactoryWithContext(context.Background(), logger, metricCollector)
41}
42
43func newRequestExecutorFactory(logger logging.Logger) func(*config.Backend) client.HTTPRequestExecutor {
44requestExecutorFactory := func(cfg *config.Backend) client.HTTPRequestExecutor {
45clientFactory := client.NewHTTPClient
46if _, ok := cfg.ExtraConfig[oauth2client.Namespace]; ok {
47clientFactory = oauth2client.NewHTTPClient(cfg)
48}
49
50clientFactory = httpcache.NewHTTPClient(cfg, clientFactory)
51clientFactory = otellura.InstrumentedHTTPClientFactory(clientFactory, cfg)
52// TODO: check what happens if we have both, opencensus and otel enabled ?
53return opencensus.HTTPRequestExecutorFromConfig(clientFactory, cfg)
54}
55return httprequestexecutor.HTTPRequestExecutor(logger, requestExecutorFactory)
56}
57
58func internalNewBackendFactory(ctx context.Context, requestExecutorFactory func(*config.Backend) client.HTTPRequestExecutor,
59logger logging.Logger, metricCollector *metrics.Metrics) proxy.BackendFactory {
60
61backendFactory := martian.NewConfiguredBackendFactory(logger, requestExecutorFactory)
62bf := pubsub.NewBackendFactory(ctx, logger, backendFactory)
63backendFactory = bf.New
64backendFactory = amqp.NewBackendFactory(ctx, logger, backendFactory)
65backendFactory = lambda.BackendFactory(logger, backendFactory)
66backendFactory = cel.BackendFactory(logger, backendFactory)
67backendFactory = lua.BackendFactory(logger, backendFactory)
68backendFactory = ratelimit.BackendFactory(logger, backendFactory)
69backendFactory = cb.BackendFactory(backendFactory, logger)
70backendFactory = metricCollector.BackendFactory("backend", backendFactory)
71backendFactory = opencensus.BackendFactory(backendFactory)
72backendFactory = otellura.BackendFactory(backendFactory)
73return func(remote *config.Backend) proxy.Proxy {
74logger.Debug(fmt.Sprintf("[BACKEND: %s] Building the backend pipe", remote.URLPattern))
75return backendFactory(remote)
76}
77}
78
79// NewBackendFactoryWithContext creates a BackendFactory by stacking all the available middlewares and injecting the received context
80func NewBackendFactoryWithContext(ctx context.Context, logger logging.Logger, metricCollector *metrics.Metrics) proxy.BackendFactory {
81requestExecutorFactory := newRequestExecutorFactory(logger)
82return internalNewBackendFactory(ctx, requestExecutorFactory, logger, metricCollector)
83}
84
85type backendFactory struct{}
86
87func (backendFactory) NewBackendFactory(ctx context.Context, l logging.Logger, m *metrics.Metrics) proxy.BackendFactory {
88return NewBackendFactoryWithContext(ctx, l, m)
89}
90