ci: add golangci-lint (#675)

pull/680/head
王明俊 4 years ago committed by GitHub
parent e39d0d241e
commit a631cbddf4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 24
      .github/workflows/go.yml
  2. 138
      .golangci.yml
  3. 2
      pkg/cache/memcache/ascii_conn_test.go
  4. 2
      pkg/cache/memcache/conn.go
  5. 4
      pkg/cache/memcache/conn_test.go
  6. 2
      pkg/cache/memcache/pool_conn_test.go
  7. 4
      pkg/cache/redis/mock.go
  8. 3
      pkg/cache/redis/pipeline.go
  9. 1
      pkg/cache/redis/pool_test.go
  10. 1
      pkg/cache/redis/redis_test.go
  11. 1
      pkg/cache/redis/scan.go
  12. 3
      pkg/cache/redis/scan_test.go
  13. 1
      pkg/cache/redis/script_test.go
  14. 9
      pkg/cache/redis/trace_test.go
  15. 8
      pkg/conf/env/env.go
  16. 4
      pkg/conf/paladin/apollo/internal/mockserver/mockserver.go
  17. 2
      pkg/conf/paladin/file.go
  18. 2
      pkg/conf/paladin/value_test.go
  19. 2
      pkg/container/group/group.go
  20. 8
      pkg/container/group/group_test.go
  21. 2
      pkg/container/pool/list_test.go
  22. 2
      pkg/container/pool/slice_test.go
  23. 2
      pkg/container/queue/aqm/codel_test.go
  24. 2
      pkg/database/hbase/hbase.go
  25. 2
      pkg/log/internal/filewriter/option.go
  26. 1
      pkg/log/log_test.go
  27. 4
      pkg/log/pattern.go
  28. 10
      pkg/naming/etcd/etcd.go
  29. 8
      pkg/naming/opt.go
  30. 70
      pkg/naming/opt_test.go
  31. 12
      pkg/naming/zookeeper/zookeeper.go
  32. 1
      pkg/net/http/blademaster/binding/binding_test.go
  33. 2
      pkg/net/http/blademaster/render/render.go
  34. 10
      pkg/net/http/blademaster/tree.go
  35. 12
      pkg/net/metadata/key.go
  36. 1
      pkg/net/metadata/metadata_test.go
  37. 2
      pkg/net/rpc/warden/balancer/p2c/p2c_test.go
  38. 24
      pkg/net/rpc/warden/balancer/wrr/wrr.go
  39. 1
      pkg/net/rpc/warden/client.go
  40. 1
      pkg/net/rpc/warden/exapmle_test.go
  41. 2
      pkg/net/rpc/warden/internal/benchmark/bench/client/client.go
  42. 1
      pkg/net/rpc/warden/internal/benchmark/helloworld/client/greeter_client.go
  43. 1
      pkg/net/rpc/warden/internal/benchmark/helloworld/server/greeter_server.go
  44. 4
      pkg/net/rpc/warden/internal/status/status_test.go
  45. 3
      pkg/net/rpc/warden/ratelimiter/ratelimiter.go
  46. 2
      pkg/net/rpc/warden/recovery.go
  47. 2
      pkg/net/rpc/warden/resolver/direct/direct.go
  48. 1
      pkg/net/rpc/warden/resolver/resolver.go
  49. 4
      pkg/net/rpc/warden/server.go
  50. 3
      pkg/net/rpc/warden/server_test.go
  51. 1
      pkg/net/rpc/warden/validate.go
  52. 6
      pkg/net/trace/context.go
  53. 4
      pkg/net/trace/jaeger/http_transport.go
  54. 6
      pkg/net/trace/zipkin/zipkin.go
  55. 3
      pkg/ratelimit/bbr/bbr_test.go
  56. 3
      pkg/stat/metric/window_test.go
  57. 32
      pkg/sync/errgroup/example_test.go
  58. 4
      tool/kratos-gen-bts/main.go
  59. 2
      tool/kratos-gen-mc/main.go
  60. 7
      tool/protobuf/pkg/generator/generator.go
  61. 6
      tool/protobuf/pkg/generator/helper.go
  62. 5
      tool/protobuf/pkg/generator/http.go
  63. 3
      tool/protobuf/pkg/naming/naming.go
  64. 4
      tool/protobuf/pkg/project/project.go
  65. 3
      tool/protobuf/pkg/tag/ext_tags.go
  66. 11
      tool/protobuf/protoc-gen-bm/generator/generator.go
  67. 5
      tool/protobuf/protoc-gen-bswagger/generator.go
  68. 5
      tool/protobuf/protoc-gen-ecode/generator/generator.go

@ -26,6 +26,11 @@ jobs:
go-version: ${{ matrix.go_version }} go-version: ${{ matrix.go_version }}
id: go id: go
- name: Set up Env
run: |
echo "GOPATH=$(go env GOPATH)" >> $GITHUB_ENV
echo "$(go env GOPATH)/bin" >> $GITHUB_PATH
- name: Check out code into the Go module directory - name: Check out code into the Go module directory
uses: actions/checkout@v2 uses: actions/checkout@v2
@ -51,6 +56,11 @@ jobs:
- name: Build - name: Build
run: go build ./... run: go build ./...
- name: Golangci
run: |
curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.33.0
golangci-lint run --out-format=github-actions
- name: Test - name: Test
run: go test ./... -coverprofile=coverage.txt -covermode=atomic run: go test ./... -coverprofile=coverage.txt -covermode=atomic
@ -76,20 +86,6 @@ jobs:
go-version: ${{ matrix.go_version }} go-version: ${{ matrix.go_version }}
id: go id: go
- name: Check out code into the Go module directory
uses: actions/checkout@v2
- name: Cache dependencies
uses: actions/cache@v2
with:
# Cache
path: ~/go/pkg/mod
# Cache key
key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}
# An ordered list of keys to use for restoring the cache if no cache hit occurred for key
restore-keys: |
${{ runner.os }}-go-
- name: Set up Env - name: Set up Env
run: | run: |
echo "GOPATH=$(go env GOPATH)" >> $GITHUB_ENV echo "GOPATH=$(go env GOPATH)" >> $GITHUB_ENV

@ -0,0 +1,138 @@
# [index] https://github.com/golangci/golangci-lint
# [example] https://github.com/golangci/golangci-lint/blob/master/.golangci.example.yml
run:
tests: true #是否包含测试文件
issues-exit-code: 0
linters-settings:
# govet:
# check-shadowing: true #启用了对同名变量名在函数中被隐藏的警告
gofmt:
simplify: true
goimports:
local-prefixes: "github.com/go-kratos/kratos" # 格式化代码时,本地代码单独块
gocritic:
enabled-tags:
- diagnostic
# - style
# - performance
disabled-checks:
#- wrapperFunc
#- dupImport # https://github.com/go-critic/go-critic/issues/845
- commentedOutCode
- ifElseChain
- elseif
settings: # settings passed to gocritic
captLocal: # must be valid enabled check name
paramsOnly: true
# rangeValCopy:
# sizeThreshold: 32
lll:
line-length: 500
funlen:
lines: 500
statements: 500
gocyclo:
min-complexity: 100
linters:
disable-all: true
enable:
# https://golangci-lint.run/usage/configuration/
- bodyclose # http.resp.body 内存泄露检查
- deadcode # 无用的变量声明检查
- depguard # 自定义依赖包白、黑名单 控制导包
- dogsled # 空白标识符的赋值检查 默认为2
#- dupl # 重复代码检查
- errcheck # 未判断的error返回值检查
- funlen # 接口最大行数检查
#- gochecknoinits # 包中定义init()函数检查
#- goconst # 常量字符串检查
- gocritic #
- gocyclo # 代码复杂度检查
- gofmt # 优化代码
- goimports # 自动增加和删除包
- golint # 代码风格检查
#- gomnd # 参数、赋值、用例、条件、操作和返回语句检查
- goprintffuncname #
- gosec # 源代码安全检查
- gosimple # 可以优化的代码检查 注:该工具已整合到staticcheck中
- govet # 代码正确性检查
- ineffassign # 无效赋值检查
- interfacer # 建议接口的使用方式
- lll # 行最大字符
- misspell # 拼写错误检查
- nakedret # 大于指定函数长度的函数的无约束返回值检查
- nolintlint #
- rowserrcheck # sql.Rows.Err检查
- scopelint # 循环变量引用检查,排除test文件
- staticcheck # 静态检查
- structcheck # 结构体字段的约束条件检查
- stylecheck # 代码风格检查
- typecheck # 类型检查
- unconvert # 类型转换检查
- unparam # 未使用参数检查
#- unused # 未使用变量、函数检查
- varcheck # 报告exported变量和常量
- whitespace # 空行检查
severity:
# Default value is empty string.
# Set the default severity for issues. If severity rules are defined and the issues
# do not match or no severity is provided to the rule this will be the default
# severity applied. Severities should match the supported severity names of the
# selected out format.
# - Code climate: https://docs.codeclimate.com/docs/issues#issue-severity
# - Checkstyle: https://checkstyle.sourceforge.io/property_types.html#severity
# - Github: https://help.github.com/en/actions/reference/workflow-commands-for-github-actions#setting-an-error-message
default-severity: error
# The default value is false.
# If set to true severity-rules regular expressions become case sensitive.
case-sensitive: false
# Default value is empty list.
# When a list of severity rules are provided, severity information will be added to lint
# issues. Severity rules have the same filtering capability as exclude rules except you
# are allowed to specify one matcher per severity rule.
# Only affects out formats that support setting severity information.
rules:
- linters:
- dupl
- nakedret
- lll
- misspell
- goprintffuncname
- stylecheck
- deadcode
- whitespace
- unparam
- golint
- gosec
- staticcheck
- structcheck
- gocritic
- errcheck
- rowserrcheck
- unconvert
- gosimple
- rowserrcheck
- ineffassign
severity: warning
issues:
# Excluding configuration per-path, per-linter, per-text and per-source
exclude-rules:
- path: _test\.go
linters:
- gomnd
- gocyclo
- errcheck
- dupl
- gosec
- scopelint
- interfacer
- govet
# https://github.com/go-critic/go-critic/issues/926
- linters:
- gocritic
text: "unnecessaryDefer:"

@ -167,10 +167,8 @@ func TestASCIIConnGetMulti(t *testing.T) {
reply = r["get_multi_2"] reply = r["get_multi_2"]
compareItem(t, reply, test.a[1]) compareItem(t, reply, test.a[1])
} }
}) })
} }
} }
func TestASCIIConnSet(t *testing.T) { func TestASCIIConnSet(t *testing.T) {

@ -84,7 +84,7 @@ func Dial(network, address string, options ...DialOption) (Conn, error) {
return nil, pkgerr.WithStack(err) return nil, pkgerr.WithStack(err)
} }
pconn, err := newASCIIConn(netConn, do.readTimeout, do.writeTimeout) pconn, err := newASCIIConn(netConn, do.readTimeout, do.writeTimeout)
return &conn{pconn: pconn, ed: newEncodeDecoder()}, nil return &conn{pconn: pconn, ed: newEncodeDecoder()}, err
} }
type conn struct { type conn struct {

@ -5,8 +5,9 @@ import (
"encoding/json" "encoding/json"
"testing" "testing"
test "github.com/go-kratos/kratos/pkg/cache/memcache/test"
"github.com/gogo/protobuf/proto" "github.com/gogo/protobuf/proto"
test "github.com/go-kratos/kratos/pkg/cache/memcache/test"
) )
func TestConnRaw(t *testing.T) { func TestConnRaw(t *testing.T) {
@ -120,7 +121,6 @@ func TestConnSerialization(t *testing.T) {
t.Fatalf("compare failed error, %v %v", tc.a.Object.(*TestObj), no) t.Fatalf("compare failed error, %v %v", tc.a.Object.(*TestObj), no)
} }
} }
} }
}) })
} }

@ -404,7 +404,6 @@ func TestNewPool(t *testing.T) {
} }
func TestPool_Get(t *testing.T) { func TestPool_Get(t *testing.T) {
type args struct { type args struct {
ctx context.Context ctx context.Context
} }
@ -474,7 +473,6 @@ func TestPool_Get(t *testing.T) {
} }
func TestPool_Close(t *testing.T) { func TestPool_Close(t *testing.T) {
type args struct { type args struct {
ctx context.Context ctx context.Context
} }

@ -19,7 +19,9 @@ func (m MockErr) Err() error { return m.Error }
func (m MockErr) Close() error { return m.Error } func (m MockErr) Close() error { return m.Error }
// Do . // Do .
func (m MockErr) Do(commandName string, args ...interface{}) (interface{}, error) { return nil, m.Error } func (m MockErr) Do(commandName string, args ...interface{}) (interface{}, error) {
return nil, m.Error
}
// Send . // Send .
func (m MockErr) Send(commandName string, args ...interface{}) error { return m.Error } func (m MockErr) Send(commandName string, args ...interface{}) error { return m.Error }

@ -51,7 +51,6 @@ type cmd struct {
func (p *pipeliner) Send(commandName string, args ...interface{}) { func (p *pipeliner) Send(commandName string, args ...interface{}) {
p.cmds = append(p.cmds, &cmd{commandName: commandName, args: args}) p.cmds = append(p.cmds, &cmd{commandName: commandName, args: args})
return
} }
func (p *pipeliner) Exec(ctx context.Context) (rs *Replies, err error) { func (p *pipeliner) Exec(ctx context.Context) (rs *Replies, err error) {
@ -64,7 +63,7 @@ func (p *pipeliner) Exec(ctx context.Context) (rs *Replies, err error) {
for len(p.cmds) > 0 { for len(p.cmds) > 0 {
cmd := p.cmds[0] cmd := p.cmds[0]
p.cmds = p.cmds[1:] p.cmds = p.cmds[1:]
if err := c.Send(cmd.commandName, cmd.args...); err != nil { if err = c.Send(cmd.commandName, cmd.args...); err != nil {
p.cmds = p.cmds[:0] p.cmds = p.cmds[:0]
return nil, err return nil, err
} }

@ -128,7 +128,6 @@ func TestPoolReuse(t *testing.T) {
c2.Do("PING") c2.Do("PING")
c1.Close() c1.Close()
c2.Close() c2.Close()
} }
d.check("before close", p, 2, 2) d.check("before close", p, 2, 2)

@ -219,7 +219,6 @@ func TestRedis_Do(t *testing.T) {
} }
func TestRedis_Conn(t *testing.T) { func TestRedis_Conn(t *testing.T) {
type args struct { type args struct {
ctx context.Context ctx context.Context
} }

@ -326,7 +326,6 @@ var (
) )
func structSpecForType(t reflect.Type) *structSpec { func structSpecForType(t reflect.Type) *structSpec {
structSpecMutex.RLock() structSpecMutex.RLock()
ss, found := structSpecCache[t] ss, found := structSpecCache[t]
structSpecMutex.RUnlock() structSpecMutex.RUnlock()

@ -171,7 +171,6 @@ var scanStructTests = []struct {
func TestScanStruct(t *testing.T) { func TestScanStruct(t *testing.T) {
for _, tt := range scanStructTests { for _, tt := range scanStructTests {
var reply []interface{} var reply []interface{}
for _, v := range tt.reply { for _, v := range tt.reply {
reply = append(reply, []byte(v)) reply = append(reply, []byte(v))
@ -280,7 +279,6 @@ var scanSliceTests = []struct {
func TestScanSlice(t *testing.T) { func TestScanSlice(t *testing.T) {
for _, tt := range scanSliceTests { for _, tt := range scanSliceTests {
typ := reflect.ValueOf(tt.dest).Type() typ := reflect.ValueOf(tt.dest).Type()
dest := reflect.New(typ) dest := reflect.New(typ)
@ -417,7 +415,6 @@ func ExampleArgs() {
} }
for _, id := range []string{"id1", "id2"} { for _, id := range []string{"id1", "id2"} {
v, err := Values(c.Do("HGETALL", id)) v, err := Values(c.Do("HGETALL", id))
if err != nil { if err != nil {
fmt.Println(err) fmt.Println(err)

@ -99,5 +99,4 @@ func TestScript(t *testing.T) {
if !reflect.DeepEqual(v, reply) { if !reflect.DeepEqual(v, reply) {
t.Errorf("s.Send(c, ..); c.Receive() = %v, want %v", v, reply) t.Errorf("s.Send(c, ..); c.Receive() = %v, want %v", v, reply)
} }
} }

@ -6,11 +6,12 @@ import (
"testing" "testing"
"time" "time"
"github.com/go-kratos/kratos/pkg/net/trace"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"github.com/go-kratos/kratos/pkg/net/trace"
) )
const testTraceSlowLogThreshold = time.Duration(250 * time.Millisecond) const testTraceSlowLogThreshold = 250 * time.Millisecond
type mockTrace struct { type mockTrace struct {
tags []trace.Tag tags []trace.Tag
@ -181,7 +182,7 @@ func BenchmarkTraceConn(b *testing.B) {
t := &traceConn{ t := &traceConn{
Conn: c, Conn: c,
connTags: []trace.Tag{trace.TagString(trace.TagPeerAddress, "abc")}, connTags: []trace.Tag{trace.TagString(trace.TagPeerAddress, "abc")},
slowLogThreshold: time.Duration(1 * time.Second), slowLogThreshold: 1 * time.Second,
} }
c2 := t.WithContext(context.TODO()) c2 := t.WithContext(context.TODO())
if _, err := c2.Do("PING"); err != nil { if _, err := c2.Do("PING"); err != nil {
@ -199,7 +200,7 @@ func TestTraceConnPending(t *testing.T) {
tc := &traceConn{ tc := &traceConn{
Conn: c, Conn: c,
connTags: []trace.Tag{trace.TagString(trace.TagPeerAddress, "abc")}, connTags: []trace.Tag{trace.TagString(trace.TagPeerAddress, "abc")},
slowLogThreshold: time.Duration(1 * time.Second), slowLogThreshold: 1 * time.Second,
} }
err = tc.Send("SET", "a", "x") err = tc.Send("SET", "a", "x")
if err != nil { if err != nil {

@ -28,9 +28,9 @@ const (
// env configuration. // env configuration.
var ( var (
// Region avaliable region where app at. // Region available region where app at.
Region string Region string
// Zone avaliable zone where app at. // Zone available zone where app at.
Zone string Zone string
// Hostname machine hostname. // Hostname machine hostname.
Hostname string Hostname string
@ -59,8 +59,8 @@ func init() {
func addFlag(fs *flag.FlagSet) { func addFlag(fs *flag.FlagSet) {
// env // env
fs.StringVar(&Region, "region", defaultString("REGION", _region), "avaliable region. or use REGION env variable, value: sh etc.") fs.StringVar(&Region, "region", defaultString("REGION", _region), "available region. or use REGION env variable, value: sh etc.")
fs.StringVar(&Zone, "zone", defaultString("ZONE", _zone), "avaliable zone. or use ZONE env variable, value: sh001/sh002 etc.") fs.StringVar(&Zone, "zone", defaultString("ZONE", _zone), "available zone. or use ZONE env variable, value: sh001/sh002 etc.")
fs.StringVar(&AppID, "appid", os.Getenv("APP_ID"), "appid is global unique application id, register by service tree. or use APP_ID env variable.") fs.StringVar(&AppID, "appid", os.Getenv("APP_ID"), "appid is global unique application id, register by service tree. or use APP_ID env variable.")
fs.StringVar(&DeployEnv, "deploy.env", defaultString("DEPLOY_ENV", _deployEnv), "deploy env. or use DEPLOY_ENV env variable, value: dev/fat1/uat/pre/prod etc.") fs.StringVar(&DeployEnv, "deploy.env", defaultString("DEPLOY_ENV", _deployEnv), "deploy env. or use DEPLOY_ENV env variable, value: dev/fat1/uat/pre/prod etc.")
fs.StringVar(&Color, "deploy.color", os.Getenv("DEPLOY_COLOR"), "deploy.color is the identification of different experimental group.") fs.StringVar(&Color, "deploy.color", os.Getenv("DEPLOY_COLOR"), "deploy.color is the identification of different experimental group.")

@ -65,8 +65,8 @@ func (s *mockServer) ConfigHandler(rw http.ResponseWriter, req *http.Request) {
var namespace, releaseKey = strings.Split(strs[4], "?")[0], req.FormValue("releaseKey") var namespace, releaseKey = strings.Split(strs[4], "?")[0], req.FormValue("releaseKey")
config := s.Get(namespace) config := s.Get(namespace)
var result = result{NamespaceName: namespace, Configurations: config, ReleaseKey: releaseKey} ret := result{NamespaceName: namespace, Configurations: config, ReleaseKey: releaseKey}
bts, err := json.Marshal(&result) bts, err := json.Marshal(&ret)
if err != nil { if err != nil {
rw.WriteHeader(http.StatusInternalServerError) rw.WriteHeader(http.StatusInternalServerError)
return return

@ -87,7 +87,7 @@ func loadValue(fpath string) (*Value, error) {
// conf = /data/conf/app/ // conf = /data/conf/app/
// conf = /data/conf/app/xxx.toml // conf = /data/conf/app/xxx.toml
func NewFile(base string) (Client, error) { func NewFile(base string) (Client, error) {
// paltform slash // platform slash
base = filepath.FromSlash(base) base = filepath.FromSlash(base)
paths, err := readAllPaths(base) paths, err := readAllPaths(base)

@ -36,7 +36,7 @@ func TestValue(t *testing.T) {
"text", "text",
}, },
{ {
time.Duration(time.Second * 10), time.Second * 10,
"10s", "10s",
}, },
{ {

@ -18,7 +18,7 @@ func NewGroup(new func() interface{}) *Group {
panic("container.group: can't assign a nil to the new function") panic("container.group: can't assign a nil to the new function")
} }
return &Group{ return &Group{
new: new, new: new,
objs: make(map[string]interface{}), objs: make(map[string]interface{}),
} }
} }

@ -21,7 +21,6 @@ func TestGroupGet(t *testing.T) {
v = g.Get("/x/internal/dummy/user") v = g.Get("/x/internal/dummy/user")
assert.Equal(t, 1, v.(int)) assert.Equal(t, 1, v.(int))
assert.Equal(t, 2, count) assert.Equal(t, 2, count)
} }
func TestGroupReset(t *testing.T) { func TestGroupReset(t *testing.T) {
@ -36,7 +35,7 @@ func TestGroupReset(t *testing.T) {
}) })
length := 0 length := 0
for _,_ = range g.objs { for range g.objs {
length++ length++
} }
@ -52,16 +51,15 @@ func TestGroupClear(t *testing.T) {
}) })
g.Get("/x/internal/dummy/user") g.Get("/x/internal/dummy/user")
length := 0 length := 0
for _,_ = range g.objs { for range g.objs {
length++ length++
} }
assert.Equal(t, 1, length) assert.Equal(t, 1, length)
g.Clear() g.Clear()
length = 0 length = 0
for _,_ = range g.objs { for range g.objs {
length++ length++
} }
assert.Equal(t, 0, length) assert.Equal(t, 0, length)
} }

@ -139,7 +139,7 @@ func TestListPoolExhausted(t *testing.T) {
conn, err := pool.Get(context.TODO()) conn, err := pool.Get(context.TODO())
assert.Nil(t, err) assert.Nil(t, err)
_, err = pool.Get(ctx) _, err = pool.Get(ctx)
// config active == 1, so no avaliable conns make connection exhausted. // config active == 1, so no available conns make connection exhausted.
assert.NotNil(t, err) assert.NotNil(t, err)
pool.Put(context.TODO(), conn, false) pool.Put(context.TODO(), conn, false)
_, err = pool.Get(ctx) _, err = pool.Get(ctx)

@ -167,7 +167,7 @@ func TestSlicePoolExhausted(t *testing.T) {
conn, err := pool.Get(context.TODO()) conn, err := pool.Get(context.TODO())
assert.Nil(t, err) assert.Nil(t, err)
_, err = pool.Get(ctx) _, err = pool.Get(ctx)
// config active == 1, so no avaliable conns make connection exhausted. // config active == 1, so no available conns make connection exhausted.
assert.NotNil(t, err) assert.NotNil(t, err)
pool.Put(context.TODO(), conn, false) pool.Put(context.TODO(), conn, false)
_, err = pool.Get(ctx) _, err = pool.Get(ctx)

@ -36,7 +36,6 @@ func TestCoDel200(t *testing.T) {
testPush(q, qps, delay, drop, tm) testPush(q, qps, delay, drop, tm)
fmt.Printf("qps %v process time %v drop %d timeout %d \n", int64(time.Second/qps), delay, *drop, *tm) fmt.Printf("qps %v process time %v drop %d timeout %d \n", int64(time.Second/qps), delay, *drop, *tm)
time.Sleep(time.Second) time.Sleep(time.Second)
} }
func TestCoDel100(t *testing.T) { func TestCoDel100(t *testing.T) {
@ -46,7 +45,6 @@ func TestCoDel100(t *testing.T) {
delay := time.Millisecond * 1000 delay := time.Millisecond * 1000
testPush(q, qps, delay, drop, tm) testPush(q, qps, delay, drop, tm)
fmt.Printf("qps %v process time %v drop %d timeout %d \n", int64(time.Second/qps), delay, *drop, *tm) fmt.Printf("qps %v process time %v drop %d timeout %d \n", int64(time.Second/qps), delay, *drop, *tm)
} }
func TestCoDel50(t *testing.T) { func TestCoDel50(t *testing.T) {

@ -285,7 +285,7 @@ func (c *Client) Ping(ctx context.Context) (err error) {
if c.config.TestRowKey != "" { if c.config.TestRowKey != "" {
testRowKey = c.config.TestRowKey testRowKey = c.config.TestRowKey
} }
values := map[string]map[string][]byte{"test": map[string][]byte{"test": []byte("test")}} values := map[string]map[string][]byte{"test": {"test": []byte("test")}}
_, err = c.PutStr(ctx, "test", testRowKey, values) _, err = c.PutStr(ctx, "test", testRowKey, values)
return return
} }

@ -59,7 +59,7 @@ func MaxSize(n int64) Option {
} }
} }
// ChanSize set internal chan size default 8192 use about 64k memory on x64 platfrom static, // ChanSize set internal chan size default 8192 use about 64k memory on x64 platform static,
// because filewriter has internal object pool, change chan size bigger may cause filewriter use // because filewriter has internal object pool, change chan size bigger may cause filewriter use
// a lot of memory, because sync.Pool can't set expire time memory won't free until program exit. // a lot of memory, because sync.Pool can't set expire time memory won't free until program exit.
func ChanSize(n int) Option { func ChanSize(n int) Option {

@ -92,7 +92,6 @@ func TestLogWithMirror(t *testing.T) {
Infov(mdcontext, KV("key1", "val1"), KV("key2", ""), KV("log", "log content"), KV("msg", "msg content")) Infov(mdcontext, KV("key1", "val1"), KV("key2", ""), KV("log", "log content"), KV("msg", "msg content"))
Infov(context.Background(), KV("key1", "val1"), KV("key2", ""), KV("log", "log content"), KV("msg", "msg content")) Infov(context.Background(), KV("key1", "val1"), KV("key2", ""), KV("log", "log content"), KV("msg", "msg content"))
} }
func TestOverwriteSouce(t *testing.T) { func TestOverwriteSouce(t *testing.T) {

@ -62,7 +62,7 @@ type pattern struct {
bufPool sync.Pool bufPool sync.Pool
} }
// Render implemet Formater // Render implements Formater
func (p *pattern) Render(w io.Writer, d map[string]interface{}) error { func (p *pattern) Render(w io.Writer, d map[string]interface{}) error {
builder := p.bufPool.Get().(*strings.Builder) builder := p.bufPool.Get().(*strings.Builder)
defer func() { defer func() {
@ -77,7 +77,7 @@ func (p *pattern) Render(w io.Writer, d map[string]interface{}) error {
return err return err
} }
// Render implemet Formater as string // Render implements Formater as string
func (p *pattern) RenderString(d map[string]interface{}) string { func (p *pattern) RenderString(d map[string]interface{}) string {
builder := p.bufPool.Get().(*strings.Builder) builder := p.bufPool.Get().(*strings.Builder)
defer func() { defer func() {

@ -12,11 +12,12 @@ import (
"sync/atomic" "sync/atomic"
"time" "time"
"github.com/go-kratos/kratos/pkg/log"
"github.com/go-kratos/kratos/pkg/naming"
"go.etcd.io/etcd/clientv3" "go.etcd.io/etcd/clientv3"
"go.etcd.io/etcd/mvcc/mvccpb" "go.etcd.io/etcd/mvcc/mvccpb"
"google.golang.org/grpc" "google.golang.org/grpc"
"github.com/go-kratos/kratos/pkg/log"
"github.com/go-kratos/kratos/pkg/naming"
) )
var ( var (
@ -155,7 +156,6 @@ func (e *EtcdBuilder) Build(appid string, opts ...naming.BuildOpt) naming.Resolv
// Scheme return etcd's scheme // Scheme return etcd's scheme
func (e *EtcdBuilder) Scheme() string { func (e *EtcdBuilder) Scheme() string {
return "etcd" return "etcd"
} }
// Register is register instance // Register is register instance
@ -185,7 +185,6 @@ func (e *EtcdBuilder) Register(ctx context.Context, ins *naming.Instance) (cance
}) })
go func() { go func() {
ticker := time.NewTicker(time.Duration(registerTTL/3) * time.Second) ticker := time.NewTicker(time.Duration(registerTTL/3) * time.Second)
defer ticker.Stop() defer ticker.Stop()
for { for {
@ -270,7 +269,6 @@ func (a *appInfo) fetchstore(appID string) (err error) {
return nil return nil
} }
func (a *appInfo) store(ins *naming.InstancesInfo) { func (a *appInfo) store(ins *naming.InstancesInfo) {
a.ins.Store(ins) a.ins.Store(ins)
a.e.mutex.RLock() a.e.mutex.RLock()
for rs := range a.resolver { for rs := range a.resolver {
@ -284,7 +282,7 @@ func (a *appInfo) store(ins *naming.InstancesInfo) {
func (a *appInfo) paserIns(resp *clientv3.GetResponse) (ins *naming.InstancesInfo, err error) { func (a *appInfo) paserIns(resp *clientv3.GetResponse) (ins *naming.InstancesInfo, err error) {
ins = &naming.InstancesInfo{ ins = &naming.InstancesInfo{
Instances: make(map[string][]*naming.Instance, 0), Instances: make(map[string][]*naming.Instance),
} }
for _, ev := range resp.Kvs { for _, ev := range resp.Kvs {
in := new(naming.Instance) in := new(naming.Instance)

@ -73,7 +73,7 @@ func Filter(schema string, clusters map[string]struct{}) BuildOpt {
func defulatSubset(inss []*Instance, size int) []*Instance { func defulatSubset(inss []*Instance, size int) []*Instance {
backends := inss backends := inss
if len(backends) <= int(size) { if len(backends) <= size {
return backends return backends
} }
clientID := env.Hostname clientID := env.Hostname
@ -93,7 +93,7 @@ func defulatSubset(inss []*Instance, size int) []*Instance {
backends[i], backends[j] = backends[j], backends[i] backends[i], backends[j] = backends[j], backends[i]
}) })
start := (id % uint64(count)) * uint64(size) start := (id % uint64(count)) * uint64(size)
return backends[int(start) : int(start)+int(size)] return backends[int(start) : int(start)+size]
} }
// Subset Subset option. // Subset Subset option.
@ -159,9 +159,7 @@ func ScheduleNode(clientZone string) BuildOpt {
} }
} }
for _, zone := range zones { for _, zone := range zones {
for _, ins := range zone.inss { instances = append(instances, zone.inss...)
instances = append(instances, ins)
}
} }
//如果没有拿到节点,则选择直接获取 //如果没有拿到节点,则选择直接获取
if len(instances) == 0 { if len(instances) == 0 {

@ -30,36 +30,36 @@ func Test_Subset(t *testing.T) {
func Test_FilterClusters(t *testing.T) { func Test_FilterClusters(t *testing.T) {
inss := map[string][]*Instance{ inss := map[string][]*Instance{
"sh001": []*Instance{&Instance{ "sh001": {{
Addrs: []string{"grpc://127.0.0.1:9000"}, Addrs: []string{"grpc://127.0.0.1:9000"},
Metadata: map[string]string{MetaCluster: "c1"}, Metadata: map[string]string{MetaCluster: "c1"},
}, &Instance{ }, {
Addrs: []string{"http://127.0.0.2:9000"}, Addrs: []string{"http://127.0.0.2:9000"},
Metadata: map[string]string{MetaCluster: "c1"}, Metadata: map[string]string{MetaCluster: "c1"},
}, &Instance{ }, {
Addrs: []string{"grpc://127.0.0.3:9000"}, Addrs: []string{"grpc://127.0.0.3:9000"},
Metadata: map[string]string{MetaCluster: "c2"}, Metadata: map[string]string{MetaCluster: "c2"},
}}, }},
"sh002": []*Instance{&Instance{ "sh002": {{
Addrs: []string{"grpc://127.0.0.1:9000"}, Addrs: []string{"grpc://127.0.0.1:9000"},
Metadata: map[string]string{MetaCluster: "c3"}, Metadata: map[string]string{MetaCluster: "c3"},
}, &Instance{ }, {
Addrs: []string{"zk://127.0.0.2:9000"}, Addrs: []string{"zk://127.0.0.2:9000"},
Metadata: map[string]string{MetaCluster: "c3"}, Metadata: map[string]string{MetaCluster: "c3"},
}}, }},
} }
res := map[string][]*Instance{ res := map[string][]*Instance{
"sh001": []*Instance{&Instance{ "sh001": {{
Addrs: []string{"grpc://127.0.0.1:9000"}, Addrs: []string{"grpc://127.0.0.1:9000"},
Metadata: map[string]string{MetaCluster: "c1"}, Metadata: map[string]string{MetaCluster: "c1"},
}}, }},
"sh002": []*Instance{&Instance{ "sh002": {{
Addrs: []string{"grpc://127.0.0.1:9000"}, Addrs: []string{"grpc://127.0.0.1:9000"},
Metadata: map[string]string{MetaCluster: "c3"}, Metadata: map[string]string{MetaCluster: "c3"},
}}, }},
} }
var opt BuildOptions var opt BuildOptions
f := Filter("grpc", map[string]struct{}{"c1": struct{}{}, "c3": struct{}{}}) f := Filter("grpc", map[string]struct{}{"c1": {}, "c3": {}})
f.Apply(&opt) f.Apply(&opt)
filtered := opt.Filter(inss) filtered := opt.Filter(inss)
equal := reflect.DeepEqual(filtered, res) equal := reflect.DeepEqual(filtered, res)
@ -70,33 +70,33 @@ func Test_FilterClusters(t *testing.T) {
func Test_FilterInvalidAddr(t *testing.T) { func Test_FilterInvalidAddr(t *testing.T) {
inss := map[string][]*Instance{ inss := map[string][]*Instance{
"sh001": []*Instance{&Instance{ "sh001": {{
Addrs: []string{"grpc://127.0.0.1:9000"}, Addrs: []string{"grpc://127.0.0.1:9000"},
Metadata: map[string]string{MetaCluster: "c1"}, Metadata: map[string]string{MetaCluster: "c1"},
}, &Instance{ }, {
Addrs: []string{"http://127.0.0.2:9000"}, Addrs: []string{"http://127.0.0.2:9000"},
Metadata: map[string]string{MetaCluster: "c1"}, Metadata: map[string]string{MetaCluster: "c1"},
}, &Instance{ }, {
Addrs: []string{"grpc://127.0.0.3:9000"}, Addrs: []string{"grpc://127.0.0.3:9000"},
Metadata: map[string]string{MetaCluster: "c2"}, Metadata: map[string]string{MetaCluster: "c2"},
}}, }},
"sh002": []*Instance{&Instance{ "sh002": {{
Addrs: []string{"grpc://127.0.0.1:9000"}, Addrs: []string{"grpc://127.0.0.1:9000"},
Metadata: map[string]string{MetaCluster: "c3"}, Metadata: map[string]string{MetaCluster: "c3"},
}, &Instance{ }, {
Addrs: []string{"zk://127.0.0.2:9000"}, Addrs: []string{"zk://127.0.0.2:9000"},
Metadata: map[string]string{MetaCluster: "c3"}, Metadata: map[string]string{MetaCluster: "c3"},
}}, }},
} }
res := map[string][]*Instance{ res := map[string][]*Instance{
"sh001": []*Instance{&Instance{ "sh001": {{
Addrs: []string{"grpc://127.0.0.1:9000"}, Addrs: []string{"grpc://127.0.0.1:9000"},
Metadata: map[string]string{MetaCluster: "c1"}, Metadata: map[string]string{MetaCluster: "c1"},
}, &Instance{ }, {
Addrs: []string{"grpc://127.0.0.3:9000"}, Addrs: []string{"grpc://127.0.0.3:9000"},
Metadata: map[string]string{MetaCluster: "c2"}, Metadata: map[string]string{MetaCluster: "c2"},
}}, }},
"sh002": []*Instance{&Instance{ "sh002": {{
Addrs: []string{"grpc://127.0.0.1:9000"}, Addrs: []string{"grpc://127.0.0.1:9000"},
Metadata: map[string]string{MetaCluster: "c3"}, Metadata: map[string]string{MetaCluster: "c3"},
}}, }},
@ -114,33 +114,33 @@ func Test_FilterInvalidAddr(t *testing.T) {
func Test_Schedule(t *testing.T) { func Test_Schedule(t *testing.T) {
app := &InstancesInfo{ app := &InstancesInfo{
Instances: map[string][]*Instance{ Instances: map[string][]*Instance{
"sh001": []*Instance{&Instance{ "sh001": {{
Zone: "sh001", Zone: "sh001",
Addrs: []string{"grpc://127.0.0.1:9000"}, Addrs: []string{"grpc://127.0.0.1:9000"},
Metadata: map[string]string{MetaCluster: "c1"}, Metadata: map[string]string{MetaCluster: "c1"},
}, &Instance{ }, {
Zone: "sh001", Zone: "sh001",
Addrs: []string{"grpc://127.0.0.2:9000"}, Addrs: []string{"grpc://127.0.0.2:9000"},
Metadata: map[string]string{MetaCluster: "c1"}, Metadata: map[string]string{MetaCluster: "c1"},
}, &Instance{ }, {
Zone: "sh001", Zone: "sh001",
Addrs: []string{"grpc://127.0.0.3:9000"}, Addrs: []string{"grpc://127.0.0.3:9000"},
Metadata: map[string]string{MetaCluster: "c2"}, Metadata: map[string]string{MetaCluster: "c2"},
}}, }},
"sh002": []*Instance{&Instance{ "sh002": {{
Zone: "sh002", Zone: "sh002",
Addrs: []string{"grpc://127.0.0.1:9000"}, Addrs: []string{"grpc://127.0.0.1:9000"},
Metadata: map[string]string{MetaCluster: "c3"}, Metadata: map[string]string{MetaCluster: "c3"},
}, &Instance{ }, {
Zone: "sh002", Zone: "sh002",
Addrs: []string{"grpc://127.0.0.2:9000"}, Addrs: []string{"grpc://127.0.0.2:9000"},
Metadata: map[string]string{MetaCluster: "c3"}, Metadata: map[string]string{MetaCluster: "c3"},
}}, }},
}, },
Scheduler: &Scheduler{map[string]*ZoneStrategy{"sh001": &ZoneStrategy{ Scheduler: &Scheduler{map[string]*ZoneStrategy{"sh001": {
Zones: map[string]*Strategy{ Zones: map[string]*Strategy{
"sh001": &Strategy{10}, "sh001": {10},
"sh002": &Strategy{20}, "sh002": {20},
}, },
}}}, }}},
} }
@ -156,10 +156,10 @@ func Test_Schedule(t *testing.T) {
func Test_Schedule2(t *testing.T) { func Test_Schedule2(t *testing.T) {
app := &InstancesInfo{ app := &InstancesInfo{
Instances: map[string][]*Instance{}, Instances: map[string][]*Instance{},
Scheduler: &Scheduler{map[string]*ZoneStrategy{"sh001": &ZoneStrategy{ Scheduler: &Scheduler{map[string]*ZoneStrategy{"sh001": {
Zones: map[string]*Strategy{ Zones: map[string]*Strategy{
"sh001": &Strategy{10}, "sh001": {10},
"sh002": &Strategy{20}, "sh002": {20},
}, },
}}}, }}},
} }
@ -191,10 +191,10 @@ func Test_Schedule2(t *testing.T) {
func Test_Schedule3(t *testing.T) { func Test_Schedule3(t *testing.T) {
app := &InstancesInfo{ app := &InstancesInfo{
Instances: map[string][]*Instance{}, Instances: map[string][]*Instance{},
Scheduler: &Scheduler{map[string]*ZoneStrategy{"sh001": &ZoneStrategy{ Scheduler: &Scheduler{map[string]*ZoneStrategy{"sh001": {
Zones: map[string]*Strategy{ Zones: map[string]*Strategy{
"sh001": &Strategy{1}, "sh001": {1},
"sh002": &Strategy{30}, "sh002": {30},
}, },
}}}, }}},
} }
@ -226,10 +226,10 @@ func Test_Schedule3(t *testing.T) {
func Test_Schedule4(t *testing.T) { func Test_Schedule4(t *testing.T) {
app := &InstancesInfo{ app := &InstancesInfo{
Instances: map[string][]*Instance{}, Instances: map[string][]*Instance{},
Scheduler: &Scheduler{map[string]*ZoneStrategy{"sh001": &ZoneStrategy{ Scheduler: &Scheduler{map[string]*ZoneStrategy{"sh001": {
Zones: map[string]*Strategy{ Zones: map[string]*Strategy{
"sh001": &Strategy{1}, "sh001": {1},
"sh002": &Strategy{30}, "sh002": {30},
}, },
}}}, }}},
} }
@ -254,9 +254,9 @@ func Test_Schedule4(t *testing.T) {
func Test_Schedule5(t *testing.T) { func Test_Schedule5(t *testing.T) {
app := &InstancesInfo{ app := &InstancesInfo{
Instances: map[string][]*Instance{}, Instances: map[string][]*Instance{},
Scheduler: &Scheduler{map[string]*ZoneStrategy{"sh001": &ZoneStrategy{ Scheduler: &Scheduler{map[string]*ZoneStrategy{"sh001": {
Zones: map[string]*Strategy{ Zones: map[string]*Strategy{
"sh002": &Strategy{30}, "sh002": {30},
}, },
}}}, }}},
} }

@ -12,10 +12,11 @@ import (
"sync/atomic" "sync/atomic"
"time" "time"
"github.com/go-zookeeper/zk"
"github.com/go-kratos/kratos/pkg/log" "github.com/go-kratos/kratos/pkg/log"
"github.com/go-kratos/kratos/pkg/naming" "github.com/go-kratos/kratos/pkg/naming"
xtime "github.com/go-kratos/kratos/pkg/time" xtime "github.com/go-kratos/kratos/pkg/time"
"github.com/go-zookeeper/zk"
) )
// Config is zookeeper config. // Config is zookeeper config.
@ -80,7 +81,7 @@ func New(c *Config) (zkb *Zookeeper, err error) {
c.Timeout = xtime.Duration(time.Second) c.Timeout = xtime.Duration(time.Second)
} }
if len(c.Endpoints) == 0 { if len(c.Endpoints) == 0 {
errInfo := fmt.Sprintf("zookeeper New failed, endpoints is null") errInfo := "zookeeper New failed, endpoints is null"
log.Error(errInfo) log.Error(errInfo)
return nil, errors.New(errInfo) return nil, errors.New(errInfo)
} }
@ -90,7 +91,7 @@ func New(c *Config) (zkb *Zookeeper, err error) {
log.Error(fmt.Sprintf("zk Connect err:(%v)", err)) log.Error(fmt.Sprintf("zk Connect err:(%v)", err))
return return
} }
log.Info(fmt.Sprintf("zk Connect ok!")) log.Info("zk Connect ok!")
ctx, cancel := context.WithCancel(context.Background()) ctx, cancel := context.WithCancel(context.Background())
zkb = &Zookeeper{ zkb = &Zookeeper{
@ -255,7 +256,7 @@ func (z *Zookeeper) register(ctx context.Context, ins *naming.Instance) (err err
if err = z.registerPeerServer(nodePath, ins); err != nil { if err = z.registerPeerServer(nodePath, ins); err != nil {
log.Warn(fmt.Sprintf("registerServer, fail to RegisterPeerServer node:%s error:(%v)", addr, err)) log.Warn(fmt.Sprintf("registerServer, fail to RegisterPeerServer node:%s error:(%v)", addr, err))
} else { } else {
log.Info(fmt.Sprintf("registerServer, succeed to RegistServer node.")) log.Info("registerServer, succeed to RegistServer node.")
} }
} }
return nil return nil
@ -336,7 +337,7 @@ func (a *appInfo) fetchstore(appID string) (err error) {
} }
log.Info(fmt.Sprintf("fetchstore, ok to get Children of node:(%v), childs:(%v)", prefix, childs)) log.Info(fmt.Sprintf("fetchstore, ok to get Children of node:(%v), childs:(%v)", prefix, childs))
ins := &naming.InstancesInfo{ ins := &naming.InstancesInfo{
Instances: make(map[string][]*naming.Instance, 0), Instances: make(map[string][]*naming.Instance),
} }
for _, child := range childs { for _, child := range childs {
nodePath := prefix + "/" + child nodePath := prefix + "/" + child
@ -350,7 +351,6 @@ func (a *appInfo) fetchstore(appID string) (err error) {
return err return err
} }
ins.Instances[in.Zone] = append(ins.Instances[in.Zone], in) ins.Instances[in.Zone] = append(ins.Instances[in.Zone], in)
} }
a.store(ins) a.store(ins)
return nil return nil

@ -61,7 +61,6 @@ func TestBindingDefault(t *testing.T) {
assert.Equal(t, Default("POST", MIMEMultipartPOSTForm), Form) assert.Equal(t, Default("POST", MIMEMultipartPOSTForm), Form)
assert.Equal(t, Default("PUT", MIMEMultipartPOSTForm), Form) assert.Equal(t, Default("PUT", MIMEMultipartPOSTForm), Form)
} }
func TestStripContentType(t *testing.T) { func TestStripContentType(t *testing.T) {

@ -4,7 +4,7 @@ import (
"net/http" "net/http"
) )
// Render http reponse render. // Render http response render.
type Render interface { type Render interface {
// Render render it to http response writer. // Render render it to http response writer.
Render(http.ResponseWriter) error Render(http.ResponseWriter) error

@ -236,7 +236,6 @@ func (n *node) addRoute(path string, handlers []HandlerFunc) {
} }
n.insertChild(numParams, path, fullPath, handlers) n.insertChild(numParams, path, fullPath, handlers)
return return
} else if i == len(path) { // Make node a (in-path) leaf } else if i == len(path) { // Make node a (in-path) leaf
if n.handlers != nil { if n.handlers != nil {
panic("handlers are already registered for path '" + fullPath + "'") panic("handlers are already registered for path '" + fullPath + "'")
@ -316,7 +315,6 @@ func (n *node) insertChild(numParams uint8, path string, fullPath string, handle
n.children = []*node{child} n.children = []*node{child}
n = child n = child
} }
} else { // catchAll } else { // catchAll
if end != max || numParams > 1 { if end != max || numParams > 1 {
panic("catch-all routes are only allowed at the end of the path in path '" + fullPath + "'") panic("catch-all routes are only allowed at the end of the path in path '" + fullPath + "'")
@ -514,7 +512,7 @@ func (n *node) findCaseInsensitivePath(path string, fixTrailingSlash bool) (ciPa
ciPath = make([]byte, 0, len(path)+1) // preallocate enough memory ciPath = make([]byte, 0, len(path)+1) // preallocate enough memory
// Outer loop for walking the tree // Outer loop for walking the tree
for len(path) >= len(n.path) && strings.ToLower(path[:len(n.path)]) == strings.ToLower(n.path) { for len(path) >= len(n.path) && strings.EqualFold(path[:len(n.path)], n.path) {
path = path[len(n.path):] path = path[len(n.path):]
ciPath = append(ciPath, n.path...) ciPath = append(ciPath, n.path...)
@ -528,8 +526,8 @@ func (n *node) findCaseInsensitivePath(path string, fixTrailingSlash bool) (ciPa
// must use recursive approach since both index and // must use recursive approach since both index and
// ToLower(index) could exist. We must check both. // ToLower(index) could exist. We must check both.
if r == unicode.ToLower(index) { if r == unicode.ToLower(index) {
out, found := n.children[i].findCaseInsensitivePath(path, fixTrailingSlash) out, _found := n.children[i].findCaseInsensitivePath(path, fixTrailingSlash)
if found { if _found {
return append(ciPath, out...), true return append(ciPath, out...), true
} }
} }
@ -618,7 +616,7 @@ func (n *node) findCaseInsensitivePath(path string, fixTrailingSlash bool) (ciPa
return ciPath, true return ciPath, true
} }
if len(path)+1 == len(n.path) && n.path[len(path)] == '/' && if len(path)+1 == len(n.path) && n.path[len(path)] == '/' &&
strings.ToLower(path) == strings.ToLower(n.path[:len(path)]) && strings.EqualFold(path, n.path[:len(path)]) &&
n.handlers != nil { n.handlers != nil {
return append(ciPath, n.path...), true return append(ciPath, n.path...), true
} }

@ -39,15 +39,15 @@ const (
) )
var outgoingKey = map[string]struct{}{ var outgoingKey = map[string]struct{}{
Color: struct{}{}, Color: {},
RemoteIP: struct{}{}, RemoteIP: {},
RemotePort: struct{}{}, RemotePort: {},
Mirror: struct{}{}, Mirror: {},
Criticality: struct{}{}, Criticality: {},
} }
var incomingKey = map[string]struct{}{ var incomingKey = map[string]struct{}{
Caller: struct{}{}, Caller: {},
} }
// IsOutgoingKey represent this key should propagate by rpc. // IsOutgoingKey represent this key should propagate by rpc.

@ -84,7 +84,6 @@ func TestBool(t *testing.T) {
mdcontext = NewContext(context.Background(), MD{Mirror: "0"}) mdcontext = NewContext(context.Background(), MD{Mirror: "0"})
assert.Equal(t, false, Bool(mdcontext, Mirror)) assert.Equal(t, false, Bool(mdcontext, Mirror))
} }
func TestInt64(t *testing.T) { func TestInt64(t *testing.T) {
mdcontext := NewContext(context.Background(), MD{Mid: int64(1)}) mdcontext := NewContext(context.Background(), MD{Mid: int64(1)})

@ -191,7 +191,6 @@ func TestBalancerPick(t *testing.T) {
t.Fatalf("the (%d) subconn picked(%s),but expected(%s)", i, sc.addr.Addr, res[i]) t.Fatalf("the (%d) subconn picked(%s),but expected(%s)", i, sc.addr.Addr, res[i])
} }
} }
} }
func Benchmark_Wrr(b *testing.B) { func Benchmark_Wrr(b *testing.B) {
@ -299,7 +298,6 @@ func (c *controller) updateStatics() {
sc.prevUsage = usage sc.prevUsage = usage
} }
} }
} }
func (c *controller) control(extraLoad, extraDelay int64) { func (c *controller) control(extraLoad, extraDelay int64) {

@ -8,11 +8,6 @@ import (
"sync/atomic" "sync/atomic"
"time" "time"
"github.com/go-kratos/kratos/pkg/conf/env"
"github.com/go-kratos/kratos/pkg/log"
nmd "github.com/go-kratos/kratos/pkg/net/metadata"
wmeta "github.com/go-kratos/kratos/pkg/net/rpc/warden/internal/metadata"
"github.com/go-kratos/kratos/pkg/stat/metric"
"google.golang.org/grpc" "google.golang.org/grpc"
"google.golang.org/grpc/balancer" "google.golang.org/grpc/balancer"
"google.golang.org/grpc/balancer/base" "google.golang.org/grpc/balancer/base"
@ -20,6 +15,12 @@ import (
"google.golang.org/grpc/metadata" "google.golang.org/grpc/metadata"
"google.golang.org/grpc/resolver" "google.golang.org/grpc/resolver"
"google.golang.org/grpc/status" "google.golang.org/grpc/status"
"github.com/go-kratos/kratos/pkg/conf/env"
"github.com/go-kratos/kratos/pkg/log"
nmd "github.com/go-kratos/kratos/pkg/net/metadata"
wmeta "github.com/go-kratos/kratos/pkg/net/rpc/warden/internal/metadata"
"github.com/go-kratos/kratos/pkg/stat/metric"
) )
var _ base.PickerBuilder = &wrrPickerBuilder{} var _ base.PickerBuilder = &wrrPickerBuilder{}
@ -94,13 +95,13 @@ func (c *subConn) latencySummary() (latency float64, count int64) {
// statistics is info for log // statistics is info for log
type statistics struct { type statistics struct {
addr string addr string
ewt int64 ewt int64
cs float64 cs float64
ss float64 ss float64
latency float64 latency float64
cpu float64 cpu float64
req int64 req int64
} }
// Stats is grpc Interceptor for client to collect server stats // Stats is grpc Interceptor for client to collect server stats
@ -298,5 +299,4 @@ func (p *wrrPicker) pick(ctx context.Context, opts balancer.PickInfo) (balancer.
p.mu.Unlock() p.mu.Unlock()
log.Info("warden wrr(%s): %+v", conn.addr.ServerName, stats) log.Info("warden wrr(%s): %+v", conn.addr.ServerName, stats)
}, nil }, nil
} }

@ -179,7 +179,6 @@ func onBreaker(breaker breaker.Breaker, err *error) {
if ecode.EqualError(ecode.ServerErr, *err) || ecode.EqualError(ecode.ServiceUnavailable, *err) || ecode.EqualError(ecode.Deadline, *err) || ecode.EqualError(ecode.LimitExceed, *err) { if ecode.EqualError(ecode.ServerErr, *err) || ecode.EqualError(ecode.ServiceUnavailable, *err) || ecode.EqualError(ecode.Deadline, *err) || ecode.EqualError(ecode.LimitExceed, *err) {
breaker.MarkFailed() breaker.MarkFailed()
return return
} }
} }
breaker.MarkSuccess() breaker.MarkSuccess()

@ -38,7 +38,6 @@ func (s *helloServer) StreamHello(ss pb.Greeter_StreamHelloServer) error {
} }
} }
return nil return nil
} }
func ExampleServer() { func ExampleServer() {

@ -113,7 +113,6 @@ func main() {
} }
wg.Done() wg.Done()
}(i) }(i)
} }
wg.Wait() wg.Wait()
@ -140,7 +139,6 @@ func main() {
log.Printf("received requests_OK : %d\n", atomic.LoadUint64(&transOK)) log.Printf("received requests_OK : %d\n", atomic.LoadUint64(&transOK))
log.Printf("throughput (TPS) : %d\n", int64(c*m)*1000/totalT) log.Printf("throughput (TPS) : %d\n", int64(c*m)*1000/totalT)
log.Printf("mean: %v ms, median: %v ms, max: %v ms, min: %v ms, p99: %v ms, p999:%v ms\n", mean/1e6, median/1e6, max/1e6, min/1e6, tp99/1e6, tp999/1e6) log.Printf("mean: %v ms, median: %v ms, max: %v ms, min: %v ms, p99: %v ms, p999:%v ms\n", mean/1e6, median/1e6, max/1e6, min/1e6, tp99/1e6, tp999/1e6)
} }
func prepareArgs() *proto.BenchmarkMessage { func prepareArgs() *proto.BenchmarkMessage {

@ -50,7 +50,6 @@ func main() {
} }
wg.Wait() wg.Wait()
fmt.Printf("per request cost %v\n", all/int64(request*concurrency)) fmt.Printf("per request cost %v\n", all/int64(request*concurrency))
} }
func sayHello(in *pb.HelloRequest) { func sayHello(in *pb.HelloRequest) {

@ -46,5 +46,4 @@ func newServer() {
if err != nil { if err != nil {
return return
} }
} }

@ -70,7 +70,7 @@ func TestFromError(t *testing.T) {
gst := FromError(err) gst := FromError(err)
//assert.Equal(t, codes.InvalidArgument, gst.Code()) //assert.Equal(t, codes.InvalidArgument, gst.Code())
// NOTE: set all grpc.status as Unkown when error is ecode.Codes for compatible // NOTE: set all grpc.status as Unknown when error is ecode.Codes for compatible
assert.Equal(t, codes.Unknown, gst.Code()) assert.Equal(t, codes.Unknown, gst.Code())
// NOTE: gst.Message == str(ecode.Code) for compatible php leagcy code // NOTE: gst.Message == str(ecode.Code) for compatible php leagcy code
assert.Equal(t, err.Message(), gst.Message()) assert.Equal(t, err.Message(), gst.Message())
@ -93,7 +93,7 @@ func TestFromError(t *testing.T) {
gst := FromError(err) gst := FromError(err)
//assert.Equal(t, codes.Unauthenticated, gst.Code()) //assert.Equal(t, codes.Unauthenticated, gst.Code())
// NOTE: set all grpc.status as Unkown when error is ecode.Codes for compatible // NOTE: set all grpc.status as Unknown when error is ecode.Codes for compatible
assert.Equal(t, codes.Unknown, gst.Code()) assert.Equal(t, codes.Unknown, gst.Code())
assert.Len(t, gst.Details(), 1) assert.Len(t, gst.Details(), 1)
details := gst.Details() details := gst.Details()

@ -5,11 +5,12 @@ import (
"sync/atomic" "sync/atomic"
"time" "time"
"google.golang.org/grpc"
"github.com/go-kratos/kratos/pkg/log" "github.com/go-kratos/kratos/pkg/log"
limit "github.com/go-kratos/kratos/pkg/ratelimit" limit "github.com/go-kratos/kratos/pkg/ratelimit"
"github.com/go-kratos/kratos/pkg/ratelimit/bbr" "github.com/go-kratos/kratos/pkg/ratelimit/bbr"
"github.com/go-kratos/kratos/pkg/stat/metric" "github.com/go-kratos/kratos/pkg/stat/metric"
"google.golang.org/grpc"
) )
var ( var (

@ -27,7 +27,7 @@ func (s *Server) recovery() grpc.UnaryServerInterceptor {
} }
buf = buf[:rs] buf = buf[:rs]
pl := fmt.Sprintf("grpc server panic: %v\n%v\n%s\n", req, rerr, buf) pl := fmt.Sprintf("grpc server panic: %v\n%v\n%s\n", req, rerr, buf)
fmt.Fprintf(os.Stderr, pl) fmt.Fprint(os.Stderr, pl)
log.Error(pl) log.Error(pl)
err = status.Errorf(codes.Unknown, ecode.ServerErr.Error()) err = status.Errorf(codes.Unknown, ecode.ServerErr.Error())
} }

@ -54,7 +54,7 @@ func (d *Direct) Watch() <-chan struct{} {
func (d *Direct) Unwatch(id string) { func (d *Direct) Unwatch(id string) {
} }
//Fetch fetch isntances. //Fetch fetch instances.
func (d *Direct) Fetch(ctx context.Context) (res *naming.InstancesInfo, found bool) { func (d *Direct) Fetch(ctx context.Context) (res *naming.InstancesInfo, found bool) {
var ins []*naming.Instance var ins []*naming.Instance
addrs := strings.Split(d.id, ",") addrs := strings.Split(d.id, ",")

@ -71,7 +71,6 @@ func (b *Builder) Build(target resolver.Target, cc resolver.ClientConn, opts res
if t, err := strconv.ParseInt(sub[0], 10, 64); err == nil { if t, err := strconv.ParseInt(sub[0], 10, 64); err == nil {
ss = t ss = t
} }
} }
} }
} }

@ -299,7 +299,7 @@ func (s *Server) RunUnix(file string) error {
} }
// Start create a new goroutine run server with configured listen addr // Start create a new goroutine run server with configured listen addr
// will panic if any error happend // will panic if any error happened
// return server itself // return server itself
func (s *Server) Start() (*Server, error) { func (s *Server) Start() (*Server, error) {
_, err := s.startWithAddr() _, err := s.startWithAddr()
@ -310,7 +310,7 @@ func (s *Server) Start() (*Server, error) {
} }
// StartWithAddr create a new goroutine run server with configured listen addr // StartWithAddr create a new goroutine run server with configured listen addr
// will panic if any error happend // will panic if any error happened
// return server itself and the actually listened address (if configured listen // return server itself and the actually listened address (if configured listen
// port is zero, the os will allocate an unused port) // port is zero, the os will allocate an unused port)
func (s *Server) StartWithAddr() (*Server, net.Addr, error) { func (s *Server) StartWithAddr() (*Server, net.Addr, error) {

@ -336,7 +336,6 @@ func testLinkTimeout(t *testing.T) {
if !ecode.EqualError(ecode.Deadline, err) { if !ecode.EqualError(ecode.Deadline, err) {
t.Fatalf("testLinkTimeout must return error RPCDeadline,err:%v", err) t.Fatalf("testLinkTimeout must return error RPCDeadline,err:%v", err)
} }
} }
func testClientConfig(t *testing.T) { func testClientConfig(t *testing.T) {
_, err := runClient(context.Background(), &clientConfig2, t, "timeout_test2", 0) _, err := runClient(context.Background(), &clientConfig2, t, "timeout_test2", 0)
@ -520,7 +519,7 @@ func BenchmarkServer(b *testing.B) {
b.Fatalf("c.SayHello failed: %v,req: %v %v", err, "benchmark", 1) b.Fatalf("c.SayHello failed: %v,req: %v %v", err, "benchmark", 1)
} }
if !resp.Success { if !resp.Success {
b.Error("repsonse not success!") b.Error("response not success!")
} }
} }
}) })

@ -2,6 +2,7 @@ package warden
import ( import (
"context" "context"
"google.golang.org/grpc/codes" "google.golang.org/grpc/codes"
"google.golang.org/grpc/status" "google.golang.org/grpc/status"

@ -69,9 +69,9 @@ var emptyContext = spanContext{}
// sample-rate: s-{base16(BigEndian(float32))} // sample-rate: s-{base16(BigEndian(float32))}
func (c spanContext) String() string { func (c spanContext) String() string {
base := make([]string, 4) base := make([]string, 4)
base[0] = strconv.FormatUint(uint64(c.TraceID), 16) base[0] = strconv.FormatUint(c.TraceID, 16)
base[1] = strconv.FormatUint(uint64(c.SpanID), 16) base[1] = strconv.FormatUint(c.SpanID, 16)
base[2] = strconv.FormatUint(uint64(c.ParentID), 16) base[2] = strconv.FormatUint(c.ParentID, 16)
base[3] = strconv.FormatUint(uint64(c.Flags), 16) base[3] = strconv.FormatUint(uint64(c.Flags), 16)
return strings.Join(base, ":") return strings.Join(base, ":")
} }

@ -253,7 +253,7 @@ func buildTag(tag *Tag, maxTagValueLength int) *j.Tag {
jTag.VLong = &vLong jTag.VLong = &vLong
jTag.VType = j.TagType_LONG jTag.VType = j.TagType_LONG
case int64: case int64:
vLong := int64(value) vLong := value
jTag.VLong = &vLong jTag.VLong = &vLong
jTag.VType = j.TagType_LONG jTag.VType = j.TagType_LONG
case uint64: case uint64:
@ -265,7 +265,7 @@ func buildTag(tag *Tag, maxTagValueLength int) *j.Tag {
jTag.VDouble = &vDouble jTag.VDouble = &vDouble
jTag.VType = j.TagType_DOUBLE jTag.VType = j.TagType_DOUBLE
case float64: case float64:
vDouble := float64(value) vDouble := value
jTag.VDouble = &vDouble jTag.VDouble = &vDouble
jTag.VType = j.TagType_DOUBLE jTag.VType = j.TagType_DOUBLE
case bool: case bool:

@ -2,13 +2,15 @@ package zipkin
import ( import (
"fmt" "fmt"
protogen "github.com/go-kratos/kratos/pkg/net/trace/proto"
"time" "time"
"github.com/go-kratos/kratos/pkg/net/trace" protogen "github.com/go-kratos/kratos/pkg/net/trace/proto"
"github.com/openzipkin/zipkin-go/model" "github.com/openzipkin/zipkin-go/model"
"github.com/openzipkin/zipkin-go/reporter" "github.com/openzipkin/zipkin-go/reporter"
"github.com/openzipkin/zipkin-go/reporter/http" "github.com/openzipkin/zipkin-go/reporter/http"
"github.com/go-kratos/kratos/pkg/net/trace"
) )
type report struct { type report struct {

@ -9,9 +9,10 @@ import (
"testing" "testing"
"time" "time"
"github.com/stretchr/testify/assert"
"github.com/go-kratos/kratos/pkg/ratelimit" "github.com/go-kratos/kratos/pkg/ratelimit"
"github.com/go-kratos/kratos/pkg/stat/metric" "github.com/go-kratos/kratos/pkg/stat/metric"
"github.com/stretchr/testify/assert"
) )
func confForTest() *Config { func confForTest() *Config {

@ -1,8 +1,9 @@
package metric package metric
import ( import (
"github.com/stretchr/testify/assert"
"testing" "testing"
"github.com/stretchr/testify/assert"
) )
func TestWindowResetWindow(t *testing.T) { func TestWindowResetWindow(t *testing.T) {

@ -10,12 +10,8 @@ func fakeRunTask(ctx context.Context) error {
func ExampleGroup_group() { func ExampleGroup_group() {
g := Group{} g := Group{}
g.Go(func(context.Context) error { g.Go(fakeRunTask)
return fakeRunTask(context.Background()) g.Go(fakeRunTask)
})
g.Go(func(context.Context) error {
return fakeRunTask(context.Background())
})
if err := g.Wait(); err != nil { if err := g.Wait(); err != nil {
// handle err // handle err
} }
@ -23,12 +19,8 @@ func ExampleGroup_group() {
func ExampleGroup_ctx() { func ExampleGroup_ctx() {
g := WithContext(context.Background()) g := WithContext(context.Background())
g.Go(func(ctx context.Context) error { g.Go(fakeRunTask)
return fakeRunTask(ctx) g.Go(fakeRunTask)
})
g.Go(func(ctx context.Context) error {
return fakeRunTask(ctx)
})
if err := g.Wait(); err != nil { if err := g.Wait(); err != nil {
// handle err // handle err
} }
@ -36,12 +28,8 @@ func ExampleGroup_ctx() {
func ExampleGroup_cancel() { func ExampleGroup_cancel() {
g := WithCancel(context.Background()) g := WithCancel(context.Background())
g.Go(func(ctx context.Context) error { g.Go(fakeRunTask)
return fakeRunTask(ctx) g.Go(fakeRunTask)
})
g.Go(func(ctx context.Context) error {
return fakeRunTask(ctx)
})
if err := g.Wait(); err != nil { if err := g.Wait(); err != nil {
// handle err // handle err
} }
@ -51,12 +39,8 @@ func ExampleGroup_maxproc() {
g := Group{} g := Group{}
// set max concurrency // set max concurrency
g.GOMAXPROCS(2) g.GOMAXPROCS(2)
g.Go(func(ctx context.Context) error { g.Go(fakeRunTask)
return fakeRunTask(context.Background()) g.Go(fakeRunTask)
})
g.Go(func(ctx context.Context) error {
return fakeRunTask(context.Background())
})
if err := g.Wait(); err != nil { if err := g.Wait(); err != nil {
// handle err // handle err
} }

@ -23,9 +23,9 @@ var (
singleFlight = flag.Bool("singleflight", false, "enable singleflight") singleFlight = flag.Bool("singleflight", false, "enable singleflight")
nullCache = flag.String("nullcache", "", "null cache") nullCache = flag.String("nullcache", "", "null cache")
checkNullCode = flag.String("check_null_code", "", "check null code") checkNullCode = flag.String("check_null_code", "", "check null code")
cacheErr = flag.String("cache_err", "continue", "cache err to contine or break") cacheErr = flag.String("cache_err", "continue", "cache err to continue or break")
batchSize = flag.Int("batch", 0, "batch size") batchSize = flag.Int("batch", 0, "batch size")
batchErr = flag.String("batch_err", "break", "batch err to contine or break") batchErr = flag.String("batch_err", "break", "batch err to continue or break")
maxGroup = flag.Int("max_group", 0, "max group size") maxGroup = flag.Int("max_group", 0, "max group size")
sync = flag.Bool("sync", false, "add cache in sync way.") sync = flag.Bool("sync", false, "add cache in sync way.")
paging = flag.Bool("paging", false, "use paging in single template") paging = flag.Bool("paging", false, "use paging in single template")

@ -24,7 +24,7 @@ var (
expire = flag.String("expire", "", "expire time code") expire = flag.String("expire", "", "expire time code")
structName = flag.String("struct_name", "dao", "struct name") structName = flag.String("struct_name", "dao", "struct name")
batchSize = flag.Int("batch", 0, "batch size") batchSize = flag.Int("batch", 0, "batch size")
batchErr = flag.String("batch_err", "break", "batch err to contine or break") batchErr = flag.String("batch_err", "break", "batch err to continue or break")
maxGroup = flag.Int("max_group", 0, "max group size") maxGroup = flag.Int("max_group", 0, "max group size")
checkNullCode = flag.String("check_null_code", "", "check null code") checkNullCode = flag.String("check_null_code", "", "check null code")
nullExpire = flag.String("null_expire", "", "null cache expire time code") nullExpire = flag.String("null_expire", "", "null cache expire time code")

@ -11,13 +11,14 @@ import (
"strconv" "strconv"
"strings" "strings"
"github.com/golang/protobuf/protoc-gen-go/descriptor"
plugin "github.com/golang/protobuf/protoc-gen-go/plugin"
"github.com/pkg/errors"
"github.com/go-kratos/kratos/tool/protobuf/pkg/gen" "github.com/go-kratos/kratos/tool/protobuf/pkg/gen"
"github.com/go-kratos/kratos/tool/protobuf/pkg/naming" "github.com/go-kratos/kratos/tool/protobuf/pkg/naming"
"github.com/go-kratos/kratos/tool/protobuf/pkg/typemap" "github.com/go-kratos/kratos/tool/protobuf/pkg/typemap"
"github.com/go-kratos/kratos/tool/protobuf/pkg/utils" "github.com/go-kratos/kratos/tool/protobuf/pkg/utils"
"github.com/golang/protobuf/protoc-gen-go/descriptor"
plugin "github.com/golang/protobuf/protoc-gen-go/plugin"
"github.com/pkg/errors"
) )
const Version = "v0.1" const Version = "v0.1"

@ -4,11 +4,12 @@ import (
"reflect" "reflect"
"strings" "strings"
"github.com/golang/protobuf/proto"
"github.com/golang/protobuf/protoc-gen-go/descriptor"
"github.com/go-kratos/kratos/tool/protobuf/pkg/extensions/gogoproto" "github.com/go-kratos/kratos/tool/protobuf/pkg/extensions/gogoproto"
"github.com/go-kratos/kratos/tool/protobuf/pkg/tag" "github.com/go-kratos/kratos/tool/protobuf/pkg/tag"
"github.com/go-kratos/kratos/tool/protobuf/pkg/typemap" "github.com/go-kratos/kratos/tool/protobuf/pkg/typemap"
"github.com/golang/protobuf/proto"
"github.com/golang/protobuf/protoc-gen-go/descriptor"
) )
// GetJSONFieldName get name from gogoproto.jsontag // GetJSONFieldName get name from gogoproto.jsontag
@ -95,7 +96,6 @@ func IsMap(field *descriptor.FieldDescriptorProto, reg *typemap.Registry) bool {
// IsRepeated Is this field repeated? // IsRepeated Is this field repeated?
func IsRepeated(field *descriptor.FieldDescriptorProto) bool { func IsRepeated(field *descriptor.FieldDescriptorProto) bool {
return field.Label != nil && *field.Label == descriptor.FieldDescriptorProto_LABEL_REPEATED return field.Label != nil && *field.Label == descriptor.FieldDescriptorProto_LABEL_REPEATED
} }
// GetFieldRequired is field required? // GetFieldRequired is field required?

@ -5,11 +5,12 @@ import (
"net/http" "net/http"
"strings" "strings"
"github.com/go-kratos/kratos/tool/protobuf/pkg/tag"
"github.com/go-kratos/kratos/tool/protobuf/pkg/typemap"
"github.com/golang/protobuf/proto" "github.com/golang/protobuf/proto"
"github.com/golang/protobuf/protoc-gen-go/descriptor" "github.com/golang/protobuf/protoc-gen-go/descriptor"
"google.golang.org/genproto/googleapis/api/annotations" "google.golang.org/genproto/googleapis/api/annotations"
"github.com/go-kratos/kratos/tool/protobuf/pkg/tag"
"github.com/go-kratos/kratos/tool/protobuf/pkg/typemap"
) )
// HTTPInfo http info for method // HTTPInfo http info for method

@ -6,10 +6,11 @@ import (
"path/filepath" "path/filepath"
"strings" "strings"
"github.com/go-kratos/kratos/tool/protobuf/pkg/utils"
"github.com/golang/protobuf/protoc-gen-go/descriptor" "github.com/golang/protobuf/protoc-gen-go/descriptor"
"github.com/pkg/errors" "github.com/pkg/errors"
"github.com/siddontang/go/ioutil2" "github.com/siddontang/go/ioutil2"
"github.com/go-kratos/kratos/tool/protobuf/pkg/utils"
) )
// GetVersionPrefix 根据go包名获取api版本前缀 // GetVersionPrefix 根据go包名获取api版本前缀

@ -5,9 +5,10 @@ import (
"path/filepath" "path/filepath"
"strings" "strings"
"github.com/go-kratos/kratos/tool/protobuf/pkg/utils"
"github.com/pkg/errors" "github.com/pkg/errors"
"github.com/siddontang/go/ioutil2" "github.com/siddontang/go/ioutil2"
"github.com/go-kratos/kratos/tool/protobuf/pkg/utils"
) )
// if proto file is inside a project (that has a /api directory) // if proto file is inside a project (that has a /api directory)
@ -73,6 +74,7 @@ func NewProjInfo(file string, modDirName string, modImportPath string) (projInfo
i := strings.Index(projInfo.AbsolutePath, modDirName) i := strings.Index(projInfo.AbsolutePath, modDirName)
if i == -1 { if i == -1 {
err = errors.Errorf("project is not inside module, project=%s, module=%s", projPath, modDirName) err = errors.Errorf("project is not inside module, project=%s, module=%s", projPath, modDirName)
return nil, err
} }
relativePath := projInfo.AbsolutePath[i+len(modDirName):] relativePath := projInfo.AbsolutePath[i+len(modDirName):]
projInfo.ImportPath = modImportPath + relativePath projInfo.ImportPath = modImportPath + relativePath

@ -1,9 +1,10 @@
package tag package tag
import ( import (
"github.com/go-kratos/kratos/tool/protobuf/pkg/extensions/gogoproto"
"github.com/golang/protobuf/proto" "github.com/golang/protobuf/proto"
"github.com/golang/protobuf/protoc-gen-go/descriptor" "github.com/golang/protobuf/protoc-gen-go/descriptor"
"github.com/go-kratos/kratos/tool/protobuf/pkg/extensions/gogoproto"
) )
func GetMoreTags(field *descriptor.FieldDescriptorProto) *string { func GetMoreTags(field *descriptor.FieldDescriptorProto) *string {

@ -6,14 +6,15 @@ import (
"sort" "sort"
"strings" "strings"
"github.com/golang/protobuf/proto"
"github.com/golang/protobuf/protoc-gen-go/descriptor"
plugin "github.com/golang/protobuf/protoc-gen-go/plugin"
"github.com/go-kratos/kratos/tool/protobuf/pkg/generator" "github.com/go-kratos/kratos/tool/protobuf/pkg/generator"
"github.com/go-kratos/kratos/tool/protobuf/pkg/naming" "github.com/go-kratos/kratos/tool/protobuf/pkg/naming"
"github.com/go-kratos/kratos/tool/protobuf/pkg/tag" "github.com/go-kratos/kratos/tool/protobuf/pkg/tag"
"github.com/go-kratos/kratos/tool/protobuf/pkg/typemap" "github.com/go-kratos/kratos/tool/protobuf/pkg/typemap"
"github.com/go-kratos/kratos/tool/protobuf/pkg/utils" "github.com/go-kratos/kratos/tool/protobuf/pkg/utils"
"github.com/golang/protobuf/proto"
"github.com/golang/protobuf/protoc-gen-go/descriptor"
plugin "github.com/golang/protobuf/protoc-gen-go/plugin"
) )
type bm struct { type bm struct {
@ -122,8 +123,7 @@ func (t *bm) generateImports(file *descriptor.FileDescriptorProto) {
// It's legal to import a message and use it as an input or output for a // It's legal to import a message and use it as an input or output for a
// method. Make sure to import the package of any such message. First, dedupe // method. Make sure to import the package of any such message. First, dedupe
// them. // them.
deps := make(map[string]string) // Map of package name to quoted import path. deps := t.DeduceDeps(file)
deps = t.DeduceDeps(file)
for pkg, importPath := range deps { for pkg, importPath := range deps {
t.P(`import `, pkg, ` `, importPath) t.P(`import `, pkg, ` `, importPath)
} }
@ -132,7 +132,6 @@ func (t *bm) generateImports(file *descriptor.FileDescriptorProto) {
t.P(`var _ *bm.Context`) t.P(`var _ *bm.Context`)
t.P(`var _ context.Context`) t.P(`var _ context.Context`)
t.P(`var _ binding.StructValidator`) t.P(`var _ binding.StructValidator`)
} }
// Big header comments to makes it easier to visually parse a generated file. // Big header comments to makes it easier to visually parse a generated file.

@ -7,13 +7,14 @@ import (
"regexp" "regexp"
"strings" "strings"
"github.com/golang/protobuf/protoc-gen-go/descriptor"
plugin "github.com/golang/protobuf/protoc-gen-go/plugin"
"github.com/go-kratos/kratos/tool/protobuf/pkg/gen" "github.com/go-kratos/kratos/tool/protobuf/pkg/gen"
"github.com/go-kratos/kratos/tool/protobuf/pkg/generator" "github.com/go-kratos/kratos/tool/protobuf/pkg/generator"
"github.com/go-kratos/kratos/tool/protobuf/pkg/naming" "github.com/go-kratos/kratos/tool/protobuf/pkg/naming"
"github.com/go-kratos/kratos/tool/protobuf/pkg/tag" "github.com/go-kratos/kratos/tool/protobuf/pkg/tag"
"github.com/go-kratos/kratos/tool/protobuf/pkg/typemap" "github.com/go-kratos/kratos/tool/protobuf/pkg/typemap"
"github.com/golang/protobuf/protoc-gen-go/descriptor"
plugin "github.com/golang/protobuf/protoc-gen-go/plugin"
) )
type swaggerGen struct { type swaggerGen struct {

@ -4,11 +4,12 @@ import (
"strconv" "strconv"
"strings" "strings"
"github.com/go-kratos/kratos/tool/protobuf/pkg/generator"
"github.com/go-kratos/kratos/tool/protobuf/pkg/naming"
"github.com/golang/protobuf/proto" "github.com/golang/protobuf/proto"
"github.com/golang/protobuf/protoc-gen-go/descriptor" "github.com/golang/protobuf/protoc-gen-go/descriptor"
plugin "github.com/golang/protobuf/protoc-gen-go/plugin" plugin "github.com/golang/protobuf/protoc-gen-go/plugin"
"github.com/go-kratos/kratos/tool/protobuf/pkg/generator"
"github.com/go-kratos/kratos/tool/protobuf/pkg/naming"
) )
type ecode struct { type ecode struct {

Loading…
Cancel
Save