Skip to content

Commit da12b40

Browse files
committed
feat: adaptation for gRPC
1 parent 17f3e32 commit da12b40

File tree

1 file changed

+75
-0
lines changed

1 file changed

+75
-0
lines changed

pkg/adapters/grpc/traffic.go

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
package grpc
2+
3+
import (
4+
"context"
5+
"errors"
6+
"fmt"
7+
"github.com/alibaba/sentinel-golang/core/route"
8+
"github.com/alibaba/sentinel-golang/core/route/base"
9+
"google.golang.org/grpc/metadata"
10+
"net"
11+
"strings"
12+
)
13+
14+
type DialerOption func(*dialerOptions)
15+
type dialerOptions struct {
16+
cm *route.ClusterManager
17+
md metadata.MD
18+
}
19+
20+
func NewDialer(opts ...DialerOption) func(context.Context, string) (net.Conn, error) {
21+
options := evaluateDialerOptions(opts)
22+
return func(ctx context.Context, addr string) (net.Conn, error) {
23+
cm := options.cm
24+
parts := strings.Split(addr, "/")
25+
if len(parts) != 2 {
26+
return nil, errors.New("invalid address format")
27+
}
28+
tc := &base.TrafficContext{
29+
ServiceName: parts[0],
30+
MethodName: parts[1],
31+
Headers: make(map[string]string),
32+
}
33+
34+
for key, vals := range options.md {
35+
if len(vals) == 0 {
36+
continue
37+
}
38+
tc.Headers[key] = vals[len(vals)-1]
39+
}
40+
41+
instance, err := cm.GetOne(tc)
42+
43+
for k, v := range tc.Baggage {
44+
options.md[k] = []string{v}
45+
}
46+
47+
if err != nil {
48+
return nil, err
49+
}
50+
if instance == nil {
51+
return nil, errors.New("no matched provider")
52+
}
53+
return net.Dial("tcp", fmt.Sprintf("%s:%v", instance.Host, instance.Port))
54+
}
55+
}
56+
57+
func WithClusterManager(cm *route.ClusterManager) DialerOption {
58+
return func(d *dialerOptions) {
59+
d.cm = cm
60+
}
61+
}
62+
63+
func WithMetadata(md metadata.MD) DialerOption {
64+
return func(d *dialerOptions) {
65+
d.md = md
66+
}
67+
}
68+
69+
func evaluateDialerOptions(opts []DialerOption) *dialerOptions {
70+
ret := &dialerOptions{}
71+
for _, opt := range opts {
72+
opt(ret)
73+
}
74+
return ret
75+
}

0 commit comments

Comments
 (0)