3.2 gRPC
内置了多个中间件,可以采集请求日志、采集trace、采集监控、采集慢日志,更加方便我们对gRPC
服务的可观测。
通过govern
的治理端口,能够查看监控、HTTP实时信息
参考
配置项
func main() {
eng := NewEngine()
eng.SetGovernor("127.0.0.1:9092")
if err := eng.Run(); err != nil {
xlog.Panic(err.Error())
}
}
type Engine struct {
jupiter.Application
}
func NewEngine() *Engine {
eng := &Engine{}
if err := eng.Startup(
eng.serveGRPC,
); err != nil {
xlog.Panic("startup", xlog.Any("err", err))
}
return eng
}
func (eng *Engine) serveGRPC() error {
server := xgrpc.StdConfig("grpc").Build()
helloworld.RegisterGreeterServer(server.Server, new(Greeter))
return eng.Serve(server)
}
type Greeter struct{}
func (g Greeter) SayHello(context context.Context, request *helloworld.HelloRequest) (*helloworld.HelloReply, error) {
return &helloworld.HelloReply{
Message: "Hello Jupiter",
}, nil
}
运行指令go run main.go --config=config.toml
,可以看到以下运行结果 从图中可以看到,我们启动了一个gRPC
服务运行在9091
端口,接下来我们启动客户端
配置项
代码
func main() {
eng := NewEngine()
if err := eng.Run(); err != nil {
xlog.Error(err.Error())
}
}
type Engine struct {
jupiter.Application
func NewEngine() *Engine {
eng := &Engine{}
if err := eng.Startup(
eng.consumer,
xlog.Panic("startup", xlog.Any("err", err))
}
return eng
}
func (eng *Engine) consumer() error {
conn := grpc.StdConfig("directserver").Build()
client := helloworld.NewGreeterClient(conn)
for {
resp, err := client.SayHello(context.Background(), &helloworld.HelloRequest{
Name: "jupiter",
})
if err != nil {
xlog.Error(err.Error())
} else {
xlog.Info("receive response", xlog.String("resp", resp.Message))
}
time.Sleep(1 * time.Second)
}
return nil
}
我们的gRPC
客户端通过配置里的地址和负载均衡算法,可以请求刚才我们启动的gRPC
服务端。运行指令go run main.go --config=config.toml
,可以看到以下运行结果 我们定时1s,发送
hello
给gRPC
服务端,可以收到服务端响应的Hello Jupiter
代码
func main() {
eng := NewEngine()
eng.SetRegistry(
compound_registry.New(
etcdv3_registry.StdConfig("wh").BuildRegistry(),
),
)
eng.SetGovernor("127.0.0.1:9092")
if err := eng.Run(); err != nil {
xlog.Error(err.Error())
}
}
type Engine struct {
jupiter.Application
}
func NewEngine() *Engine {
eng := &Engine{}
if err := eng.Startup(
eng.serveGRPC,
); err != nil {
xlog.Panic("startup", xlog.Any("err", err))
}
return eng
}
server := xgrpc.StdConfig("grpc").Build()
helloworld.RegisterGreeterServer(server.Server, new(Greeter))
return eng.Serve(server)
}
func (g Greeter) SayHello(context context.Context, request *helloworld.HelloRequest) (*helloworld.HelloReply, error) {
return &helloworld.HelloReply{
Message: "Hello Jupiter",
}, nil
}
运行指令go run main.go --config=config.toml
,可以看到以下运行结果 从图中可以看到,我们启动了一个
gRPC
服务运行在9091
端口,在命令行的第四行,展示了我们注册的key
和value
信息。接下来我们在启动客户端。
配置项
代码
func main() {
eng := NewEngine()
if err := eng.Run(); err != nil {
xlog.Error(err.Error())
}
}
type Engine struct {
jupiter.Application
}
func NewEngine() *Engine {
eng := &Engine{}
if err := eng.Startup(
eng.initResolver,
eng.consumer,
); err != nil {
xlog.Panic("startup", xlog.Any("err", err))
}
return eng
}
func (eng *Engine) initResolver() error {
resolver.Register(etcdv3_registry.StdConfig("wh").BuildResolver())
return nil
}
func (eng *Engine) consumer() error {
conn := grpc.StdConfig("etcdserver").Build()
client := helloworld.NewGreeterClient(conn)
for {
resp, err := client.SayHello(context.Background(), &helloworld.HelloRequest{
Name: "jupiter",
})
if err != nil {
xlog.Error(err.Error())
} else {
xlog.Info("receive response", xlog.String("resp", resp.Message))
}
time.Sleep(1 * time.Second)
}
return nil
运行指令go run main.go --config=config.toml
,可以看到以下运行结果 我们的gRPC
客户端通过应用名称main
从ETCD
中获取到服务地址,并监听了/jupiter/main
,用于后续更新服务地址。