zeromicro/go-zero - rk-boot (original) (raw)

Create zeromicro/go-zero server with rk-boot and rk-gin plugins.

Overview#

We will use rk-boot start zeromicro/go-zero microservice and add /v1/greeter API into it.

Furthermore, we will enable bellow functionalities.

Functionality Description
Swagger UI Enable Swagger UI
API Docs UI Enable RapiDoc UI
Prometheus Client Enable Prometheus Client
Logging middleware Automatically record logs for every API calls
Prometheus middleware Automatically record prometheus metrics for every API calls
Meta middleware Automatically add requestID for every API response

Install#

go get github.com/rookie-ninja/rk-boot/v2 go get github.com/rookie-ninja/rk-zero

1. Create boot.yaml#

`zero:

`

2. Create main.go#

In order to generate swagger.json file, we add comments and generate swagger.json file with swag CLI.

`package main

import ( "context" "encoding/json" "fmt" "github.com/rookie-ninja/rk-boot/v2" "github.com/rookie-ninja/rk-zero/boot" "github.com/zeromicro/go-zero/rest" "net/http" )

// @title Swagger Example API // @version 1.0 // @description This is a sample rk-demo server. // @termsOfService http://swagger.io/terms/

// @securityDefinitions.basic BasicAuth

// @contact.name API Support // @contact.url http://www.swagger.io/support // @contact.email support@swagger.io

// @license.name Apache 2.0 // @license.url http://www.apache.org/licenses/LICENSE-2.0.html

func main() { // Create a new boot instance. boot := rkboot.NewBoot()

// Register handler zeroEntry := rkzero.GetZeroEntry("greeter") zeroEntry.Server.AddRoute(rest.Route{ Method: http.MethodGet, Path: "/v1/greeter", Handler: Greeter, })

// Bootstrap boot.Bootstrap(context.TODO())

boot.WaitForShutdownSig(context.TODO()) }

// Greeter handler // @Summary Greeter // @Id 1 // @Tags Hello // @version 1.0 // @Param name query string true "name" // @produce application/json // @Success 200 {object} GreeterResponse // @Router /v1/greeter [get] func Greeter(writer http.ResponseWriter, request *http.Request) { writer.WriteHeader(http.StatusOK) resp := &GreeterResponse{ Message: fmt.Sprintf("Hello %s!", request.URL.Query().Get("name")), } bytes, _ := json.Marshal(resp) writer.Write(bytes) }

type GreeterResponse struct { Message string } `

3.Generate swagger.json#

4.Directory hierarchy#

$ tree . ├── boot.yaml ├── docs │ ├── swagger.json │ └── swagger.yaml ├── go.mod ├── go.sum └── main.go

5.Run main.go#

`$ go run main.go 2022-05-09T13:37:24.802+0800 INFO boot/zero_entry.go:761 Bootstrap zeroEntry {"eventId": "c2451ccd-b517-4b37-8691-ff621a9a0223", "entryName": "greeter", "entryType": "ZeroEntry"} 2022-05-09T13:37:24.803+0800 INFO boot/zero_entry.go:519 SwaggerEntry: http://localhost:8080/sw/ 2022-05-09T13:37:24.803+0800 INFO boot/zero_entry.go:522 DocsEntry: http://localhost:8080/docs/ 2022-05-09T13:37:24.803+0800 INFO boot/zero_entry.go:525 PromEntry: http://localhost:8080/metrics

endTime=2022-05-09T13:37:24.803892+08:00 startTime=2022-05-09T13:37:24.802285+08:00 elapsedNano=1607377 timezone=CST ids={"eventId":"c2451ccd-b517-4b37-8691-ff621a9a0223"} app={"appName":"rk","appVersion":"local","entryName":"greeter","entryType":"ZeroEntry"} env={"arch":"amd64","domain":"*","hostname":"lark.local","localIP":"192.168.1.104","os":"darwin"} payloads={"docsEnabled":true,"docsPath":"/docs/","promEnabled":true,"promPath":"/metrics","promPort":8080,"swEnabled":true,"swPath":"/sw/","zeroPort":8080} counters={} pairs={} timing={} remoteAddr=localhost operation=Bootstrap resCode=OK eventStatus=Ended EOE `

6.Validate#

6.1 Swagger UI#

http://localhost:8080/sw/

6.2 API Docs UI#

http://localhost:8080/docs/

6.3 Prometheus Client#

http://localhost:8080/metrics

6.4 Send request#

`$ curl -vs "localhost:8080/v1/greeter?name=rk-dev"

6.5 API Log#

rk-boot will use bellow format of logging. JSON is also supported, please see user guide for details.

------------------------------------------------------------------------ endTime=2022-05-09T13:37:47.631765+08:00 startTime=2022-05-09T13:37:47.63152+08:00 elapsedNano=245785 timezone=CST ids={"eventId":"7d461811-81e6-4b48-ae0a-a03c5ed66b5d","requestId":"7d461811-81e6-4b48-ae0a-a03c5ed66b5d","traceId":"872dfba05620f46e12ad9ba75cd9ada4"} app={"appName":"rk","appVersion":"local","entryName":"greeter","entryType":"ZeroEntry"} env={"arch":"amd64","domain":"*","hostname":"lark.local","localIP":"192.168.1.104","os":"darwin"} payloads={"apiMethod":"GET","apiPath":"/v1/greeter","apiProtocol":"HTTP/1.1","apiQuery":"name=rk-dev","userAgent":"curl/7.64.1"} counters={} pairs={} timing={} remoteAddr=localhost:64509 operation=/v1/greeter resCode=200 eventStatus=Ended EOE

6.6 Prometheus Metrics#

Access http://localhost:8080/metrics

Cheers#