Skip to content

Commit

Permalink
Merge pull request #289 from askuy/feature/ginserverandctxtimeout
Browse files Browse the repository at this point in the history
support gin server and context read timeout
  • Loading branch information
askuy authored May 17, 2022
2 parents f5511b0 + 8391834 commit 6f445a5
Show file tree
Hide file tree
Showing 15 changed files with 399 additions and 47 deletions.
6 changes: 3 additions & 3 deletions client/ehttp/interceptor.go
Original file line number Diff line number Diff line change
Expand Up @@ -93,10 +93,10 @@ func beg(ctx context.Context) time.Time {
func fixedInterceptor(name string, config *Config, logger *elog.Component) (resty.RequestMiddleware, resty.ResponseMiddleware, resty.ErrorHook) {
return func(cli *resty.Client, req *resty.Request) error {
// 这个URL可能不准,每次请求都需要重复url.Parse(),会增加一定的性能损耗
concatUrl := strings.TrimRight(config.Addr, "/") + "/" + strings.TrimLeft(req.URL, "/")
u, err := url.Parse(concatUrl)
concatURL := strings.TrimRight(config.Addr, "/") + "/" + strings.TrimLeft(req.URL, "/")
u, err := url.Parse(concatURL)
if err != nil {
logger.Warn("invalid url", elog.String("concatUrl", concatUrl), elog.FieldErr(err))
logger.Warn("invalid url", elog.String("concatURL", concatURL), elog.FieldErr(err))
req.SetContext(context.WithValue(context.WithValue(req.Context(), begKey{}, time.Now()), urlKey{}, &url.URL{}))
return err
}
Expand Down
28 changes: 14 additions & 14 deletions core/elog/component.go
Original file line number Diff line number Diff line change
Expand Up @@ -169,17 +169,17 @@ func (logger *Component) Debug(msg string, fields ...Field) {
logger.desugar.Debug(msg, fields...)
}

// Deprecated: Will be removed in future versions, use *Component.Debug instead.
// Debugw ...
// Deprecated: Will be removed in future versions, use *Component.Debug instead.
func (logger *Component) Debugw(msg string, keysAndValues ...interface{}) {
if logger.IsDebugMode() {
msg = normalizeMessage(msg)
}
logger.sugar.Debugw(msg, keysAndValues...)
}

// Deprecated: Will be removed in future versions, use *Component.Debug instead.
// Debugf ...
// Deprecated: Will be removed in future versions, use *Component.Debug instead.
func (logger *Component) Debugf(template string, args ...interface{}) {
logger.sugar.Debugf(template, args...)
}
Expand All @@ -192,17 +192,17 @@ func (logger *Component) Info(msg string, fields ...Field) {
logger.desugar.Info(msg, fields...)
}

// Deprecated: Will be removed in future versions, use *Component.Info instead.
// Infow ...
// Deprecated: Will be removed in future versions, use *Component.Info instead.
func (logger *Component) Infow(msg string, keysAndValues ...interface{}) {
if logger.IsDebugMode() {
msg = normalizeMessage(msg)
}
logger.sugar.Infow(msg, keysAndValues...)
}

// Deprecated: Will be removed in future versions, use *Component.Info instead.
// Infof ...
// Deprecated: Will be removed in future versions, use *Component.Info instead.
func (logger *Component) Infof(template string, args ...interface{}) {
logger.sugar.Infof(template, args...)
}
Expand All @@ -215,17 +215,17 @@ func (logger *Component) Warn(msg string, fields ...Field) {
logger.desugar.Warn(msg, fields...)
}

// Deprecated: Will be removed in future versions, use *Component.Warn instead.
// Warnw ...
// Deprecated: Will be removed in future versions, use *Component.Warn instead.
func (logger *Component) Warnw(msg string, keysAndValues ...interface{}) {
if logger.IsDebugMode() {
msg = normalizeMessage(msg)
}
logger.sugar.Warnw(msg, keysAndValues...)
}

// Deprecated: Will be removed in future versions, use *Component.Warn instead.
// Warnf ...
// Deprecated: Will be removed in future versions, use *Component.Warn instead.
func (logger *Component) Warnf(template string, args ...interface{}) {
logger.sugar.Warnf(template, args...)
}
Expand All @@ -238,17 +238,17 @@ func (logger *Component) Error(msg string, fields ...Field) {
logger.desugar.Error(msg, fields...)
}

// Deprecated: Will be removed in future versions, use *Component.Error instead.
// Errorw ...
// Deprecated: Will be removed in future versions, use *Component.Error instead.
func (logger *Component) Errorw(msg string, keysAndValues ...interface{}) {
if logger.IsDebugMode() {
msg = normalizeMessage(msg)
}
logger.sugar.Errorw(msg, keysAndValues...)
}

// Deprecated: Will be removed in future versions, use *Component.Error instead.
// Errorf ...
// Deprecated: Will be removed in future versions, use *Component.Error instead.
func (logger *Component) Errorf(template string, args ...interface{}) {
logger.sugar.Errorf(template, args...)
}
Expand All @@ -262,17 +262,17 @@ func (logger *Component) Panic(msg string, fields ...Field) {
logger.desugar.Panic(msg, fields...)
}

// Deprecated: Will be removed in future versions, use *Component.Panic instead.
// Panicw ...
// Deprecated: Will be removed in future versions, use *Component.Panic instead.
func (logger *Component) Panicw(msg string, keysAndValues ...interface{}) {
if logger.IsDebugMode() {
msg = normalizeMessage(msg)
}
logger.sugar.Panicw(msg, keysAndValues...)
}

// Deprecated: Will be removed in future versions, use *Component.Panic instead.
// Panicf ...
// Deprecated: Will be removed in future versions, use *Component.Panic instead.
func (logger *Component) Panicf(template string, args ...interface{}) {
logger.sugar.Panicf(template, args...)
}
Expand All @@ -286,17 +286,17 @@ func (logger *Component) DPanic(msg string, fields ...Field) {
logger.desugar.DPanic(msg, fields...)
}

// Deprecated: Will be removed in future versions, use *Component.DPanic instead.
// DPanicw ...
// Deprecated: Will be removed in future versions, use *Component.DPanic instead.
func (logger *Component) DPanicw(msg string, keysAndValues ...interface{}) {
if logger.IsDebugMode() {
msg = normalizeMessage(msg)
}
logger.sugar.DPanicw(msg, keysAndValues...)
}

// Deprecated: Will be removed in future versions, use *Component.DPanic instead.
// DPanicf ...
// Deprecated: Will be removed in future versions, use *Component.DPanic instead.
func (logger *Component) DPanicf(template string, args ...interface{}) {
logger.sugar.DPanicf(template, args...)
}
Expand All @@ -311,17 +311,17 @@ func (logger *Component) Fatal(msg string, fields ...Field) {
logger.desugar.Fatal(msg, fields...)
}

// Deprecated: Will be removed in future versions, use *Component.Fatal instead.
// Fatalw ...
// Deprecated: Will be removed in future versions, use *Component.Fatal instead.
func (logger *Component) Fatalw(msg string, keysAndValues ...interface{}) {
if logger.IsDebugMode() {
msg = normalizeMessage(msg)
}
logger.sugar.Fatalw(msg, keysAndValues...)
}

// Deprecated: Will be removed in future versions, use *Component.Fatal instead.
// Fatalf ...
// Deprecated: Will be removed in future versions, use *Component.Fatal instead.
func (logger *Component) Fatalf(template string, args ...interface{}) {
logger.sugar.Fatalf(template, args...)
}
Expand Down
28 changes: 14 additions & 14 deletions core/elog/elog_api.go
Original file line number Diff line number Diff line change
Expand Up @@ -52,86 +52,86 @@ func Fatal(msg string, fields ...Field) {
DefaultLogger.Fatal(msg, fields...)
}

// Deprecated: Will be removed in future versions, use Debug instead.
// Debugw ...
// Deprecated: Will be removed in future versions, use Debug instead.
func Debugw(msg string, keysAndValues ...interface{}) {
DefaultLogger.Debugw(msg, keysAndValues...)
}

// Deprecated: Will be removed in future versions, use Info instead.
// Infow ...
// Deprecated: Will be removed in future versions, use Info instead.
func Infow(msg string, keysAndValues ...interface{}) {
DefaultLogger.Infow(msg, keysAndValues...)
}

// Deprecated: Will be removed in future versions, use Warn instead.
// Warnw ...
// Deprecated: Will be removed in future versions, use Warn instead.
func Warnw(msg string, keysAndValues ...interface{}) {
DefaultLogger.Warnw(msg, keysAndValues...)
}

// Deprecated: Will be removed in future versions, use Error instead.
// Errorw ...
// Deprecated: Will be removed in future versions, use Error instead.
func Errorw(msg string, keysAndValues ...interface{}) {
DefaultLogger.Errorw(msg, keysAndValues...)
}

// Deprecated: Will be removed in future versions, use Panic instead.
// Panicw ...
// Deprecated: Will be removed in future versions, use Panic instead.
func Panicw(msg string, keysAndValues ...interface{}) {
DefaultLogger.Panicw(msg, keysAndValues...)
}

// Deprecated: Will be removed in future versions, use DPanic instead.
// DPanicw ...
// Deprecated: Will be removed in future versions, use DPanic instead.
func DPanicw(msg string, keysAndValues ...interface{}) {
DefaultLogger.DPanicw(msg, keysAndValues...)
}

// Deprecated: Will be removed in future versions, use Fatal instead.
// Fatalw ...
// Deprecated: Will be removed in future versions, use Fatal instead.
func Fatalw(msg string, keysAndValues ...interface{}) {
DefaultLogger.Fatalw(msg, keysAndValues...)
}

// Deprecated: Will be removed in future versions, use Debug instead.
// Debugf ...
// Deprecated: Will be removed in future versions, use Debug instead.
func Debugf(msg string, args ...interface{}) {
DefaultLogger.Debugf(msg, args...)
}

// Deprecated: Will be removed in future versions, use Info instead.
// Infof ...
// Deprecated: Will be removed in future versions, use Info instead.
func Infof(msg string, args ...interface{}) {
DefaultLogger.Infof(msg, args...)
}

// Deprecated: Will be removed in future versions, use Warn instead.
// Warnf ...
// Deprecated: Will be removed in future versions, use Warn instead.
func Warnf(msg string, args ...interface{}) {
DefaultLogger.Warnf(msg, args...)
}

// Deprecated: Will be removed in future versions, use Error instead.
// Errorf ...
// Deprecated: Will be removed in future versions, use Error instead.
func Errorf(msg string, args ...interface{}) {
DefaultLogger.Errorf(msg, args...)
}

// Deprecated: Will be removed in future versions, use Panic instead.
// Panicf ...
// Deprecated: Will be removed in future versions, use Panic instead.
func Panicf(msg string, args ...interface{}) {
DefaultLogger.Panicf(msg, args...)
}

// Deprecated: Will be removed in future versions, use DPanic instead.
// DPanicf ...
// Deprecated: Will be removed in future versions, use DPanic instead.
func DPanicf(msg string, args ...interface{}) {
DefaultLogger.DPanicf(msg, args...)
}

// Deprecated: Will be removed in future versions, use Fatal instead.
// Fatalf ...
// Deprecated: Will be removed in future versions, use Fatal instead.
func Fatalf(msg string, args ...interface{}) {
DefaultLogger.Fatalf(msg, args...)
}
Expand Down
7 changes: 7 additions & 0 deletions examples/server/http/readtimeout/config.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
[server.http]
host = "0.0.0.0"
port = 12345
enableAccessInterceptorReq = true
enableAccessInterceptorRes = true
contextTimeout = "1s"
serverRriteTimeout = "1s"
46 changes: 46 additions & 0 deletions examples/server/http/readtimeout/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package main

import (
"fmt"
"time"

"github.com/gin-gonic/gin"
"github.com/gotomicro/ego"
"github.com/gotomicro/ego/client/ehttp"
"github.com/gotomicro/ego/core/elog"
"github.com/gotomicro/ego/server/egin"
)

// export EGO_DEBUG=true && go run main.go --config=config.toml
// curl -i 'http://localhost:9006/hello?q=query' -X POST -H 'X-Ego-Uid: 9999' --data '{"id":1,"name":"lee"}'
func main() {
if err := ego.New().Invoker(func() error {
go func() {
time.Sleep(1 * time.Second)
startTime := time.Now()
ehttp.DefaultContainer().Build().R().Get("http://127.0.0.1:12345/hello")
fmt.Println("cost: ", time.Now().Sub(startTime))
}()

return nil
}).Serve(func() *egin.Component {
server := egin.Load("server.http").Build()
server.GET("/hello", func(c *gin.Context) {
time.Sleep(10 * time.Second)
//startTime := time.Now()
//ehttp.DefaultContainer().Build().R().SetContext(c.Request.Context()).Get("http://127.0.0.1:12345/longtime")
//fmt.Println("cost: ", time.Now().Sub(startTime))
c.JSON(200, "Hello EGO")
return
})

server.GET("/longtime", func(c *gin.Context) {
time.Sleep(10 * time.Second)
c.JSON(200, "Hello longtime")
return
})
return server
}()).Run(); err != nil {
elog.Panic("startup", elog.FieldErr(err))
}
}
File renamed without changes.
File renamed without changes.
39 changes: 31 additions & 8 deletions server/egin/component.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ import (
"sync"

"github.com/gin-gonic/gin"

"github.com/gotomicro/ego/core/constant"
"github.com/gotomicro/ego/core/elog"
"github.com/gotomicro/ego/server"
Expand Down Expand Up @@ -74,12 +73,16 @@ func (c *Component) PackageName() string {

// Init 初始化
func (c *Component) Init() error {
listener, err := net.Listen("tcp", c.config.Address())
if err != nil {
c.logger.Panic("new egin server err", elog.FieldErrKind("listen err"), elog.FieldErr(err))
var err error
if c.config.Network == "local" {
c.listener = newLocalListener()
} else {
c.listener, err = net.Listen(c.config.Network, c.config.Address())
if err != nil {
c.logger.Panic("new egin server err", elog.FieldErrKind("listen err"), elog.FieldErr(err))
}
}
c.config.Port = listener.Addr().(*net.TCPAddr).Port
c.listener = listener
c.config.Port = c.listener.Addr().(*net.TCPAddr).Port
return nil
}

Expand All @@ -99,11 +102,16 @@ func (c *Component) Start() error {
c.logger.Info("add route", elog.FieldMethod(route.Method), elog.String("path", route.Path))
}
}

// 因为start和stop在多个goroutine里,需要对Server上写锁
c.mu.Lock()
c.Server = &http.Server{
Addr: c.config.Address(),
Handler: c,
Addr: c.config.Address(),
//Handler: http.TimeoutHandler(c, 1*time.Second, "timeout"),
Handler: c,
ReadHeaderTimeout: c.config.ServerReadHeaderTimeout,
ReadTimeout: c.config.ServerReadTimeout,
WriteTimeout: c.config.ServerWriteTimeout,
}
c.mu.Unlock()
var err error
Expand Down Expand Up @@ -189,6 +197,11 @@ func (c *Component) GetEmbedWrapper() *EmbedWrapper {
return c.embedWrapper
}

// Listener listener信息
func (c *Component) Listener() net.Listener {
return c.listener
}

// EmbedWrapper 嵌入普通的静态资源的wrapper
type EmbedWrapper struct {
embedFs embed.FS // 静态资源
Expand All @@ -204,3 +217,13 @@ func (e *EmbedWrapper) Open(name string) (fs.File, error) {
file, err := e.embedFs.Open(fullName)
return file, err
}

func newLocalListener() net.Listener {
l, err := net.Listen("tcp", "127.0.0.1:0")
if err != nil {
if l, err = net.Listen("tcp6", "[::1]:0"); err != nil {
panic(fmt.Sprintf("httptest: failed to listen on a port: %v", err))
}
}
return l
}
Loading

0 comments on commit 6f445a5

Please sign in to comment.