代码拉取完成,页面将自动刷新
package grpc
import (
"context"
"fmt"
v1etcd "gitee.com/scottq/go-framework/src/v1/clients/etcd"
"google.golang.org/grpc"
"google.golang.org/grpc/balancer"
"google.golang.org/grpc/balancer/base"
"google.golang.org/grpc/resolver"
"time"
)
type RemoteOption func(*RemoteConn) error
type RemoteConn struct {
name string
addr string
balanceName string
connTimeout int64
}
func NewRemoteConn(name string, addr string, options ...RemoteOption) (*grpc.ClientConn, error) {
defer func() {
if err := recover(); err != nil {
panic(fmt.Errorf("%s", err))
}
}()
rConn := &RemoteConn{
name: name,
addr: addr,
balanceName: "round_robin",
connTimeout: 10,
}
for _, opt := range options {
err := opt(rConn)
if err != nil {
return nil, err
}
}
return rConn.getClient()
}
func (conn *RemoteConn) getClient() (*grpc.ClientConn, error) {
ctx, cancel := context.WithTimeout(context.Background(), time.Duration(conn.connTimeout)*time.Second)
defer cancel()
serviceConfig := grpc.WithDefaultServiceConfig(fmt.Sprintf("{\"loadBalancingConfig\":[{\"%s\":{}}]}", conn.balanceName))
return grpc.DialContext(ctx, conn.addr, grpc.WithInsecure(), grpc.WithBlock(), serviceConfig)
}
func OptConnTimeout(d int64) RemoteOption {
return func(conn *RemoteConn) error {
conn.connTimeout = d
return nil
}
}
func OptEtcdDiscovery(addr string) RemoteOption {
return func(conn *RemoteConn) error {
if addr == "" {
addr = conn.addr
}
d, err := v1etcd.NewServiceDiscovery(addr, 5)
if err != nil {
return err
}
resolver.Register(d)
b := &WeightBalance{}
balancer.Register(base.NewBalancerBuilder(b.Name(), b, base.Config{HealthCheck: true}))
conn.addr = fmt.Sprintf("%s://8.8.8.8/%s", d.Scheme(), conn.name)
conn.balanceName = b.Name()
return nil
}
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。