Skip to content

Commit ee2bfb9

Browse files
committed
feat: adaptation for gRPC
1 parent 1578998 commit ee2bfb9

File tree

1 file changed

+66
-0
lines changed

1 file changed

+66
-0
lines changed

pkg/adapters/grpc/traffic.go

+66
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
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+
"net"
10+
"strings"
11+
)
12+
13+
type DialerOption func(*dialerOptions)
14+
type dialerOptions struct {
15+
cm *route.ClusterManager
16+
headers map[string]string
17+
}
18+
19+
func NewDialer(opts ...DialerOption) func(context.Context, string) (net.Conn, error) {
20+
options := evaluateDialerOptions(opts)
21+
return func(ctx context.Context, addr string) (net.Conn, error) {
22+
cm := options.cm
23+
parts := strings.Split(addr, "/")
24+
if len(parts) != 2 {
25+
return nil, errors.New("invalid address format")
26+
}
27+
tc := &base.TrafficContext{
28+
ServiceName: parts[0],
29+
MethodName: parts[1],
30+
Headers: make(map[string]string),
31+
}
32+
33+
for k, v := range options.headers {
34+
tc.Headers[k] = v
35+
}
36+
37+
instances, err := cm.Route(tc)
38+
if err != nil {
39+
return nil, err
40+
}
41+
if len(instances) == 0 {
42+
return nil, errors.New("no matched provider")
43+
}
44+
return net.Dial("tcp", fmt.Sprintf("%s:%v", instances[0].Host, instances[0].Port))
45+
}
46+
}
47+
48+
func WithClusterManager(cm *route.ClusterManager) DialerOption {
49+
return func(d *dialerOptions) {
50+
d.cm = cm
51+
}
52+
}
53+
54+
func WithHeaders(headers map[string]string) DialerOption {
55+
return func(d *dialerOptions) {
56+
d.headers = headers
57+
}
58+
}
59+
60+
func evaluateDialerOptions(opts []DialerOption) *dialerOptions {
61+
ret := &dialerOptions{}
62+
for _, opt := range opts {
63+
opt(ret)
64+
}
65+
return ret
66+
}

0 commit comments

Comments
 (0)