Service Connection

Service Connection

Overview

This paper describes how to use the gRPC framework for the development of GRPC Client.

Sample

Preparation

We run goctl rpc new greet to generate a rpc server service.

## Create a demo directory, Enter the demo directory
$ mkdir demo && cd demo
## Generate a gret service
$ goctl rpc new greet
## Create a new main. o File to create a client for a greet service
$ touch main.go
Service Connection - 图1 tip

The following configuration details are referenced service configuration

goctl rpc usage reference goctl rpc

Direct

There are two modes of continuous connectivity, one for a single service and one for a continual service cluster.

Address resolve mode

In main.go file the following code

func main() {
    clientConf:=zrpc.RpcClientConf{}
    conf.FillDefault(&clientConf)
    clientConf.Target = "dns:///127.0.0.1:8080"
    conn := zrpc.MustNewClient(clientConf)
    client := greet.NewGreetClient(conn.Conn())
    resp, err := client.Ping(context.Background(), &greet.Request{})
    if err != nil {
        log.Println(err)
        return
    }
    log.Println(resp)
}

Multi-node direct connection mode

In main.go file the following code

func main() {
   clientConf:=zrpc.RpcClientConf{}
    conf.FillDefault(&clientConf)
    clientConf.Endpoints = []string{"127.0.0.1:8080","127.0.0.2:8080"}
    conn := zrpc.MustNewClient(clientConf)
    client := greet.NewGreetClient(conn.Conn())
    resp, err := client.Ping(context.Background(), &greet.Request{})
    if err != nil {
        log.Println(err)
        return
    }
    log.Println(resp)
}

etcd service discovery

In main.go file the following code

func main() {
    clientConf:=zrpc.RpcClientConf{}
    conf.FillDefault(&clientConf)// 填充默认值,比如 trace 透传等,参考服务配置说明
    clientConf.Etcd = discov.EtcdConf{// 通过 etcd 服务发现时,只需要给 Etcd 配置即可
        Hosts:              []string{"127.0.0.1:2379"},
        Key:                "greet.rpc",
        User:               "",// 当 etcd 开启 acl 时才填写,这里为了展示所以没有删除,实际使用如果没有开启 acl 可忽略
        Pass:               "",// 当 etcd 开启 acl 时才填写,这里为了展示所以没有删除,实际使用如果没有开启 acl 可忽略
        CertFile:           "",// 当 etcd 开启 acl 时才填写,这里为了展示所以没有删除,实际使用如果没有开启 acl 可忽略
        CertKeyFile:        "",// 当 etcd 开启 acl 时才填写,这里为了展示所以没有删除,实际使用如果没有开启 acl 可忽略
        CACertFile:         "",// 当 etcd 开启 acl 时才填写,这里为了展示所以没有删除,实际使用如果没有开启 acl 可忽略
        InsecureSkipVerify: false,// 当 etcd 开启 acl 时才填写,这里为了展示所以没有删除,实际使用如果没有开启 acl 可忽略
    }
    conn := zrpc.MustNewClient(clientConf)
    client := greet.NewGreetClient(conn.Conn())
    resp, err := client.Ping(context.Background(), &greet.Request{})
    if err != nil {
        log.Println(err)
        return
    }
    log.Println(resp)
}

Native Support

If you do not want to initialize using a go-zero repc client, zrpc also supports grpc.ClientConn, you can use grpc.ClientConn directly.

func main() {
    conn,err:=grpc.Dial("127.0.0.1:8080",grpc.WithBlock(), grpc.WithTransportCredentials(insecure.NewCredentials()))
    if err!=nil{
        log.Println(err)
        return
    }
    client := greet.NewGreetClient(conn)
    resp, err := client.Ping(context.Background(), &greet.Request{})
    if err != nil {
        log.Println(err)
        return
    }
    log.Println(resp)
}

Other Service Discoveries

In addition to a go-zero built-in ecd as a service, the community also provides support for the discovery of services such as nacos, consul, etc. More Services found components for details