Contents

Microservice with Go

Go-Zero

Kratos

Quick Start

  • install prerequisites

    brew install go
    
    brew install protoc
    
    brew install protoc-gen-go
    
    # the binary will be under `~/go/bin`, so add it to your PATH
    go install github.com/go-kratos/kratos/cmd/kratos@latest
    
  • create a new project

    kratos new kratos-demo
    cd kratos-demo
    go mod download
    
  • start the project

    go generate ./...
    kratos run
    

API

Generate a service

  • delete api/helloworld

  • add .proto file with kratos proto add api/sfh/v1/sfh.proto

  • in order to support HTTP, modify api/sfh/v1/sfh.proto as follows:

    syntax = "proto3";
    
    package api.sfh.v1;
    
    import "google/api/annotations.proto";
    
    option go_package = "kratos-demo/api/sfh/v1;v1";
    option java_multiple_files = true;
    option java_package = "api.sfh.v1";
    
    service Sfh {
      rpc GetAddress (GetAddressRequest) returns (GetAddressReply)  {
        option (google.api.http) = {
            get: "/getAddress/{accountKey}"
        };
      }
    }
    
    message GetAddressRequest {
      string accountKey = 1;
    }
    
    message GetAddressReply {
      string address = 1;
    }
    
  • generate client and server codes

    # To generate client codes
    kratos proto client api/sfh/v1/sfh.proto
    # To generate server codes
    kratos proto server api/sfh/v1/sfh.proto -t internal/service
    

Inject dependencies

  • modify internal/service/service.go to add the service to provider set as follows:

    var ProviderSet = wire.NewSet(NewGreeterService, NewSfhService)
    
  • modify internal/server/http.go to register the http server as follows:

    package server
    
    import (
      hw "kratos-demo/api/helloworld/v1"
      sfh "kratos-demo/api/sfh/v1"
      "kratos-demo/internal/conf"
      "kratos-demo/internal/service"
    
      "github.com/go-kratos/kratos/v2/log"
      "github.com/go-kratos/kratos/v2/middleware/recovery"
      "github.com/go-kratos/kratos/v2/transport/http"
    )
    
    // NewHTTPServer new an HTTP server.
    func NewHTTPServer(c *conf.Server, greeter *service.GreeterService, sfhSvc *service.SfhService, logger log.Logger) *http.Server {
      var opts = []http.ServerOption{
        http.Middleware(
          recovery.Recovery(),
        ),
      }
      if c.Http.Network != "" {
        opts = append(opts, http.Network(c.Http.Network))
      }
      if c.Http.Addr != "" {
        opts = append(opts, http.Address(c.Http.Addr))
      }
      if c.Http.Timeout != nil {
        opts = append(opts, http.Timeout(c.Http.Timeout.AsDuration()))
      }
      srv := http.NewServer(opts...)
      hw.RegisterGreeterHTTPServer(srv, greeter)
      sfh.RegisterSfhHTTPServer(srv, sfhSvc)
    
      return srv
    }
    
  • so as above, modify internal/server/grpc.go to register the grpc server.

  • execute go generate ./... to update the wire_gen.go.