grpcx框架分析二: client端分析

项目地址:https://github.com/yakaa/grpcx

grpc client常规使用方法

func main() {
	conn, err := grpc.Dial("127.0.0.1:9000", grpc.WithInsecure())
	if err != nil {
		log.Fatalf(" grpc.Dial %v", err)
	}
	defer conn.Close()

	

	//UserService
	userClient := protoFiles_hello.NewUserServiceClient(conn)
	userRes, err := userClient.UserList(context.Background(), &protoFiles_hello.UserRequest{
		Name:   "小明",
		Mobile: "18811118888",
	})
	if nil != err {
		log.Fatal(err)
	}

	//fmt.Printf("%T, %v\n",userRes,userRes)
	for key, user := range userRes.User {
		fmt.Println(key, user)
	}

}

grpcx客户端启动代码

  1. 配置clientConf配置文件
  2. grpxc.MustNewGrpcxCLient函数看下面分析
  3. r.GetConnection看下面分析,
  4. 获取到conn后生成一个新的RegionHandlerClient,然后调用rpc的接口即可
  5. 内部的负载均衡,是有官方的grpc第三方库实现的(自己的理解)
func Client() {
	conf := &config.ClientConf{
		EtcdAuth:  config.EtcdAuth{},
		Target:    "www.vector.com:///knowing",
		Endpoints: []string{"127.0.0.1:2379"},
		WithBlock: false,
	}

	r, err := grpcx.MustNewGrpcxClient(conf)
	if err != nil {
		panic(err)
	}
	conn, err := r.GetConnection()
	if err != nil {
		panic(err)
	}
	regionHandlerClient := proto.NewRegionHandlerClient(conn)
	for {
		res, err := regionHandlerClient.GetListenAudio(
			context.Background(),
			&proto.FindRequest{Tokens: []string{"a_"}},
		)
		if err != nil {
			log.Fatal(err)
		}
		fmt.Println(res)
		time.Sleep(1 * time.Second)
	}
}

grpcx.MustNewGrpcxClient()函数

conf := &config.ClientConf{
   EtcdAuth:  config.EtcdAuth{},
   Target:    "www.vector.com:///knowing",
   Endpoints: []string{"127.0.0.1:2379"},
   WithBlock: false,
}
  1. NewResolver    
    Resolver模块是客户端操作etcd的主要模块
  2. client3, err := clientv3.New(
       clientv3.Config{
          Endpoints:   conf.Endpoints,   //[]string{"127.0.0.1:2379"},
          Username:    conf.UserName,    
          Password:    conf.PassWord,
          DialTimeout: config.GrpcxDialTimeout,   //GrpcxDialTimeout = 3 * time.Second
       })
  3. &Resolver{
       client3:   client3,    //2获取的client3
       withBlock: conf.WithBlock,  //是否阻塞
       target:    conf.Target, //"www.vector.com:///knowing",     //必须这样配置
    }, nil  
  4. resolver的其他接口(自己理解是用于grpc负载均衡调用的方法),客户端我们用不到
func MustNewGrpcxClient(conf *config.ClientConf) (*GrpcxClient, error) {
	r, err := resolver.NewResolver(conf)
	if err != nil {
		return nil, err
	}
	rpcResolver.Register(r)
	return &GrpcxClient{resolver: r, timeOut: config.GrpcxDialTimeout}, nil
}

// NewResolver initialize an etcd client
func NewResolver(conf *config.ClientConf) (*Resolver, error) {
	client3, err := clientv3.New(
		clientv3.Config{
			Endpoints:   conf.Endpoints,
			Username:    conf.UserName,
			Password:    conf.PassWord,
			DialTimeout: config.GrpcxDialTimeout,
		})
	if nil != err {
		return nil, err
	}
	return &Resolver{
		client3:   client3,
		withBlock: conf.WithBlock,
		target:    conf.Target, //"www.vector.com:///knowing",
	}, nil
}

 GetConnection函数

主要作用是和常规使用差不多, 进行了部分参数配置,grpc.WithBalancerName(roundrobin.Name)使用轮训的负载均衡方法

context是使用有超时的上下文,timeout是在MustNewGrpcxClient函数的时候赋值的,然后带超时上下文和etcd节点的connection

func (c *GrpcxClient) GetConnection(options ...grpc.DialOption) (*grpc.ClientConn, error) {
	opts := []grpc.DialOption{grpc.WithInsecure(), grpc.WithBalancerName(roundrobin.Name)}
	if c.resolver.WithBlock() {
		opts = append(opts, grpc.WithBlock())
	}
	opts = append(opts, options...)

	ctx, _ := context.WithTimeout(context.Background(), c.timeOut)
	return grpc.DialContext(ctx, c.resolver.Target(), opts...)
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值