Grpc

[[toc]]

介绍

Grpc 模块可以使用 facades.Grpc 进行操作。

路由文件

所有路由文件可以定义在 /routes 目录中,例如 /routes/grpc.go。然后注册到 app/providers/grpc_service_provider.go 文件中,以实现路由的绑定。

  1. // routes/grpc.go
  2. func Grpc() {
  3. protos.RegisterUserServer(facades.Grpc.Server(), &controllers.UserController{})
  4. }
  5. // app/providers/grpc_service_provider.go
  6. func (router *GrpcServiceProvider) Boot() {
  7. routes.Grpc()
  8. }

控制器

控制器文件可以定义在 /app/grpc/controllers 目录中。

  1. // /app/grpc/controllers/user_controller.go
  2. package controllers
  3. import (
  4. "context"
  5. "net/http"
  6. "goravel/protos"
  7. )
  8. type UserController struct {
  9. }
  10. func (r *UserController) GetUser(ctx context.Context, req *protos.UserRequest) (protoUser *protos.UserResponse, err error) {
  11. return &protos.UserResponse{
  12. Code: http.StatusOK,
  13. Data: &protos.User{
  14. Id: user.Id,
  15. },
  16. }, nil
  17. }

启动 Grpc 服务器

main.go 中启动 Grpc

  1. go func() {
  2. if err := facades.Grpc.Run(facades.Config.GetString("grpc.host")); err != nil {
  3. facades.Log.Errorf("Grpc run error: %v", err)
  4. }
  5. }()

扩展

facades.Grpc 提供扩展方法,可以对 Server 进行扩展,例如中间件的设置:

名称 描述
Server() *grpc.Server 获取 Server 实例
SetServer(server *grpc.Server) 设置 Server 实例
  1. // 设置链路跟踪中间件
  2. // app/providers/grpc_service_provider.go
  3. func (router *GrpcServiceProvider) Boot() {
  4. tracer, _ := helpers.NewJaegerTracer()
  5. facades.Grpc.SetServer(grpc.NewServer(grpc.UnaryInterceptor(
  6. grpc_middleware.ChainUnaryServer(
  7. middleware.OpentracingServer(tracer),
  8. ),
  9. )))
  10. routes.Grpc()
  11. }