bfe_server

package
v1.1.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Apr 8, 2021 License: Apache-2.0 Imports: 55 Imported by: 0

Documentation

Index

Constants

View Source
const (
	DC_INTERVAL          = 60  // interval for moving current to past (in s)
	DC_BUCKET_SIZE_PROXY = 1   // size of delay counter bucket for forwarding (in ms)
	DC_BUCKET_SIZE_HS    = 100 // size of delay counter bucket for handshake (in ms)
	DC_BUCKET_NUM        = 10  // number of delay counter bucket
)

setting for delay

View Source
const (
	KP_PROXY_DELAY                  = "proxy_delay"
	KP_PROXY_POST_DEALY             = "proxy_post_delay"
	KP_PROXY_HANDSHAKE_DELAY        = "proxy_handshake_delay"
	KP_PROXY_HANDSHAKE_FULL_DELAY   = "proxy_handshake_full_delay"
	KP_PROXY_HANDSHAKE_RESUME_DELAY = "proxy_handshake_resume_delay"
	KP_PROXY_STATE                  = "proxy_state"
)

key prefix

View Source
const TrailerPrefix = "Trailer:"

TrailerPrefix is a magic prefix for ResponseWriter.Header map keys that, if present, signals that the map entry is actually for the response trailers, and not the response headers. The prefix is stripped after the ServeHTTP call finishes and the values are sent in the trailers.

This mechanism is intended only for trailers that are not known prior to the headers being written. If the set of trailers is fixed or known before the header is written, the normal Go trailers mechanism is preferred:

https://golang.org/pkg/net/http/#ResponseWriter
https://golang.org/pkg/net/http/#example_ResponseWriter_trailers

Variables

View Source
var (
	ErrBodyNotAllowed = errors.New("http: request method or response status code does not allow body")
	ErrContentLength  = errors.New("Conn.Write wrote more than the declared Content-Length")
	ErrHijacked       = errors.New("http: connection has been hijacked")
)

Errors introduced by the HTTP server.

View Source
var (
	DefaultNextProtos = []string{tls_rule_conf.HTTP11}
)
View Source
var ErrExpectContinueReaderPeek = errors.New("http: expect continue reader peek failed")

Functions

func CheckSupportMultiplex

func CheckSupportMultiplex(proto string) bool

CheckSupportMultiplex checkes whether protocol support request multiplexing on a conn.

func Redirect

func Redirect(w bfe_http.ResponseWriter, r *bfe_http.Request, urlStr string, code int, extraHeader bfe_http.Header)

Redirect replies to the request with a redirect to url, which may be a path relative to the request path.

func StartUp

func StartUp(cfg bfe_conf.BfeConfig, version string, confRoot string) error

Types

type BfeListener

type BfeListener struct {
	// Listener is the underlying tcp listener
	Listener net.Listener

	// BalancerType is the type of Layer4 load balancer
	BalancerType string

	// ProxyHeaderTimeout Optionally specifies the timeout value to
	// receive the Proxy Protocol Header. Zero means no timeout.
	ProxyHeaderTimeout time.Duration

	// ProxyHeaderLimit Optionally specifies the maximum bytes to
	// receive the Proxy Protocol Header. Zero means default value.
	ProxyHeaderLimit int64
}

BfeListener is used to wrap an underlying TCP listener, which accept connections behind a layer4 load balancer (PROXY)

func NewBfeListener

func NewBfeListener(listener net.Listener, config bfe_conf.BfeConfig) *BfeListener

NewBfeListener return bfe listener according to config

func (*BfeListener) Accept

func (l *BfeListener) Accept() (net.Conn, error)

Accept implements the Accept method in the Listener interface; it waits for the next call and returns a generic net.Conn.

func (*BfeListener) Addr

func (l *BfeListener) Addr() net.Addr

Addr returns the underlying listener's network address.

func (*BfeListener) Close

func (l *BfeListener) Close() error

Close closes the underlying listener.

type BfeMonitor

type BfeMonitor struct {
	WebServer   *web_monitor.MonitorServer
	WebHandlers *web_monitor.WebHandlers
	// contains filtered or unexported fields
}

func (*BfeMonitor) Start

func (m *BfeMonitor) Start()

func (*BfeMonitor) WebHandlersInit

func (m *BfeMonitor) WebHandlersInit(srv *BfeServer) error

type BfeServer

type BfeServer struct {
	bfe_http.Server

	HttpListener  net.Listener   // listener for http
	HttpsListener *HttpsListener // listener for https

	// for http server
	ReverseProxy *ReverseProxy // reverse proxy

	// TLS session cache
	SessionCache *ServerSessionCache

	// TLS certificates
	MultiCert *MultiCertMap

	// TLS server rule
	TLSServerRule *TLSServerRuleMap

	// server config
	Config   bfe_conf.BfeConfig
	ConfRoot string

	// module and callback
	CallBacks *bfe_module.BfeCallbacks // call back functions
	Modules   *bfe_module.BfeModules   // bfe modules
	Plugins   *bfe_module.BfePlugins   // bfe plugins

	// web server for bfe monitor and reload
	Monitor *BfeMonitor

	// bufio cache
	BufioCache *BufioCache

	// signal table
	SignalTable *signal_table.SignalTable

	ServerConf *bfe_route.ServerDataConf // cluster_conf and host table conf

	Version string // version of bfe server
	// contains filtered or unexported fields
}

BfeServer

func NewBfeServer

func NewBfeServer(cfg bfe_conf.BfeConfig, confRoot string,
	version string) *BfeServer

NewBfeModules create a new instance of BfeServer.

func (*BfeServer) BalTableStatusGet

func (srv *BfeServer) BalTableStatusGet(query url.Values) ([]byte, error)

BalTableStatusGet returns state of balTable.

func (*BfeServer) BalTableVersionGet

func (srv *BfeServer) BalTableVersionGet(query url.Values) ([]byte, error)

BalTableVersionGet returns versions of balTable.

func (*BfeServer) Balance

func (srv *BfeServer) Balance(e interface{}) (*backend.BfeBackend, error)

Balance finds backend for proxied conn (under tls proxy mode).

func (*BfeServer) CheckGracefulShutdown

func (srv *BfeServer) CheckGracefulShutdown() bool

CheckGracefulShutdown check wether the server is in graceful shutdown state.

func (*BfeServer) ClusterTableVersionGet

func (srv *BfeServer) ClusterTableVersionGet(query url.Values) ([]byte, error)

ClusterTableVersionGet returns versions of clusterTable.

func (*BfeServer) FindLocation

func (srv *BfeServer) FindLocation(request *bfe_basic.Request) (string, error)

FindLocation finds product and cluster for given request

func (*BfeServer) FindProduct

func (srv *BfeServer) FindProduct(conn net.Conn) string

FindProduct finds product for proxied conn (under tls proxy mode).

func (*BfeServer) GetCheckConf

func (srv *BfeServer) GetCheckConf(clusterName string) *cluster_conf.BackendCheck

GetCheckConf implements CheckConfFetcher and return current health check configuration.

func (*BfeServer) GetServerConf

func (srv *BfeServer) GetServerConf() *bfe_route.ServerDataConf

func (*BfeServer) GslbDataConfReload

func (srv *BfeServer) GslbDataConfReload(query url.Values) error

GslbDataConfReload reloads gslb and cluster conf.

func (*BfeServer) HostTableStatusGet

func (srv *BfeServer) HostTableStatusGet(query url.Values) ([]byte, error)

HostTableStatusGet returns status of HostTable in json.

func (*BfeServer) HostTableVersionGet

func (srv *BfeServer) HostTableVersionGet(query url.Values) ([]byte, error)

HostTableVersionGet returns version of HostTable in json.

func (*BfeServer) InitConfig

func (srv *BfeServer) InitConfig()

InitConfig set some parameter based on config.

func (*BfeServer) InitDataLoad

func (srv *BfeServer) InitDataLoad() error

InitDataLoad load data when bfe start.

func (*BfeServer) InitHttp

func (srv *BfeServer) InitHttp() (err error)

func (*BfeServer) InitHttps

func (srv *BfeServer) InitHttps() (err error)

func (*BfeServer) InitListeners

func (srv *BfeServer) InitListeners(config bfe_conf.BfeConfig) error

func (*BfeServer) InitModules

func (srv *BfeServer) InitModules() error

func (*BfeServer) InitPlugins

func (srv *BfeServer) InitPlugins() error

func (*BfeServer) InitSignalTable

func (srv *BfeServer) InitSignalTable()

func (*BfeServer) InitWebMonitor

func (srv *BfeServer) InitWebMonitor(port int) error

func (*BfeServer) LoadPlugins

func (srv *BfeServer) LoadPlugins(plugins []string) error

func (*BfeServer) ModuleHandlersGetJSON

func (srv *BfeServer) ModuleHandlersGetJSON() ([]byte, error)

func (*BfeServer) ModuleStatusGetJSON

func (srv *BfeServer) ModuleStatusGetJSON() ([]byte, error)

func (*BfeServer) NameConfReload

func (srv *BfeServer) NameConfReload(query url.Values) error

NameConfReload reloads name conf data.

func (*BfeServer) RegisterModules

func (srv *BfeServer) RegisterModules(modules []string) error

RegisterModules registers bfe work module.

func (*BfeServer) Serve

func (srv *BfeServer) Serve(l net.Listener, raw net.Listener, proto string) error

Serve accepts incoming connections on the Listener l, creating a new service goroutine for each. The service goroutines read requests and then call srv.Handler to reply to them.

Params

  • l : net listener
  • raw: underlying tcp listener (different from `l` in HTTPS)

Return

  • err: error

func (*BfeServer) ServeHttp

func (srv *BfeServer) ServeHttp(ln net.Listener) error

ServeHttp accept incoming http connections

func (*BfeServer) ServeHttps

func (srv *BfeServer) ServeHttps(ln *HttpsListener) error

ServeHttps accept incoming https connections

func (*BfeServer) ServerDataConfReload

func (srv *BfeServer) ServerDataConfReload(query url.Values) error

ServerDataConfReload reloads host/route/cluster conf

func (*BfeServer) SessionTicketKeyReload

func (srv *BfeServer) SessionTicketKeyReload() error

SessionTicketKeyReload reloads for session ticket key.

func (*BfeServer) ShutdownHandler

func (srv *BfeServer) ShutdownHandler(sig os.Signal)

ShutdownHandler is signal handler for QUIT

func (*BfeServer) TLSConfReload

func (srv *BfeServer) TLSConfReload(query url.Values) error

type BufioCache

type BufioCache struct {
}

func NewBufioCache

func NewBufioCache() *BufioCache

type CloseNotifier

type CloseNotifier interface {
	// CloseNotify returns a channel that receives a single value
	// when the client connection has gone away.
	CloseNotify() <-chan bool
}

The CloseNotifier interface is implemented by ResponseWriters which allow detecting when the underlying connection has gone away.

This mechanism can be used to cancel long operations on the server if the client has disconnected before the response is ready.

type HttpsListener

type HttpsListener struct {
	// contains filtered or unexported fields
}

func NewHttpsListener

func NewHttpsListener(listener net.Listener, config *bfe_tls.Config) *HttpsListener

func (*HttpsListener) UpdateSessionTicketKey

func (l *HttpsListener) UpdateSessionTicketKey(key []byte)

UpdateSessionTicketKey updates session ticket key.

type MultiCertMap

type MultiCertMap struct {
	// contains filtered or unexported fields
}

func NewMultiCertMap

func NewMultiCertMap(state *ProxyState) *MultiCertMap

func (*MultiCertMap) Get

Get gets certificate for given connection.

func (*MultiCertMap) GetDefault

func (m *MultiCertMap) GetDefault() *bfe_tls.Certificate

func (*MultiCertMap) Update

func (m *MultiCertMap) Update(certConf map[string]*bfe_tls.Certificate,
	ruleMap tls_rule_conf.TlsRuleMap) error

Update updates all certificates.

type NameCertMap

type NameCertMap struct {
	// contains filtered or unexported fields
}

func NewNameCertMap

func NewNameCertMap() *NameCertMap

func (*NameCertMap) Get

func (m *NameCertMap) Get(serverName string) *bfe_tls.Certificate

func (*NameCertMap) Update

func (m *NameCertMap) Update(certConf map[string]*bfe_tls.Certificate)

type NextProtosConf

type NextProtosConf struct {
	// contains filtered or unexported fields
}

func NewNextProtosConf

func NewNextProtosConf(rule *TLSServerRuleMap, protoConf []string) *NextProtosConf

func (*NextProtosConf) Get

func (c *NextProtosConf) Get(conn *bfe_tls.Conn) []string

func (*NextProtosConf) Mandatory

func (c *NextProtosConf) Mandatory(conn *bfe_tls.Conn) (string, bool)

type ProtocolHandler

type ProtocolHandler struct {
	// contains filtered or unexported fields
}

func NewProtocolHandler

func NewProtocolHandler(conn *conn, proto string) *ProtocolHandler

func (*ProtocolHandler) ServeHTTP

func (p *ProtocolHandler) ServeHTTP(rw bfe_http.ResponseWriter, request *bfe_http.Request)

ServeHTTP processes http request and send http response.

Params:

  • w : a response writer
  • r : a http request

type ProxyState

type ProxyState struct {
	// panic
	PanicClientConnServe *metrics.Counter // panic when accept from client
	PanicBackendWrite    *metrics.Counter // panic when write to backend
	PanicBackendRead     *metrics.Counter // panic when read from backend

	// client side errors
	ErrClientLongUrl        *metrics.Counter
	ErrClientLongHeader     *metrics.Counter
	ErrClientClose          *metrics.Counter
	ErrClientTimeout        *metrics.Counter
	ErrClientBadRequest     *metrics.Counter
	ErrClientZeroContentlen *metrics.Counter
	ErrClientExpectFail     *metrics.Counter
	ErrClientConnAccept     *metrics.Counter
	ErrClientWrite          *metrics.Counter
	ErrClientReset          *metrics.Counter

	// route config errors
	ErrBkFindProduct  *metrics.Counter
	ErrBkFindLocation *metrics.Counter
	ErrBkNoBalance    *metrics.Counter
	ErrBkNoCluster    *metrics.Counter

	// backend side errors
	ErrBkConnectBackend    *metrics.Counter
	ErrBkRequestBackend    *metrics.Counter
	ErrBkWriteRequest      *metrics.Counter
	ErrBkReadRespHeader    *metrics.Counter
	ErrBkRespHeaderTimeout *metrics.Counter
	ErrBkTransportBroken   *metrics.Counter

	// tls handshake
	TlsHandshakeAll  *metrics.Counter
	TlsHandshakeSucc *metrics.Counter

	// tls session cache
	SessionCacheConn         *metrics.Counter
	SessionCacheConnFail     *metrics.Counter
	SessionCacheSet          *metrics.Counter
	SessionCacheSetFail      *metrics.Counter
	SessionCacheGet          *metrics.Counter
	SessionCacheGetFail      *metrics.Counter
	SessionCacheTypeNotBytes *metrics.Counter
	SessionCacheMiss         *metrics.Counter
	SessionCacheHit          *metrics.Counter
	SessionCacheNoInstance   *metrics.Counter

	// tls multiply certificates
	TlsMultiCertGet            *metrics.Counter
	TlsMultiCertConnWithoutVip *metrics.Counter
	TlsMultiCertConnVipUnknown *metrics.Counter
	TlsMultiCertConnWithoutSni *metrics.Counter
	TlsMultiCertUseDefault     *metrics.Counter
	TlsMultiCertUpdate         *metrics.Counter
	TlsMultiCertUpdateErr      *metrics.Counter

	// client side
	ClientReqWithRetry       *metrics.Counter // req served with retry
	ClientReqWithCrossRetry  *metrics.Counter // req served with cross cluster retry
	ClientReqFail            *metrics.Counter // req with ErrCode != nil
	ClientReqFailWithNoRetry *metrics.Counter // req fail with no retry
	ClientConnUse100Continue *metrics.Counter // connection used Expect 100 Continue
	ClientConnUnfinishedReq  *metrics.Counter // connection closed with unfinished request

	// request successful received
	ClientReqServed      *metrics.Counter
	HttpClientReqServed  *metrics.Counter
	HttpsClientReqServed *metrics.Counter
	Http2ClientReqServed *metrics.Counter
	SpdyClientReqServed  *metrics.Counter

	// active request
	ClientReqActive      *metrics.Gauge
	HttpClientReqActive  *metrics.Gauge
	HttpsClientReqActive *metrics.Gauge
	Http2ClientReqActive *metrics.Gauge
	SpdyClientReqActive  *metrics.Gauge

	// connection successful accepted
	ClientConnServed       *metrics.Counter
	HttpClientConnServed   *metrics.Counter
	HttpsClientConnServed  *metrics.Counter
	Http2ClientConnServed  *metrics.Counter
	SpdyClientConnServed   *metrics.Counter
	StreamClientConnServed *metrics.Counter
	WsClientConnServed     *metrics.Counter
	WssClientConnServed    *metrics.Counter

	// active connection
	ClientConnActive       *metrics.Gauge
	HttpClientConnActive   *metrics.Gauge
	HttpsClientConnActive  *metrics.Gauge
	Http2ClientConnActive  *metrics.Gauge
	SpdyClientConnActive   *metrics.Gauge
	StreamClientConnActive *metrics.Gauge
	WsClientConnActive     *metrics.Gauge
	WssClientConnActive    *metrics.Gauge
}

func (*ProxyState) ClientConnActiveDec

func (s *ProxyState) ClientConnActiveDec(proto string, value uint)

func (*ProxyState) ClientConnActiveInc

func (s *ProxyState) ClientConnActiveInc(proto string, value uint)

func (*ProxyState) ClientConnServedInc

func (s *ProxyState) ClientConnServedInc(proto string, value uint)

func (*ProxyState) ClientReqActiveDec

func (s *ProxyState) ClientReqActiveDec(proto string, value uint)

func (*ProxyState) ClientReqActiveInc

func (s *ProxyState) ClientReqActiveInc(proto string, value uint)

func (*ProxyState) ClientReqServedInc

func (s *ProxyState) ClientReqServedInc(proto string, value uint)

type ReverseProxy

type ReverseProxy struct {
	// contains filtered or unexported fields
}

ReverseProxy takes an incoming request and sends it to another server, proxying the response back to the client.

func NewReverseProxy

func NewReverseProxy(server *BfeServer, state *ProxyState) *ReverseProxy

NewReverseProxy returns a new ReverseProxy.

func (*ReverseProxy) FinishReq

func (p *ReverseProxy) FinishReq(rw bfe_http.ResponseWriter, request *bfe_basic.Request) (action int)

FinishReq should be invoked after quit ServHTTP().

func (*ReverseProxy) ServeHTTP

func (p *ReverseProxy) ServeHTTP(rw bfe_http.ResponseWriter, basicReq *bfe_basic.Request) (action int)

ServeHTTP processes http request and send http response.

Params:

  • rw : context for sending response
  • request: context for request

Return:

  • action: action to do after ServeHTTP

type RoundTripperMap

type RoundTripperMap map[string]bfe_http.RoundTripper

RoundTripperMap holds mappings from cluster-name to RoundTripper.

type ServerRule

type ServerRule struct {
	TlsRule    bfe_tls.Rule    // server rule for tls
	H2Rule     bfe_http2.Rule  // server rule for h2
	StreamRule bfe_stream.Rule // server rule for stream
}

type ServerSessionCache

type ServerSessionCache struct {
	Servers []string // tcp address for redis servers

	ConnectTimeout time.Duration // connect timeout (ms)
	ReadTimeout    time.Duration // read timeout (ms)
	WriteTimeout   time.Duration // write timeout (ms)
	KeyPrefix      string        // prefix for cache key

	SessionExpire int // expire time for tls session state (s)
	MaxIdle       int // max idle connections in pool
	// contains filtered or unexported fields
}

func NewServerSessionCache

func NewServerSessionCache(conf bfe_conf.ConfigSessionCache, state *ProxyState) (
	c *ServerSessionCache)

func (*ServerSessionCache) Get

func (c *ServerSessionCache) Get(sessionKey string) ([]byte, bool)

Get gets sessionState from session cache.

func (*ServerSessionCache) Put

func (c *ServerSessionCache) Put(sessionKey string, sessionState []byte) (err error)

Put saves sessionState to session cache.

func (*ServerSessionCache) UpdatePool

func (c *ServerSessionCache) UpdatePool(pool *redis.Pool) *redis.Pool

func (*ServerSessionCache) UpdateServers

func (c *ServerSessionCache) UpdateServers(servers []string)

type ServerStatus

type ServerStatus struct {
	// for proxy protocol
	ProxyProtocolState   *bfe_proxy.ProxyState
	ProxyProtocolMetrics metrics.Metrics

	// for tls protocol
	TlsState   *bfe_tls.TlsState
	TlsMetrics metrics.Metrics

	// for spdy protocol
	SpdyState   *bfe_spdy.SpdyState
	SpdyMetrics metrics.Metrics

	// for http2 protocol
	Http2State   *bfe_http2.Http2State
	Http2Metrics metrics.Metrics

	// for http protocol
	HttpState   *bfe_http.HttpState
	HttpMetrics metrics.Metrics

	// for stream protocol (tls proxy)
	StreamState   *bfe_stream.StreamState
	StreamMetrics metrics.Metrics

	// for websocket protocol (websocket proxy)
	WebSocketState   *bfe_websocket.WebSocketState
	WebSocketMetrics metrics.Metrics

	// for balance
	BalState   *bal.BalErrState
	BalMetrics metrics.Metrics

	// for proxy
	ProxyState   *ProxyState
	ProxyMetrics metrics.Metrics

	// for monitor "internal delay"
	ProxyDelay *delay_counter.DelayRecent

	// for monitor "internal delay" of post/put request
	ProxyPostDelay *delay_counter.DelayRecent

	// for monitor "internal delay" of tls handshake
	ProxyHandshakeDelay       *delay_counter.DelayRecent
	ProxyHandshakeFullDelay   *delay_counter.DelayRecent
	ProxyHandshakeResumeDelay *delay_counter.DelayRecent
}

func NewServerStatus

func NewServerStatus() *ServerStatus

type TLSServerRuleMap

type TLSServerRuleMap struct {
	// contains filtered or unexported fields
}

func NewTLSServerRuleMap

func NewTLSServerRuleMap(state *ProxyState) *TLSServerRuleMap

func (*TLSServerRuleMap) EnableNextProto

func (m *TLSServerRuleMap) EnableNextProto(proto string, state bool)

func (*TLSServerRuleMap) Get

Get returns tls rule for given connection.

func (*TLSServerRuleMap) GetHTTP2Rule

func (m *TLSServerRuleMap) GetHTTP2Rule(c *bfe_tls.Conn) *bfe_http2.Rule

GetHTTP2Rule returns h2 rule for given connection.

func (*TLSServerRuleMap) GetStreamRule

func (m *TLSServerRuleMap) GetStreamRule(c *bfe_tls.Conn) *bfe_stream.Rule

GetStreamRule returns stream rule for given connection.

func (*TLSServerRuleMap) StatusNextProto

func (m *TLSServerRuleMap) StatusNextProto() (enableHttp2 bool, enableSpdy bool)

func (*TLSServerRuleMap) Update

func (m *TLSServerRuleMap) Update(conf tls_rule_conf.BfeTlsRuleConf,
	clientCAMap map[string]*x509.CertPool, clientCRLPoolMap map[string]*bfe_tls.CRLPool)

type Version

type Version struct {
	TlsRuleConfVersion string
}

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL