/
builder.go
79 lines (65 loc) · 1.72 KB
/
builder.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
package client
import (
"github.com/dobyte/due/transport/grpc/v2/internal/resolver/direct"
"github.com/dobyte/due/transport/grpc/v2/internal/resolver/discovery"
"github.com/dobyte/due/v2/registry"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials"
"google.golang.org/grpc/credentials/insecure"
"google.golang.org/grpc/resolver"
"sync"
)
type Builder struct {
err error
opts *Options
dialOpts []grpc.DialOption
pools sync.Map
}
type Options struct {
PoolSize int
CertFile string
ServerName string
Discovery registry.Discovery
DialOpts []grpc.DialOption
}
func NewBuilder(opts *Options) *Builder {
b := &Builder{opts: opts}
var creds credentials.TransportCredentials
if opts.CertFile != "" && opts.ServerName != "" {
creds, b.err = credentials.NewClientTLSFromFile(opts.CertFile, opts.ServerName)
if b.err != nil {
return b
}
} else {
creds = insecure.NewCredentials()
}
resolvers := make([]resolver.Builder, 0, 2)
resolvers = append(resolvers, direct.NewBuilder())
if opts.Discovery != nil {
resolvers = append(resolvers, discovery.NewBuilder(opts.Discovery))
}
b.dialOpts = make([]grpc.DialOption, 0, len(opts.DialOpts)+2)
b.dialOpts = append(b.dialOpts, grpc.WithTransportCredentials(creds))
b.dialOpts = append(b.dialOpts, grpc.WithResolvers(resolvers...))
return b
}
// Build 构建连接
func (b *Builder) Build(target string) (*grpc.ClientConn, error) {
if b.err != nil {
return nil, b.err
}
val, ok := b.pools.Load(target)
if ok {
return val.(*Pool).Get(), nil
}
size := b.opts.PoolSize
if size <= 0 {
size = 10
}
pool, err := newPool(size, target, b.dialOpts...)
if err != nil {
return nil, err
}
b.pools.Store(target, pool)
return pool.Get(), nil
}