Middleware
Middleware
Overview
Microservice middleware are software components used to support microservice architecture, they provide some basic functions and services for communication, collaboration and management between microservices, the following middleware is built in go-zero:
- AuthorizeHandler
- BreakerHandler
- ContentSecurityHandler
- CryptionHandler
- GunzipHandler
- LogHandler
- MaxBytesHandler
- MaxConnsHandler
- MetricHandler
- PrometheusHandler
- RecoverHandler
- SheddingHandler
- TimeoutHandler
- TraceHandler
The above intermediate is enabled by default. You can also control some of the intermediaries.
Middleware Configuration
type MiddlewaresConf struct {
Trace bool `json:",default=true"`
Log bool `json:",default=true"`
Prometheus bool `json:",default=true"`
MaxConns bool `json:",default=true"`
Breaker bool `json:",default=true"`
Shedding bool `json:",default=true"`
Timeout bool `json:",default=true"`
Recover bool `json:",default=true"`
Metrics bool `json:",default=true"`
MaxBytes bool `json:",default=true"`
Gunzip bool `json:",default=true"`
}
``` Configuration Item| Note| Default value
---|---|---
Trace| Enable link tracking| true
Log| Enable Log Middleware| true
Prometheus| Whether to enable Prometheus middleware| true
MaxConns| Enable Limit Middleware| true
Breaker| Enable breaker middleware| true
Shedding| Enable Load Monitor Middleware| true
Timeout| Enable Timeout Middleware| true
Recover| Enable Panic Recovery Middleware| true
Metrics| Enable metrics middleware| true
MaxBytes| Enable ContentLength Administration Middleware| true
Gunzip| Enable compression management intermediate| true
For example, if you want to disable indicator collection in the Hello World program, you can configure it as follows:
* etc/config.yaml
* main.go
Name: HelloWorld.api
Host: 127.0.0.1
Port: 8080
Middlewares:
Metrics: false
func main() {
var restConf rest.RestConf
conf.MustLoad("etc/config.yaml", &restConf)
srv := rest.MustNewServer(restConf)
defer srv.Stop()
...
}
## Focus Middleware Introduction
### TraceHandler
The framework integrates Opentelemetry by default to standardize link tracking.If you want to report the trace information to jaeger, or take the hello world program as an example, you can do the following:
* etc/config.yaml
* main.go
Name: HelloWorld.api
Host: 127.0.0.1
Port: 8080
Middlewares:
Metrics: true
Telemetry:
Name: hello
Endpoint: http://127.0.0.1:14268/api/traces
Batcher: jaeger
Sampler: 1.0
var restConf rest.RestConf
conf.MustLoad("etc/config.yaml", &restConf)
srv := rest.MustNewServer(restConf)
Re-request `http:///127.0.0.1:8080/hello`to view link request information by opening the jaeger page and by default`http.host`、`http.method`、`http.route`、`http.status_code`and more.
### LogHandler
默认每次 http 请求都会输出对应的请求日志,格式如下:
{ "@timestamp": "2023-03-05T21:53:44.244+08:00", "caller": "handler/loghandler.go:160", "content": "[HTTP] 200 - GET /hello - 127.0.0.1:51499 - Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36", "duration": "0.0ms", "level": "info" }
Can disable log middleware by configuring it, enabled by default
* etc/config.yaml
* main.go
Name: HelloWorld.api
Host: 127.0.0.1
Port: 8080
Middlewares:
Log: false
var restConf rest.RestConf
conf.MustLoad("etc/config.yaml", &restConf)
srv := rest.MustNewServer(restConf)
### PrometheusHandler
http server 默认集成了 prometheus 指标监控,指标分别如下:
Requested time-consuming indicator type is Histogram, default label has path,buckets defined as 5, 10, 25, 50, 100, 250, 500, 1000
http_server_requests_duration_ms
Error statistics indicator type is counter, default label has paths, code
http_server_requests_code_total
Prometheus Middleware can be disabled by configuration, enabled by default
* etc/config.yaml
* main.go
Name: HelloWorld.api
Host: 127.0.0.1
Port: 8080
Middlewares:
Prometheus: false
var restConf rest.RestConf
conf.MustLoad("etc/config.yaml", &restConf)
srv := rest.MustNewServer(restConf)
### MaxConnsHandler
Use to limit the maximum number of requests sent by http:// when the number of concurrent requests exceeds the set value (default is 10,000), when exceeding the setting value returns http.StatusServiceUnav’s status code
Disable is same with above
## Custom Middleware
Use Use method to apply custom middleware
server := rest.MustNewServer(rest.RestConf{}) defer server.Stop()
server.Use(middleware)
func middleware(next http.HandlerFunc) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { w.Header().Add("X-Middleware", "static-middleware") next(w, r) } } ```
