Microservice with Go
Contents
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.protoas 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.goto add the service to provider set as follows:var ProviderSet = wire.NewSet(NewGreeterService, NewSfhService) -
modify
internal/server/http.goto 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.goto register the grpc server. -
execute
go generate ./...to update thewire_gen.go.