Comments (5)
我这样写可以达成预期,但看起来很不优雅,官方有推荐的方式吗?
package main
import (
"context"
"fmt"
"os"
"github.com/gin-gonic/gin"
kgin "github.com/go-kratos/gin"
"github.com/go-kratos/kratos/v2"
"github.com/go-kratos/kratos/v2/errors"
"github.com/go-kratos/kratos/v2/log"
"github.com/go-kratos/kratos/v2/middleware"
"github.com/go-kratos/kratos/v2/middleware/logging"
"github.com/go-kratos/kratos/v2/middleware/recovery"
"github.com/go-kratos/kratos/v2/middleware/tracing"
"github.com/go-kratos/kratos/v2/transport"
"github.com/go-kratos/kratos/v2/transport/http"
"go.opentelemetry.io/otel"
sdktrace "go.opentelemetry.io/otel/sdk/trace"
)
func customMiddleware(handler middleware.Handler) middleware.Handler {
return func(ctx context.Context, req interface{}) (reply interface{}, err error) {
if tr, ok := transport.FromServerContext(ctx); ok {
fmt.Println("operation:", tr.Operation())
}
if c, ok := kgin.FromGinContext(ctx); ok {
c.Request = c.Request.WithContext(ctx)
}
reply, err = handler(ctx, req)
return
}
}
func main() {
router := gin.Default()
tp := sdktrace.NewTracerProvider()
otel.SetTracerProvider(tp)
logger := log.With(log.NewStdLogger(os.Stdout),
"ts", log.DefaultTimestamp,
"caller", log.DefaultCaller,
"trace.id", tracing.TraceID(),
"span.id", tracing.SpanID(),
)
log.SetLogger(logger)
// 使用kratos中间件
router.Use(kgin.Middlewares(recovery.Recovery(), tracing.Server(), logging.Server(logger), customMiddleware))
router.GET("/helloworld/:name", func(ctx *gin.Context) {
name := ctx.Param("name")
log.Context(ctx.Request.Context()).Info("hello world")
if name == "error" {
// 返回kratos error
kgin.Error(ctx, errors.Unauthorized("auth_error", "no authentication"))
} else {
ctx.JSON(200, map[string]string{"welcome": name})
}
})
httpSrv := http.NewServer(http.Address(":8000"))
httpSrv.HandlePrefix("/", router)
app := kratos.New(
kratos.Name("gin"),
kratos.Logger(logger),
kratos.Server(
httpSrv,
),
)
if err := app.Run(); err != nil {
panic(err)
}
}
from kratos.
I didn't see any difference between the two methods, and besides, gin itself is not officially supported
from kratos.
I didn't see any difference between the two methods, and besides, gin itself is not officially supported
There are some differences here:
- I put the registration of the
customMiddleware
middleware at the end - In the
customMiddleware
middleware, I wrote the context of trace into gin.Context.Request, so that I can get the context of trace in the input parameter of the router's handler. - finally,I can print logs with trace context
from kratos.
Non official support for gin. If an exception occurs, it may be due to incomplete implementation. We recommend using official standard support. Or you can fix it directly
from kratos.
Non official support for gin. If an exception occurs, it may be due to incomplete implementation. We recommend using official standard support. Or you can fix it directly
ok~ thx
from kratos.
Related Issues (20)
- `stream` response in proto failed to generate http client HOT 6
- [Feature] Add kratos errors to buf remote plugin HOT 1
- [Question] I modified it based on examples/helloworld and found that client/main.go reported an error when executing. I am not sure if it is a BUG. HOT 1
- HTTPClient proto: syntax error (line 1:1): unexpected token 404 HOT 3
- [Question] how to set response content-type as xml for one method HOT 2
- [Question] HTTP Server. extra add route do not pass middleware. HOT 2
- I a new release due soon ? HOT 4
- [Question] Can I custom project layouts by using kratos to generate HOT 1
- [Question]Excuse me, what is the error when compiling? HOT 2
- Kratos middleware seems to only apply to unary gRPC operations HOT 7
- t
- [Question] About the current p2c algorithm HOT 1
- bug in Quick Start HOT 1
- [Question]how can i catch issue when i use config hot reload with a mismatch type
- 使用北极星作为服务发现时,在注册多个grpc client时,启动报错:concurrent map iteration and map write HOT 4
- [Question]how to get all router HOT 1
- GRPC MaxSendMsgSize MaxRecvMsgSize setting HOT 1
- [Question] Error: no_available_node HOT 13
- [Question] After creating a new service, the grpc test is normal, but when requesting bff through http, the bff layer does not initiate a grpc call to the business layer and returns DeadlineExceeded. Which part should be checked? HOT 1
- Whitelist: selector middleware doesn't work for grpc HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from kratos.