Grpc

[[toc]]

介绍

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

控制器

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

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

定义路由

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

  1. // routes/grpc.go
  2. package routes
  3. import (
  4. "github.com/goravel/grpc/protos"
  5. "github.com/goravel/framework/facades"
  6. "goravel/app/grpc/controllers"
  7. )
  8. func Grpc() {
  9. protos.RegisterUserServer(facades.Grpc.Server(), controllers.NewUserController())
  10. }

注册路由

路由定义好后,在 app/providers/grpc_service_provider.go 文件中注册路由。

  1. // app/providers/grpc_service_provider.go
  2. package providers
  3. import (
  4. "goravel/routes"
  5. )
  6. type GrpcServiceProvider struct {
  7. }
  8. func (router *GrpcServiceProvider) Register() {
  9. }
  10. func (router *GrpcServiceProvider) Boot() {
  11. routes.Grpc()
  12. }

启动 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. // app/providers/grpc_service_provider.go
  2. package providers
  3. import (
  4. "github.com/goravel/framework/facades"
  5. grpc_middleware "github.com/grpc-ecosystem/go-grpc-middleware"
  6. "google.golang.org/grpc"
  7. "goravel/routes"
  8. )
  9. type GrpcServiceProvider struct {
  10. }
  11. func (router *GrpcServiceProvider) Register() {
  12. }
  13. func (router *GrpcServiceProvider) Boot() {
  14. facades.Grpc.SetServer(grpc.NewServer(grpc.UnaryInterceptor(
  15. grpc_middleware.ChainUnaryServer(
  16. // Add middleware
  17. ),
  18. )))
  19. routes.Grpc()
  20. }