服务连接

概述

本文介绍如何使用 gRPC 框架进行 gRPC Client 的开发。

示例

准备工作

我们执行 goctl rpc new greet 生成一个 rpc server 服务。

  1. # 创建一个 demo 目录,进入 demo 目录
  2. $ mkdir demo && cd demo
  3. # 生成一个 greet 服务
  4. $ goctl rpc new greet
  5. # 新建一个 main.go 文件来创建一个 greet 服务的客户端
  6. $ touch main.go
服务连接 - 图1tip

以下配置详情请参考 服务配置

goctl rpc 指令使用请参考 goctl rpc

直连

直连分为两种模式,一种是直连单个服务,一种是直连服务集群。

地址解析模式

在 main.go 文件中代码如下

  1. func main() {
  2. clientConf:=zrpc.RpcClientConf{}
  3. conf.FillDefault(&clientConf)// 填充默认值,比如 trace 透传等,参考服务配置说明
  4. clientConf.Target = "dns:///127.0.0.1:8080"
  5. conn := zrpc.MustNewClient(clientConf)
  6. client := greet.NewGreetClient(conn.Conn())
  7. resp, err := client.Ping(context.Background(), &greet.Request{})
  8. if err != nil {
  9. log.Println(err)
  10. return
  11. }
  12. log.Println(resp)
  13. }

多节点直连模式

在 main.go 文件中代码如下

  1. func main() {
  2. clientConf:=zrpc.RpcClientConf{}
  3. conf.FillDefault(&clientConf)// 填充默认值,比如 trace 透传等,参考服务配置说明
  4. clientConf.Endpoints = []string{"127.0.0.1:8080","127.0.0.2:8080"}// 直连集群时,只需要给 Endpoints 配置 rpc server的地址即可
  5. conn := zrpc.MustNewClient(clientConf)
  6. client := greet.NewGreetClient(conn.Conn())
  7. resp, err := client.Ping(context.Background(), &greet.Request{})
  8. if err != nil {
  9. log.Println(err)
  10. return
  11. }
  12. log.Println(resp)
  13. }

etcd 服务发现

在 main.go 文件中代码如下

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

原生支持

如果你不想使用 go-zero rpc 的 client 进行初始化,zrpc 也支持 grpc.ClientConn 的原生支持,你可以直接使用 grpc.ClientConn 进行初始化。

  1. func main() {
  2. conn,err:=grpc.Dial("127.0.0.1:8080",grpc.WithBlock(), grpc.WithTransportCredentials(insecure.NewCredentials()))
  3. if err!=nil{
  4. log.Println(err)
  5. return
  6. }
  7. client := greet.NewGreetClient(conn)
  8. resp, err := client.Ping(context.Background(), &greet.Request{})
  9. if err != nil {
  10. log.Println(err)
  11. return
  12. }
  13. log.Println(resp)
  14. }

其他服务发现

除了 go-zero 内置的 ectd 作为服务发现外,社区还提供了对 nacos,consul 等的服务发现支持,详情可参考 更多服务发现组件