go-zero中直连方式
使用grpc时最重要的是pb文件。生成的pb文件可以通过pb文件生成grpc客户端和服务端。然后客户端和服务器就可以直接连接了。再次可以引入etcd来实现服务。登记。
所有的代码都需要开发者编写,包括配置etcd,在grpc的服务端注册到etcd中并发送心跳,客户端通过etcd获取服务端地址访问rpc服务器。(具体实现方式参考:gRPC远程调用服务器与客户端连接详解)
etcd 服务注册和发现将客户端地址注册到etcd服务器。
不过go-zero框架集成了grpc并扩展了功能。该库名为 zrpc。该库将读取 yaml、config 和 svc 目录的配置,包括直接连接 grpc 或连接 etcd。开发者可以使用zrpc后,只需要在yaml中进行配置即可。
go-zero的gpctl工具生成的代码一般都包括:
yaml文件
Name: demorpc.rpc
ListenOn: 0.0.0.0:8080
Etcd:
Hosts:
- 192.168.24.128:2379
Key: demorpc.rpc
config
配置文件
type Config struct {
zrpc.RpcServerConf
}
svc
目录
type ServiceContext struct {
Config config.Config
}
func NewServiceContext(c config.Config) *ServiceContext {
return &ServiceContext{
Config: c,
}
}
zrpc将所有配置搬到yml中,通过config和svc的双层调用,方便第三方工具的集成。
goctl生成的rpc最初的配置是启动一个rpc服务名、ip和端口。
通过配置文件启动代码将在指定端口和IP上启动一个rpc服务器。
goctl工具生成时还帮助生成了客户端代码,不需要开发者通过原始的pb文件编写客户端。(如何分项目的话需要将pb和客户端代码一起移动)并将zrpc融入到代码中使得也可以通过yaml来配置客户端。
zrpc直接实现客户端代码,不需要开发编写。另外,生成的代码默认注册到etcd中。如果使用直连,可以注释并调整etcd配置。
本例采用直连方式,对Etcd的配置进行注解,通过生成的文件写入客户端。 pb的客户端生成文件也是用go-zero重写的,开发者直接基于这个方法实例化。客户。如下
方法的生成所在目录可能不一样,包含定义的epc方法和返回
XXXclient
就是。
利用方法的NewXXX
创建客户端,如下
func main() {
ip := []string{
"127.0.0.1:8080"}
clientconf := zrpc.RpcClientConf{
Endpoints: ip}
client := zrpc.MustNewClient(clientconf)
param := demorpc.Request{
Ping: "11",
}
ping, err := demorpcclient.NewDemorpc(client).Ping(context.Background(), ¶m)
if err != nil {
}
fmt.Println(ping)
}
NewXXX
的方法参数是zrpc.Client
类型,zrpc.MustNewClient
方法返回该类型,其参数又是zrpc.RpcClientConf
配置类型,如下
其中Etcd
是注册中心配置,Endpoints
是服务集群配置,可配置多个rpc服务端,Target
是单个rpc直连配置。如下为客户端代码:
import (
"context"
"etcd/demorpc/demorpc"
"etcd/demorpc/demorpcclient"
"fmt"
"github.com/zeromicro/go-zero/zrpc"
)
func main() {
ip := []string{
"127.0.0.1:8080"}
//clientconf := zrpc.RpcClientConf{Endpoints: ip}
clientconf := zrpc.RpcClientConf{
Target: ip[0]}
client := zrpc.MustNewClient(clientconf)
param := demorpc.Request{
Ping: "11",
}
ping, err := demorpcclient.NewDemorpc(client).Ping(context.Background(), ¶m)
if err != nil {
}
fmt.Println(ping)
}
服务端方法如下
在客户端配置服务器的IP和端口,实现直连。分别启动服务器和客户端。
etcd服务注册于发现
了解了直连方式后,etcd注册中心就变得简单了。
在直接连接中,注释掉etcd配置,
zrpc.RpcClientConf
配置使用Target
或者Endpoints
即可。
在etcd注册中心中,配置etcd,使用Etcd
即可,如下
下载并启动etcd服务器,配置服务器ip及端口
启动服务器
启动服务器时不断报告此错误。原因是etcd服务器启动方式错误,缺少配置参数导致无法连接远程。
如果直接使用etcd
命令启动就会报如下标题的错误。
No connection could be made because the target machine actively refused it
panic: context deadline exceeded
启动 etcd 的正确命令是:
etcd --listen-client-urls 'http://0.0.0.0:2379' --advertise-client-urls 'http://0.0.0.0:2379'
# stop
systemctl stop etcd
# status
systemctl status etcd
使用上述命令启动后,不会报错。
在etcd服务器上使用命令查看所有key:
export ETCDCTL_API=3
etcdctl get --prefix ""
在客户端使用Etcd
配置参数,携带Key即可
import (
"context"
"etcd/demorpc/demorpc"
"etcd/demorpc/demorpcclient"
"fmt"
"github.com/zeromicro/go-zero/core/discov"
"github.com/zeromicro/go-zero/zrpc"
)
func main() {
ip := []string{
"127.0.0.1:8080"}
//clientconf := zrpc.RpcClientConf{Endpoints: ip}
//clientconf := zrpc.RpcClientConf{Target: ip[0]}
clientconf := zrpc.RpcClientConf{
Etcd: discov.EtcdConf{
Hosts: ip,
Key: "demorpc.rpc",
}}
client := zrpc.MustNewClient(clientconf)
param := demorpc.Request{
Ping: "11",
}
ping, err := demorpcclient.NewDemorpc(client).Ping(context.Background(), ¶m)
if err != nil {
}
fmt.Println(ping)
}