1
0
mirror of https://github.com/go-kratos/kratos.git synced 2026-05-22 10:15:24 +02:00

refactor: optimize the code and use golangci-lint to check for any errors (#1298)

* feat: optimize the code and use golangci-lint to check for any errors

* fix: TestLogger unit test
This commit is contained in:
Xudong Cai
2021-08-16 10:35:08 +08:00
committed by GitHub
parent 3026f9490e
commit b44e47b087
16 changed files with 79 additions and 47 deletions
+2 -1
View File
@@ -10,4 +10,5 @@ linters:
- staticcheck - staticcheck
- govet - govet
- gosimple - gosimple
- gofmt - gofmt
- errcheck
+5 -2
View File
@@ -38,7 +38,7 @@ type App struct {
func New(opts ...Option) *App { func New(opts ...Option) *App {
options := options{ options := options{
ctx: context.Background(), ctx: context.Background(),
logger: log.DefaultLogger, logger: log.NewHelper(log.DefaultLogger),
sigs: []os.Signal{syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGINT}, sigs: []os.Signal{syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGINT},
registrarTimeout: 10 * time.Second, registrarTimeout: 10 * time.Second,
} }
@@ -114,7 +114,10 @@ func (a *App) Run() error {
case <-ctx.Done(): case <-ctx.Done():
return ctx.Err() return ctx.Err()
case <-c: case <-c:
a.Stop() err := a.Stop()
if err != nil {
a.opts.logger.Errorf("failed to app stop: %v", err)
}
} }
} }
}) })
+3 -3
View File
@@ -29,9 +29,9 @@ func Merge(parent1, parent2 context.Context) (context.Context, context.CancelFun
} }
select { select {
case <-parent1.Done(): case <-parent1.Done():
mc.finish(parent1.Err()) _ = mc.finish(parent1.Err())
case <-parent2.Done(): case <-parent2.Done():
mc.finish(parent2.Err()) _ = mc.finish(parent2.Err())
default: default:
go mc.wait() go mc.wait()
} }
@@ -57,7 +57,7 @@ func (mc *mergeCtx) wait() {
case <-mc.cancelCh: case <-mc.cancelCh:
err = context.Canceled err = context.Canceled
} }
mc.finish(err) _ = mc.finish(err)
} }
func (mc *mergeCtx) cancel() { func (mc *mergeCtx) cancel() {
+16 -16
View File
@@ -28,83 +28,83 @@ func (h *Helper) WithContext(ctx context.Context) *Helper {
// Log Print log by level and keyvals. // Log Print log by level and keyvals.
func (h *Helper) Log(level Level, keyvals ...interface{}) { func (h *Helper) Log(level Level, keyvals ...interface{}) {
h.logger.Log(level, keyvals...) _ = h.logger.Log(level, keyvals...)
} }
// Debug logs a message at debug level. // Debug logs a message at debug level.
func (h *Helper) Debug(a ...interface{}) { func (h *Helper) Debug(a ...interface{}) {
h.logger.Log(LevelDebug, "msg", fmt.Sprint(a...)) h.Log(LevelDebug, "msg", fmt.Sprint(a...))
} }
// Debugf logs a message at debug level. // Debugf logs a message at debug level.
func (h *Helper) Debugf(format string, a ...interface{}) { func (h *Helper) Debugf(format string, a ...interface{}) {
h.logger.Log(LevelDebug, "msg", fmt.Sprintf(format, a...)) h.Log(LevelDebug, "msg", fmt.Sprintf(format, a...))
} }
// Debugw logs a message at debug level. // Debugw logs a message at debug level.
func (h *Helper) Debugw(keyvals ...interface{}) { func (h *Helper) Debugw(keyvals ...interface{}) {
h.logger.Log(LevelDebug, keyvals...) h.Log(LevelDebug, keyvals...)
} }
// Info logs a message at info level. // Info logs a message at info level.
func (h *Helper) Info(a ...interface{}) { func (h *Helper) Info(a ...interface{}) {
h.logger.Log(LevelInfo, "msg", fmt.Sprint(a...)) h.Log(LevelInfo, "msg", fmt.Sprint(a...))
} }
// Infof logs a message at info level. // Infof logs a message at info level.
func (h *Helper) Infof(format string, a ...interface{}) { func (h *Helper) Infof(format string, a ...interface{}) {
h.logger.Log(LevelInfo, "msg", fmt.Sprintf(format, a...)) h.Log(LevelInfo, "msg", fmt.Sprintf(format, a...))
} }
// Infow logs a message at info level. // Infow logs a message at info level.
func (h *Helper) Infow(keyvals ...interface{}) { func (h *Helper) Infow(keyvals ...interface{}) {
h.logger.Log(LevelInfo, keyvals...) h.Log(LevelInfo, keyvals...)
} }
// Warn logs a message at warn level. // Warn logs a message at warn level.
func (h *Helper) Warn(a ...interface{}) { func (h *Helper) Warn(a ...interface{}) {
h.logger.Log(LevelWarn, "msg", fmt.Sprint(a...)) h.Log(LevelWarn, "msg", fmt.Sprint(a...))
} }
// Warnf logs a message at warnf level. // Warnf logs a message at warnf level.
func (h *Helper) Warnf(format string, a ...interface{}) { func (h *Helper) Warnf(format string, a ...interface{}) {
h.logger.Log(LevelWarn, "msg", fmt.Sprintf(format, a...)) h.Log(LevelWarn, "msg", fmt.Sprintf(format, a...))
} }
// Warnw logs a message at warnf level. // Warnw logs a message at warnf level.
func (h *Helper) Warnw(keyvals ...interface{}) { func (h *Helper) Warnw(keyvals ...interface{}) {
h.logger.Log(LevelWarn, keyvals...) h.Log(LevelWarn, keyvals...)
} }
// Error logs a message at error level. // Error logs a message at error level.
func (h *Helper) Error(a ...interface{}) { func (h *Helper) Error(a ...interface{}) {
h.logger.Log(LevelError, "msg", fmt.Sprint(a...)) h.Log(LevelError, "msg", fmt.Sprint(a...))
} }
// Errorf logs a message at error level. // Errorf logs a message at error level.
func (h *Helper) Errorf(format string, a ...interface{}) { func (h *Helper) Errorf(format string, a ...interface{}) {
h.logger.Log(LevelError, "msg", fmt.Sprintf(format, a...)) h.Log(LevelError, "msg", fmt.Sprintf(format, a...))
} }
// Errorw logs a message at error level. // Errorw logs a message at error level.
func (h *Helper) Errorw(keyvals ...interface{}) { func (h *Helper) Errorw(keyvals ...interface{}) {
h.logger.Log(LevelError, keyvals...) h.Log(LevelError, keyvals...)
} }
// Fatal logs a message at fatal level. // Fatal logs a message at fatal level.
func (h *Helper) Fatal(a ...interface{}) { func (h *Helper) Fatal(a ...interface{}) {
h.logger.Log(LevelFatal, "msg", fmt.Sprint(a...)) h.Log(LevelFatal, "msg", fmt.Sprint(a...))
os.Exit(1) os.Exit(1)
} }
// Fatalf logs a message at fatal level. // Fatalf logs a message at fatal level.
func (h *Helper) Fatalf(format string, a ...interface{}) { func (h *Helper) Fatalf(format string, a ...interface{}) {
h.logger.Log(LevelFatal, "msg", fmt.Sprintf(format, a...)) h.Log(LevelFatal, "msg", fmt.Sprintf(format, a...))
os.Exit(1) os.Exit(1)
} }
// Fatalw logs a message at fatal level. // Fatalw logs a message at fatal level.
func (h *Helper) Fatalw(keyvals ...interface{}) { func (h *Helper) Fatalw(keyvals ...interface{}) {
h.logger.Log(LevelFatal, keyvals...) h.Log(LevelFatal, keyvals...)
os.Exit(1) os.Exit(1)
} }
+2 -2
View File
@@ -38,9 +38,9 @@ func (l *stdLogger) Log(level Level, keyvals ...interface{}) error {
buf := l.pool.Get().(*bytes.Buffer) buf := l.pool.Get().(*bytes.Buffer)
buf.WriteString(level.String()) buf.WriteString(level.String())
for i := 0; i < len(keyvals); i += 2 { for i := 0; i < len(keyvals); i += 2 {
fmt.Fprintf(buf, " %s=%v", keyvals[i], keyvals[i+1]) _, _ = fmt.Fprintf(buf, " %s=%v", keyvals[i], keyvals[i+1])
} }
l.log.Output(4, buf.String()) _ = l.log.Output(4, buf.String())
buf.Reset() buf.Reset()
l.pool.Put(buf) l.pool.Put(buf)
return nil return nil
+2 -2
View File
@@ -32,7 +32,7 @@ func Server(logger log.Logger) middleware.Middleware {
reason = se.Reason reason = se.Reason
} }
level, stack := extractError(err) level, stack := extractError(err)
log.WithContext(ctx, logger).Log(level, _ = log.WithContext(ctx, logger).Log(level,
"kind", "server", "kind", "server",
"component", kind, "component", kind,
"operation", operation, "operation", operation,
@@ -68,7 +68,7 @@ func Client(logger log.Logger) middleware.Middleware {
reason = se.Reason reason = se.Reason
} }
level, stack := extractError(err) level, stack := extractError(err)
log.WithContext(ctx, logger).Log(level, _ = log.WithContext(ctx, logger).Log(level,
"kind", "client", "kind", "client",
"component", kind, "component", kind,
"operation", operation, "operation", operation,
+4 -2
View File
@@ -25,7 +25,7 @@ type options struct {
ctx context.Context ctx context.Context
sigs []os.Signal sigs []os.Signal
logger log.Logger logger *log.Helper
registrar registry.Registrar registrar registry.Registrar
registrarTimeout time.Duration registrarTimeout time.Duration
servers []transport.Server servers []transport.Server
@@ -63,7 +63,9 @@ func Context(ctx context.Context) Option {
// Logger with service logger. // Logger with service logger.
func Logger(logger log.Logger) Option { func Logger(logger log.Logger) Option {
return func(o *options) { o.logger = logger } return func(o *options) {
o.logger = log.NewHelper(logger)
}
} }
// Server with transport servers. // Server with transport servers.
+1 -1
View File
@@ -66,7 +66,7 @@ func TestLogger(t *testing.T) {
o := &options{} o := &options{}
v := xlog.NewStdLogger(log.Writer()) v := xlog.NewStdLogger(log.Writer())
Logger(v)(o) Logger(v)(o)
assert.Equal(t, v, o.logger) assert.Equal(t, xlog.NewHelper(v), o.logger)
} }
type mockServer struct{} type mockServer struct{}
+2 -2
View File
@@ -3,6 +3,7 @@ package grpc
import ( import (
"context" "context"
"crypto/tls" "crypto/tls"
"fmt"
"time" "time"
"github.com/go-kratos/kratos/v2/middleware" "github.com/go-kratos/kratos/v2/middleware"
@@ -106,8 +107,7 @@ func dial(ctx context.Context, insecure bool, opts ...ClientOption) (*grpc.Clien
ints = append(ints, options.ints...) ints = append(ints, options.ints...)
} }
var grpcOpts = []grpc.DialOption{ var grpcOpts = []grpc.DialOption{
//todo: grpc.WithBalancerName is deprecated. grpc.WithDefaultServiceConfig(fmt.Sprintf(`{"LoadBalancingPolicy": "%s"}`, roundrobin.Name)),
grpc.WithBalancerName(roundrobin.Name), //nolint:staticcheck
grpc.WithChainUnaryInterceptor(ints...), grpc.WithChainUnaryInterceptor(ints...),
} }
if options.discovery != nil { if options.discovery != nil {
+4 -1
View File
@@ -24,9 +24,12 @@ func (d *directBuilder) Build(target resolver.Target, cc resolver.ClientConn, op
for _, addr := range strings.Split(target.Endpoint, ",") { for _, addr := range strings.Split(target.Endpoint, ",") {
addrs = append(addrs, resolver.Address{Addr: addr}) addrs = append(addrs, resolver.Address{Addr: addr})
} }
cc.UpdateState(resolver.State{ err := cc.UpdateState(resolver.State{
Addresses: addrs, Addresses: addrs,
}) })
if err != nil {
return nil, err
}
return newDirectResolver(), nil return newDirectResolver(), nil
} }
@@ -66,14 +66,20 @@ func (r *discoveryResolver) update(ins []*registry.ServiceInstance) {
r.log.Warnf("[resolver] Zero endpoint found,refused to write, instances: %v", ins) r.log.Warnf("[resolver] Zero endpoint found,refused to write, instances: %v", ins)
return return
} }
r.cc.UpdateState(resolver.State{Addresses: addrs}) err := r.cc.UpdateState(resolver.State{Addresses: addrs})
if err != nil {
r.log.Errorf("[resolver] failed to update state: %s", err)
}
b, _ := json.Marshal(ins) b, _ := json.Marshal(ins)
r.log.Infof("[resolver] update instances: %s", b) r.log.Infof("[resolver] update instances: %s", b)
} }
func (r *discoveryResolver) Close() { func (r *discoveryResolver) Close() {
r.cancel() r.cancel()
r.w.Stop() err := r.w.Stop()
if err != nil {
r.log.Errorf("[resolver] failed to watch top: %s", err)
}
} }
func (r *discoveryResolver) ResolveNow(options resolver.ResolveNowOptions) {} func (r *discoveryResolver) ResolveNow(options resolver.ResolveNowOptions) {}
+2 -2
View File
@@ -155,7 +155,7 @@ func (s *Server) Endpoint() (*url.URL, error) {
} }
addr, err := host.Extract(s.address, lis) addr, err := host.Extract(s.address, lis)
if err != nil { if err != nil {
lis.Close() _ = lis.Close()
s.err = err s.err = err
return return
} }
@@ -211,7 +211,7 @@ func (s *Server) unaryServerInterceptor() grpc.UnaryServerInterceptor {
} }
reply, err := h(ctx, req) reply, err := h(ctx, req)
if len(replyHeader) > 0 { if len(replyHeader) > 0 {
grpc.SetHeader(ctx, replyHeader) _ = grpc.SetHeader(ctx, replyHeader)
} }
return reply, err return reply, err
} }
+5 -2
View File
@@ -45,7 +45,10 @@ func DefaultResponseEncoder(w http.ResponseWriter, r *http.Request, v interface{
return err return err
} }
w.Header().Set("Content-Type", httputil.ContentType(codec.Name())) w.Header().Set("Content-Type", httputil.ContentType(codec.Name()))
w.Write(data) _, err = w.Write(data)
if err != nil {
return err
}
return nil return nil
} }
@@ -60,7 +63,7 @@ func DefaultErrorEncoder(w http.ResponseWriter, r *http.Request, err error) {
} }
w.Header().Set("Content-Type", httputil.ContentType(codec.Name())) w.Header().Set("Content-Type", httputil.ContentType(codec.Name()))
w.WriteHeader(int(se.Code)) w.WriteHeader(int(se.Code))
w.Write(body) _, _ = w.Write(body)
} }
// CodecForRequest get encoding.Codec via http.Request // CodecForRequest get encoding.Codec via http.Request
+8 -2
View File
@@ -120,14 +120,20 @@ func (c *wrapper) XML(code int, v interface{}) error {
func (c *wrapper) String(code int, text string) error { func (c *wrapper) String(code int, text string) error {
c.res.Header().Set("Content-Type", "text/plain") c.res.Header().Set("Content-Type", "text/plain")
c.res.WriteHeader(code) c.res.WriteHeader(code)
c.res.Write([]byte(text)) _, err := c.res.Write([]byte(text))
if err != nil {
return err
}
return nil return nil
} }
func (c *wrapper) Blob(code int, contentType string, data []byte) error { func (c *wrapper) Blob(code int, contentType string, data []byte) error {
c.res.Header().Set("Content-Type", contentType) c.res.Header().Set("Content-Type", contentType)
c.res.WriteHeader(code) c.res.WriteHeader(code)
c.res.Write(data) _, err := c.res.Write(data)
if err != nil {
return err
}
return nil return nil
} }
+10 -4
View File
@@ -87,12 +87,18 @@ func newResolver(ctx context.Context, discovery registry.Discovery, target *Targ
select { select {
case err := <-done: case err := <-done:
if err != nil { if err != nil {
watcher.Stop() err := watcher.Stop()
if err != nil {
r.logger.Errorf("failed to http client watch stop: %v", target)
}
return nil, err return nil, err
} }
case <-ctx.Done(): case <-ctx.Done():
r.logger.Errorf("http client watch service %v reaching context deadline!", target) r.logger.Errorf("http client watch service %v reaching context deadline!", target)
watcher.Stop() err := watcher.Stop()
if err != nil {
r.logger.Errorf("failed to http client watch stop: %v", target)
}
return nil, ctx.Err() return nil, ctx.Err()
} }
} }
@@ -116,12 +122,12 @@ func newResolver(ctx context.Context, discovery registry.Discovery, target *Targ
func (r *resolver) update(services []*registry.ServiceInstance) { func (r *resolver) update(services []*registry.ServiceInstance) {
var nodes []*registry.ServiceInstance var nodes []*registry.ServiceInstance
for _, in := range services { for _, in := range services {
endpoint, err := endpoint.ParseEndpoint(in.Endpoints, "http", !r.insecure) ept, err := endpoint.ParseEndpoint(in.Endpoints, "http", !r.insecure)
if err != nil { if err != nil {
r.logger.Errorf("Failed to parse (%v) discovery endpoint: %v error %v", r.target, in.Endpoints, err) r.logger.Errorf("Failed to parse (%v) discovery endpoint: %v error %v", r.target, in.Endpoints, err)
continue continue
} }
if endpoint == "" { if ept == "" {
continue continue
} }
nodes = append(nodes, in) nodes = append(nodes, in)
+5 -3
View File
@@ -32,20 +32,22 @@ type Header interface {
// Transporter is transport context value interface. // Transporter is transport context value interface.
type Transporter interface { type Transporter interface {
// Kind transporter
// grpc // grpc
// http // http
Kind() Kind Kind() Kind
// Endpoint return server or client endpoint
// Server Transport: grpc://127.0.0.1:9000 // Server Transport: grpc://127.0.0.1:9000
// Client Transport: discovery:///provider-demo // Client Transport: discovery:///provider-demo
Endpoint() string Endpoint() string
// Service full method selector generated by protobuf // Operation Service full method selector generated by protobuf
// example: /helloworld.Greeter/SayHello // example: /helloworld.Greeter/SayHello
Operation() string Operation() string
// request header // RequestHeader return transport request header
// http: http.Header // http: http.Header
// grpc: metadata.MD // grpc: metadata.MD
RequestHeader() Header RequestHeader() Header
// reply header // ReplyHeader return transport reply/response header
// only valid for server transport // only valid for server transport
// http: http.Header // http: http.Header
// grpc: metadata.MD // grpc: metadata.MD