Categorygithub.com/rookie-ninja/rk-zero
module
1.2.18
Repository: https://github.com/rookie-ninja/rk-zero.git
Documentation: pkg.go.dev

# README

rk-zero

build codecov Go Report Card License

Middleware & bootstrapper designed for zeromicro/go-zero framework. Documentation.

This belongs to rk-boot family.

image

Architecture

image

Supported bootstrap

BootstrapDescription
YAML basedStart zeromicro/go-zero microservice from YAML
Code basedStart zeromicro/go-zero microservice from code

Supported instances

All instances could be configured via YAML or Code.

User can enable anyone of those as needed! No mandatory binding!

InstanceDescription
rest.ServerCompatible with original zeromicro/go-zero service functionalities
ConfigConfigure spf13/viper as config instance and reference it from YAML
LoggerConfigure uber-go/zap logger configuration and reference it from YAML
EventConfigure logging of RPC with rk-query and reference it from YAML
CertFetch TLS/SSL certificates start microservice.
PrometheusStart prometheus client at client side and push metrics to pushgateway as needed.
SwaggerBuiltin swagger UI handler.
DocsBuiltin RapiDoc instance which can be used to replace swagger and RK TV.
CommonServiceList of common APIs.
StaticFileHandlerA Web UI shows files could be downloaded from server, currently support source of local and embed.FS.
PProfPProf web UI.

Supported middlewares

All middlewares could be configured via YAML or Code.

User can enable anyone of those as needed! No mandatory binding!

MiddlewareDescription
PromCollect RPC metrics and export to prometheus client.
LoggingLog every RPC requests as event with rk-query.
TraceCollect RPC trace and export it to stdout, file or jaeger with open-telemetry/opentelemetry-go.
PanicRecover from panic for RPC requests and log it.
MetaSend micsro service metadata as header to client.
AuthSupport [Basic Auth] and [API Key] authorization types.
RateLimitLimiting RPC rate globally or per path.
CORSServer side CORS validation.
JWTServer side JWT validation.
SecureServer side secure validation.
CSRFServer side csrf validation.

Installation

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

Quick Start

In the bellow example, we will start microservice with bellow functionality and middlewares enabled via YAML.

  • zeromicro/go-zero server
  • Swagger UI
  • CommonService
  • Docs
  • Prometheus Metrics (middleware)
  • Logging (middleware)
  • Meta (middleware)

Please refer example at example/boot/simple.

1.Create boot.yaml

---
zero:
  - name: greeter                     # Required
    port: 8080                        # Required
    enabled: true                     # Required
    commonService:
      enabled: true                   # Optional, default: false
    sw:
      enabled: true                   # Optional, default: false
    docs:
      enabled: true                   # Optional, default: false
    prom:
      enabled: true                   # Optional, default: false
    middleware:
      logging:
        enabled: true                 # Optional, default: false
      prom:
        enabled: true                 # Optional, default: false
      meta:
        enabled: true                 # Optional, default: false

2.Create main.go

// Copyright (c) 2021 rookie-ninja
//
// Use of this source code is governed by an Apache-style
// license that can be found in the LICENSE file.
package main

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

//go:embed boot.yaml
var boot []byte

func main() {
	// Bootstrap preload entries
	rkentry.BootstrapPreloadEntryYAML(boot)

	// Bootstrap zero entry from boot config
	res := rkzero.RegisterZeroEntryYAML(boot)

	// Get ZeroEntry
	zeroEntry := res["greeter"].(*rkzero.ZeroEntry)
	// Add router
	zeroEntry.Server.AddRoute(rest.Route{
		Method:  http.MethodGet,
		Path:    "/v1/greeter",
		Handler: Greeter,
	})

	// Bootstrap zero entry
	zeroEntry.Bootstrap(context.Background())

	// Wait for shutdown signal
	rkentry.GlobalAppCtx.WaitForShutdownSig()

	// Interrupt zero entry
	zeroEntry.Interrupt(context.Background())
}

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.Start server

$ go run main.go

4.Validation

4.1 GoZero server

Try to test GoZero Service with curl

# Curl to common service
$ curl localhost:8080/rk/v1/ready
{
  "ready": true
}

$ curl localhost:8080/rk/v1/alive
{
  "alive": true
}

4.2 Swagger UI

Please refer sw section at Full YAML.

By default, we could access swagger UI at http://localhost:8080/sw

sw

4.3 Docs UI

Please refer docs section at Full YAML.

By default, we could access docs UI at http://localhost:8080/docs

docs

4.4 Prometheus Metrics

Please refer middleware.prom section at Full YAML.

By default, we could access prometheus client at http://localhost:8080/metrics

prom

4.5 Logging

Please refer middleware.logging section at Full YAML.

By default, we enable zap logger and event logger with encoding type of [console]. Encoding type of [json] and [flatten] is also supported.

2021-12-29T01:47:33.795+0800    INFO    boot/zero_entry.go:1168 Bootstrap zeroEntry     {"eventId": "9b176423-d751-4066-838a-1eedcc72a7fb", "entryName": "greeter"}
------------------------------------------------------------------------
endTime=2021-12-29T01:47:33.797725+08:00
startTime=2021-12-29T01:47:33.795914+08:00
elapsedNano=1810699
timezone=CST
ids={"eventId":"9b176423-d751-4066-838a-1eedcc72a7fb"}
app={"appName":"rk","appVersion":"","entryName":"greeter","entryType":"ZeroEntry"}
env={"arch":"amd64","az":"*","domain":"*","hostname":"lark.local","localIP":"10.8.0.2","os":"darwin","realm":"*","region":"*"}
payloads={"commonServiceEnabled":true,"commonServicePathPrefix":"/rk/v1/","zeroPort":8080,"promEnabled":true,"promPath":"/metrics","promPort":8080,"swEnabled":true,"swPath":"/sw/","tvEnabled":true,"tvPath":"/rk/v1/tv/"}
error={}
counters={}
pairs={}
timing={}
remoteAddr=localhost
operation=Bootstrap
resCode=OK
eventStatus=Ended
EOE

4.6 Meta

Please refer meta section at Full YAML.

By default, we will send back some metadata to client including gateway with headers.

$ curl -vs localhost:8080/rk/v1/ready
...
< HTTP/1.1 200 OK
< Content-Type: application/json
< X-Request-Id: f068670c-56dc-42ed-9368-14961acd8433
< X-Rk-App-Name: rk
< X-Rk-App-Unix-Time: 2021-12-29T01:50:35.791623+08:00
< X-Rk-App-Version: 
< X-Rk-Received-Time: 2021-12-29T01:50:35.791623+08:00
< X-Trace-Id: 3a84ce72b53ce43468a5e81e8dceadcb
< Date: Tue, 28 Dec 2021 17:50:35 GMT
...

4.7 Send request

We registered /v1/greeter API in zeromicro/go-zero server and let's validate it!

$ curl -vs localhost:8080/v1/greeter?name=rk-dev
*   Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 8080 (#0)
> GET /v1/greeter?name=rk-dev HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.64.1
> Accept: */*
> 
< HTTP/1.1 200 OK
< X-Request-Id: d7a6e873-cf8e-465f-8248-c53a76831fed
< X-Rk-App-Locale: *::*::*::*
< X-Rk-App-Name: 
< X-Rk-App-Unix-Time: 2022-03-06T22:14:14.56221+08:00
< X-Rk-App-Version: 
< X-Rk-Received-Time: 2022-03-06T22:14:14.56221+08:00
< X-Trace-Id: 677c1314e24765ecc1e8ee7396f74d4e
< Date: Sun, 06 Mar 2022 14:14:14 GMT
< Content-Length: 27
< Content-Type: text/plain; charset=utf-8
< 
* Connection #0 to host localhost left intact
{"Message":"Hello rk-dev!"}

4.8 RPC logs

Bellow logs would be printed in stdout.

------------------------------------------------------------------------
endTime=2021-12-29T01:52:32.478833+08:00
startTime=2021-12-29T01:52:32.478736+08:00
elapsedNano=96450
timezone=CST
ids={"eventId":"38bb7368-a829-4707-b079-a942ec4c1f82","requestId":"38bb7368-a829-4707-b079-a942ec4c1f82","traceId":"4170ff1daeb053166c26f0d7ca98c57e"}
app={"appName":"rk","appVersion":"","entryName":"greeter","entryType":"ZeroEntry"}
env={"arch":"amd64","az":"*","domain":"*","hostname":"lark.local","localIP":"10.8.0.2","os":"darwin","realm":"*","region":"*"}
payloads={"apiMethod":"GET","apiPath":"/v1/greeter","apiProtocol":"HTTP/1.1","apiQuery":"","userAgent":"curl/7.64.1"}
error={}
counters={}
pairs={}
timing={}
remoteAddr=localhost:62686
operation=/v1/greeter
resCode=200
eventStatus=Ended
EOE

4.9 RPC prometheus metrics

Prometheus client will automatically register into zeromicro/go-zero instance at /metrics.

Access http://localhost:8080/metrics

image

YAML Options

User can start multiple zeromicro/go-zero instances at the same time. Please make sure use different port and name.

go-zero

namedescriptiontypedefault value
zero.nameThe name of zero serverstringN/A
zero.portThe port of zero serverintegernil, server won't start
zero.enabledEnable zero entry or notboolfalse
zero.descriptionDescription of zero entry.string""
zero.certEntryOptional, Reference of certEntry declared in cert entrystring""
zero.loggerEntryOptional, Reference of loggerEntry declared in LoggerEntrystring""
zero.eventEntryOptional, Reference of eventLEntry declared in eventEntrystring""

CommonService

PathDescription
/rk/v1/gcTrigger GC
/rk/v1/readyGet application readiness status.
/rk/v1/aliveGet application aliveness status.
/rk/v1/infoGet application and process info.
namedescriptiontypedefault value
zero.commonService.enabledOptional, Enable builtin common servicebooleanfalse
zero.commonService.pathPrefixOptional, Provide path prefixstring/rk/v1

Swagger

namedescriptiontypedefault value
zero.sw.enabledOptional, Enable swagger service over gin serverbooleanfalse
zero.sw.pathOptional, The path access swagger service from webstring/sw
zero.sw.jsonPathOptional, Where the swagger.json files are stored locally[]string[""]
zero.sw.headersOptional, Headers would be sent to caller as scheme of [key:value][]string[]

Docs (RapiDoc)

namedescriptiontypedefault value
zero.docs.enabledOptional, Enable RapiDoc service over gin serverbooleanfalse
zero.docs.pathOptional, The path access docs service from webstring/docs
zero.docs.jsonPathOptional, Where the swagger.json or open API files are stored locally[]string[""]
zero.docs.headersOptional, Headers would be sent to caller as scheme of [key:value][]string[]
zero.docs.style.themeOptional, light and dark are supported optionsstring[]
zero.docs.debugOptional, Enable debugging mode in RapiDoc which can be used as the same as Swagger UIbooleanfalse

Prometheus Client

namedescriptiontypedefault value
zero.prom.enabledOptional, Enable prometheusbooleanfalse
zero.prom.pathOptional, Path of prometheusstring/metrics
zero.prom.pusher.enabledOptional, Enable prometheus pusherboolfalse
zero.prom.pusher.jobNameOptional, Job name would be attached as label while pushing to remote pushgatewaystring""
zero.prom.pusher.remoteAddressOptional, PushGateWay address, could be form of http://x.x.x.x or x.x.x.xstring""
zero.prom.pusher.intervalMsOptional, Push interval in millisecondsstring1000
zero.prom.pusher.basicAuthOptional, Basic auth used to interact with remote pushgateway, form of [user:pass]string""
zero.prom.pusher.certEntryOptional, Reference of rkentry.CertEntrystring""

Static file handler

namedescriptiontypedefault value
zero.static.enabledOptional, Enable static file handlerbooleanfalse
zero.static.pathOptional, path of static file handlerstring/static
zero.static.sourceTypeRequired, local and embed.FS are supportedstring""
zero.static.sourcePathRequired, full path of source directorystring""
  • About embed.FS User has to set embedFS before Bootstrap() function as bellow:
//go:embed /*
var staticFS embed.FS

rkentry.GlobalAppCtx.AddEmbedFS(rkentry.StaticFileHandlerEntryType, "greeter", &staticFS)

Middlewares

namedescriptiontypedefault value
zero.middleware.ignoreThe paths of prefix that will be ignored by middleware[]string[]

Logging

namedescriptiontypedefault value
zero.middleware.logging.enabledEnable log middlewarebooleanfalse
zero.middleware.logging.ignoreThe paths of prefix that will be ignored by middleware[]string[]
zero.middleware.logging.loggerEncodingjson or console or flattenstringconsole
zero.middleware.logging.loggerOutputPathsOutput paths[]stringstdout
zero.middleware.logging.eventEncodingjson or console or flattenstringconsole
zero.middleware.logging.eventOutputPathsOutput paths[]stringfalse

We will log two types of log for every RPC call.

  • Logger

Contains user printed logging with requestId or traceId.

  • Event

Contains per RPC metadata, response information, environment information and etc.

FieldDescription
endTimeAs name described
startTimeAs name described
elapsedNanoElapsed time for RPC in nanoseconds
timezoneAs name described
idsContains three different ids(eventId, requestId and traceId). If meta interceptor was enabled or event.SetRequestId() was called by user, then requestId would be attached. eventId would be the same as requestId if meta interceptor was enabled. If trace interceptor was enabled, then traceId would be attached.
appContains appName, appVersion, entryName, entryType.
envContains arch, az, domain, hostname, localIP, os, realm, region. realm, region, az, domain were retrieved from environment variable named as REALM, REGION, AZ and DOMAIN. "*" means empty environment variable.
payloadsContains RPC related metadata
errorContains errors if occur
countersSet by calling event.SetCounter() by user.
pairsSet by calling event.AddPair() by user.
timingSet by calling event.StartTimer() and event.EndTimer() by user.
remoteAddrAs name described
operationRPC method name
resCodeResponse code of RPC
eventStatusEnded or InProgress
  • example
------------------------------------------------------------------------
endTime=2021-11-01T23:31:01.706614+08:00
startTime=2021-11-01T23:31:01.706335+08:00
elapsedNano=278966
timezone=CST
ids={"eventId":"61cae46e-ea98-47b5-8a39-1090d015e09a","requestId":"61cae46e-ea98-47b5-8a39-1090d015e09a"}
app={"appName":"rk-zero","appVersion":"master-e4538d7","entryName":"greeter","entryType":"ZeroEntry"}
env={"arch":"amd64","az":"*","domain":"*","hostname":"lark.local","localIP":"192.168.1.104","os":"darwin","realm":"*","region":"*"}
payloads={"apiMethod":"GET","apiPath":"/rk/v1/healthy","apiProtocol":"HTTP/1.1","apiQuery":"","userAgent":"curl/7.64.1"}
error={}
counters={}
pairs={}
timing={}
remoteAddr=localhost:54376
operation=/rk/v1/healthy
resCode=200
eventStatus=Ended
EOE

Prometheus

namedescriptiontypedefault value
zero.middleware.prom.enabledEnable metrics middlewarebooleanfalse
zero.middleware.prom.ignoreThe paths of prefix that will be ignored by middleware[]string[]

Auth

Enable the server side auth. codes.Unauthenticated would be returned to client if not authorized with user defined credential.

namedescriptiontypedefault value
zero.middleware.auth.enabledEnable auth middlewarebooleanfalse
zero.middleware.auth.ignoreThe paths of prefix that will be ignored by middleware[]string[]
zero.middleware.auth.basicBasic auth credentials as scheme of user:pass[]string[]
zero.middleware.auth.apiKeyAPI key auth[]string[]

Meta

Send application metadata as header to client.

namedescriptiontypedefault value
zero.middleware.meta.enabledEnable meta middlewarebooleanfalse
zero.middleware.meta.ignoreThe paths of prefix that will be ignored by middleware[]string[]
zero.middleware.meta.prefixHeader key was formed as X--XXXstringRK

Tracing

namedescriptiontypedefault value
zero.middleware.trace.enabledEnable tracing middlewarebooleanfalse
zero.middleware.trace.ignoreThe paths of prefix that will be ignored by middleware[]string[]
zero.middleware.trace.exporter.file.enabledEnable file exporterbooleanfalse
zero.middleware.trace.exporter.file.outputPathExport tracing info to filesstringstdout
zero.middleware.trace.exporter.jaeger.agent.enabledExport tracing info to jaeger agentbooleanfalse
zero.middleware.trace.exporter.jaeger.agent.hostAs name describedstringlocalhost
zero.middleware.trace.exporter.jaeger.agent.portAs name describedint6831
zero.middleware.trace.exporter.jaeger.collector.enabledExport tracing info to jaeger collectorbooleanfalse
zero.middleware.trace.exporter.jaeger.collector.endpointAs name describedstringhttp://localhost:16368/api/trace
zero.middleware.trace.exporter.jaeger.collector.usernameAs name describedstring""
zero.middleware.trace.exporter.jaeger.collector.passwordAs name describedstring""

RateLimit

namedescriptiontypedefault value
zero.middleware.rateLimit.enabledEnable rate limit middlewarebooleanfalse
zero.middleware.rateLimit.ignoreThe paths of prefix that will be ignored by middleware[]string[]
zero.middleware.rateLimit.algorithmProvide algorithm, tokenBucket and leakyBucket are available optionsstringtokenBucket
zero.middleware.rateLimit.reqPerSecRequest per second globallyint0
zero.middleware.rateLimit.paths.pathFull pathstring""
zero.middleware.rateLimit.paths.reqPerSecRequest per second by full pathint0

CORS

namedescriptiontypedefault value
zero.middleware.cors.enabledEnable cors middlewarebooleanfalse
zero.middleware.cors.ignoreThe paths of prefix that will be ignored by middleware[]string[]
zero.middleware.cors.allowOriginsProvide allowed origins with wildcard enabled.[]string*
zero.middleware.cors.allowMethodsProvide allowed methods returns as response header of OPTIONS request.[]stringAll http methods
zero.middleware.cors.allowHeadersProvide allowed headers returns as response header of OPTIONS request.[]stringHeaders from request
zero.middleware.cors.allowCredentialsReturns as response header of OPTIONS request.boolfalse
zero.middleware.cors.exposeHeadersProvide exposed headers returns as response header of OPTIONS request.[]string""
zero.middleware.cors.maxAgeProvide max age returns as response header of OPTIONS request.int0

JWT

In order to make swagger UI and RK tv work under JWT without JWT token, we need to ignore prefixes of paths as bellow.

jwt:
  ...
  ignore:
   - "/sw"
namedescriptiontypedefault value
zero.middleware.jwt.enabledOptional, Enable JWT middlewarebooleanfalse
zero.middleware.jwt.ignoreOptional, Provide ignoring path prefix.[]string[]
zero.middleware.jwt.signerEntryOptional, Provide signerEntry name.string""
zero.middleware.jwt.symmetric.algorithmRequired if symmetric specified. One of HS256, HS384, HS512string""
zero.middleware.jwt.symmetric.tokenOptional, raw token for signing and verificationstring""
zero.middleware.jwt.symmetric.tokenPathOptional, path of token filestring""
zero.middleware.jwt.asymmetric.algorithmRequired if symmetric specified. One of RS256, RS384, RS512, ES256, ES384, ES512string""
zero.middleware.jwt.asymmetric.privateKeyOptional, raw private key file for signingstring""
zero.middleware.jwt.asymmetric.privateKeyPathOptional, private key file path for signingstring""
zero.middleware.jwt.asymmetric.publicKeyOptional, raw public key file for verificationstring""
zero.middleware.jwt.asymmetric.publicKeyPathOptional, public key file path for verificationstring""
zero.middleware.jwt.tokenLookupProvide token lookup scheme, please see bellow description.string"header:Authorization"
zero.middleware.jwt.authSchemeProvide auth scheme.stringBearer

The supported scheme of tokenLookup

// Optional. Default value "header:Authorization".
// Possible values:
// - "header:<name>"
// - "query:<name>"
// Multiply sources example:
// - "header: Authorization,cookie: myowncookie"

Secure

namedescriptiontypedefault value
zero.middleware.secure.enabledEnable secure middlewarebooleanfalse
zero.middleware.secure.ignoreIgnoring path prefix.[]string[]
zero.middleware.secure.xssProtectionX-XSS-Protection header value.string"1; mode=block"
zero.middleware.secure.contentTypeNosniffX-Content-Type-Options header value.stringnosniff
zero.middleware.secure.xFrameOptionsX-Frame-Options header value.stringSAMEORIGIN
zero.middleware.secure.hstsMaxAgeStrict-Transport-Security header value.int0
zero.middleware.secure.hstsExcludeSubdomainsExcluding subdomains of HSTS.boolfalse
zero.middleware.secure.hstsPreloadEnabledEnabling HSTS preload.boolfalse
zero.middleware.secure.contentSecurityPolicyContent-Security-Policy header value.string""
zero.middleware.secure.cspReportOnlyContent-Security-Policy-Report-Only header value.boolfalse
zero.middleware.secure.referrerPolicyReferrer-Policy header value.string""

CSRF

namedescriptiontypedefault value
zero.middleware.csrf.enabledEnable csrf middlewarebooleanfalse
zero.middleware.csrf.ignoreIgnoring path prefix.[]string[]
zero.middleware.csrf.tokenLengthProvide the length of the generated token.int32
zero.middleware.csrf.tokenLookupProvide csrf token lookup rules, please see code comments for details.string"header:X-CSRF-Token"
zero.middleware.csrf.cookieNameProvide name of the CSRF cookie. This cookie will store CSRF token.string_csrf
zero.middleware.csrf.cookieDomainDomain of the CSRF cookie.string""
zero.middleware.csrf.cookiePathPath of the CSRF cookie.string""
zero.middleware.csrf.cookieMaxAgeProvide max age (in seconds) of the CSRF cookie.int86400
zero.middleware.csrf.cookieHttpOnlyIndicates if CSRF cookie is HTTP only.boolfalse
zero.middleware.csrf.cookieSameSiteIndicates SameSite mode of the CSRF cookie. Options: lax, strict, none, defaultstringdefault

Full YAML

---
#app:
#  name: my-app                                            # Optional, default: "rk-app"
#  version: "v1.0.0"                                       # Optional, default: "v0.0.0"
#  description: "this is description"                      # Optional, default: ""
#  keywords: ["rk", "golang"]                              # Optional, default: []
#  homeUrl: "http://example.com"                           # Optional, default: ""
#  docsUrl: ["http://example.com"]                         # Optional, default: []
#  maintainers: ["rk-dev"]                                 # Optional, default: []
#logger:
#  - name: my-logger                                       # Required
#    description: "Description of entry"                   # Optional
#    domain: "*"                                           # Optional, default: "*"
#    default: false                                        # Optional, default: false, use as default logger entry
#    zap:                                                  # Optional
#      level: info                                         # Optional, default: info
#      development: true                                   # Optional, default: true
#      disableCaller: false                                # Optional, default: false
#      disableStacktrace: true                             # Optional, default: true
#      encoding: console                                   # Optional, default: console
#      outputPaths: ["stdout"]                             # Optional, default: [stdout]
#      errorOutputPaths: ["stderr"]                        # Optional, default: [stderr]
#      encoderConfig:                                      # Optional
#        timeKey: "ts"                                     # Optional, default: ts
#        levelKey: "level"                                 # Optional, default: level
#        nameKey: "logger"                                 # Optional, default: logger
#        callerKey: "caller"                               # Optional, default: caller
#        messageKey: "msg"                                 # Optional, default: msg
#        stacktraceKey: "stacktrace"                       # Optional, default: stacktrace
#        skipLineEnding: false                             # Optional, default: false
#        lineEnding: "\n"                                  # Optional, default: \n
#        consoleSeparator: "\t"                            # Optional, default: \t
#      sampling:                                           # Optional, default: nil
#        initial: 0                                        # Optional, default: 0
#        thereafter: 0                                     # Optional, default: 0
#      initialFields:                                      # Optional, default: empty map
#        key: value
#    lumberjack:                                           # Optional, default: nil
#      filename:
#      maxsize: 1024                                       # Optional, suggested: 1024 (MB)
#      maxage: 7                                           # Optional, suggested: 7 (day)
#      maxbackups: 3                                       # Optional, suggested: 3 (day)
#      localtime: true                                     # Optional, suggested: true
#      compress: true                                      # Optional, suggested: true
#    loki:
#      enabled: true                                       # Optional, default: false
#      addr: localhost:3100                                # Optional, default: localhost:3100
#      path: /loki/api/v1/push                             # Optional, default: /loki/api/v1/push
#      username: ""                                        # Optional, default: ""
#      password: ""                                        # Optional, default: ""
#      maxBatchWaitMs: 3000                                # Optional, default: 3000
#      maxBatchSize: 1000                                  # Optional, default: 1000
#      insecureSkipVerify: false                           # Optional, default: false
#      labels:                                             # Optional, default: empty map
#        my_label_key: my_label_value
#event:
#  - name: my-event                                        # Required
#    description: "Description of entry"                   # Optional
#    domain: "*"                                           # Optional, default: "*"
#    default: false                                        # Optional, default: false, use as default event entry
#    encoding: console                                     # Optional, default: console
#    outputPaths: ["stdout"]                               # Optional, default: [stdout]
#    lumberjack:                                           # Optional, default: nil
#      filename:
#      maxsize: 1024                                       # Optional, suggested: 1024 (MB)
#      maxage: 7                                           # Optional, suggested: 7 (day)
#      maxbackups: 3                                       # Optional, suggested: 3 (day)
#      localtime: true                                     # Optional, suggested: true
#      compress: true                                      # Optional, suggested: true
#    loki:
#      enabled: true                                       # Optional, default: false
#      addr: localhost:3100                                # Optional, default: localhost:3100
#      path: /loki/api/v1/push                             # Optional, default: /loki/api/v1/push
#      username: ""                                        # Optional, default: ""
#      password: ""                                        # Optional, default: ""
#      maxBatchWaitMs: 3000                                # Optional, default: 3000
#      maxBatchSize: 1000                                  # Optional, default: 1000
#      insecureSkipVerify: false                           # Optional, default: false
#      labels:                                             # Optional, default: empty map
#        my_label_key: my_label_value
#cert:
#  - name: my-cert                                         # Required
#    description: "Description of entry"                   # Optional, default: ""
#    domain: "*"                                           # Optional, default: "*"
#    caPath: "certs/ca.pem"                                # Optional, default: ""
#    certPemPath: "certs/server-cert.pem"                  # Optional, default: ""
#    keyPemPath: "certs/server-key.pem"                    # Optional, default: ""
#config:
#  - name: my-config                                       # Required
#    description: "Description of entry"                   # Optional, default: ""
#    domain: "*"                                           # Optional, default: "*"
#    path: "config/config.yaml"                            # Optional
#    envPrefix: ""                                         # Optional, default: ""
#    content:                                              # Optional, defualt: empty map
#      key: value
zero:
  - name: greeter                                          # Required
    port: 8080                                             # Required
    enabled: true                                          # Required
#    description: "greeter server"                         # Optional, default: ""
#    certEntry: my-cert                                    # Optional, default: "", reference of cert entry declared above
#    loggerEntry: my-logger                                # Optional, default: "", reference of cert entry declared above, STDOUT will be used if missing
#    eventEntry: my-event                                  # Optional, default: "", reference of cert entry declared above, STDOUT will be used if missing
#    sw:
#      enabled: true                                       # Optional, default: false
#      path: "sw"                                          # Optional, default: "sw"
#      jsonPath: [""]                                      # Optional
#      headers: ["sw:rk"]                                  # Optional, default: []
#    commonService:
#      enabled: true                                       # Optional, default: false
#      pathPrefix: ""                                      # Optional, default: "/rk/v1/"
#    docs:
#      enabled: true                                       # Optional, default: false
#      path: "docs"                                        # Optional, default: "docs"
#      specPath: ""                                        # Optional
#      headers: ["sw:rk"]                                  # Optional, default: []
#      style:                                              # Optional
#        theme: "light"                                    # Optional, default: "light"
#      debug: false                                        # Optional, default: false
#    static:
#      enabled: true                                       # Optional, default: false
#      path: "/static"                                     # Optional, default: /static
#      sourceType: local                                   # Optional, options: local, embed.FS can be used either, need to specify in code
#      sourcePath: "."                                     # Optional, full path of source directory
#    pprof:
#      enabled: true                                       # Optional, default: false
#      path: "/pprof"                                      # Optional, default: /pprof
#    prom:
#      enabled: true                                       # Optional, default: false
#      path: ""                                            # Optional, default: "metrics"
#      pusher:
#        enabled: false                                    # Optional, default: false
#        jobName: "greeter-pusher"                         # Required
#        remoteAddress: "localhost:9091"                   # Required
#        basicAuth: "user:pass"                            # Optional, default: ""
#        intervalMs: 10000                                 # Optional, default: 1000
#        certEntry: my-cert                                # Optional, default: "", reference of cert entry declared above
#    middleware:
#      ignore: [""]                                        # Optional, default: []
#      errorModel: google                                  # Optional, default: google, [amazon, google] are supported options
#      logging:
#        enabled: true                                     # Optional, default: false
#        ignore: [""]                                      # Optional, default: []
#        loggerEncoding: "console"                         # Optional, default: "console"
#        loggerOutputPaths: ["logs/app.log"]               # Optional, default: ["stdout"]
#        eventEncoding: "console"                          # Optional, default: "console"
#        eventOutputPaths: ["logs/event.log"]              # Optional, default: ["stdout"]
#      prom:
#        enabled: true                                     # Optional, default: false
#        ignore: [""]                                      # Optional, default: []
#      auth:
#        enabled: true                                     # Optional, default: false
#        ignore: [""]                                      # Optional, default: []
#        basic:
#          - "user:pass"                                   # Optional, default: []
#        apiKey:
#          - "keys"                                        # Optional, default: []
#      meta:
#        enabled: true                                     # Optional, default: false
#        ignore: [""]                                      # Optional, default: []
#        prefix: "rk"                                      # Optional, default: "rk"
#      trace:
#        enabled: true                                     # Optional, default: false
#        ignore: [""]                                      # Optional, default: []
#        exporter:                                         # Optional, default will create a stdout exporter
#          file:
#            enabled: true                                 # Optional, default: false
#            outputPath: "logs/trace.log"                  # Optional, default: stdout
#          jaeger:
#            agent:
#              enabled: false                              # Optional, default: false
#              host: ""                                    # Optional, default: localhost
#              port: 0                                     # Optional, default: 6831
#            collector:
#              enabled: true                               # Optional, default: false
#              endpoint: ""                                # Optional, default: http://localhost:14268/api/traces
#              username: ""                                # Optional, default: ""
#              password: ""                                # Optional, default: ""
#      rateLimit:
#        enabled: false                                    # Optional, default: false
#        ignore: [""]                                      # Optional, default: []
#        algorithm: "leakyBucket"                          # Optional, default: "tokenBucket"
#        reqPerSec: 100                                    # Optional, default: 1000000
#        paths:
#          - path: "/rk/v1/healthy"                        # Optional, default: ""
#            reqPerSec: 0                                  # Optional, default: 1000000
#      jwt:
#        enabled: true                                     # Optional, default: false
#        ignore: [ "" ]                                    # Optional, default: []
#        signerEntry: ""                                   # Optional, default: ""
#        skipVerify: false                                 # Optional, default: false
#        symmetric:                                        # Optional
#          algorithm: ""                                   # Required, default: ""
#          token: ""                                       # Optional, default: ""
#          tokenPath: ""                                   # Optional, default: ""
#        asymmetric:                                       # Optional
#          algorithm: ""                                   # Required, default: ""
#          privateKey: ""                                  # Optional, default: ""
#          privateKeyPath: ""                              # Optional, default: ""
#          publicKey: ""                                   # Optional, default: ""
#          publicKeyPath: ""                               # Optional, default: ""
#        tokenLookup: "header:<name>"                      # Optional, default: "header:Authorization"
#        authScheme: "Bearer"                              # Optional, default: "Bearer"
#      secure:
#        enabled: true                                     # Optional, default: false
#        ignore: [""]                                      # Optional, default: []
#        xssProtection: ""                                 # Optional, default: "1; mode=block"
#        contentTypeNosniff: ""                            # Optional, default: nosniff
#        xFrameOptions: ""                                 # Optional, default: SAMEORIGIN
#        hstsMaxAge: 0                                     # Optional, default: 0
#        hstsExcludeSubdomains: false                      # Optional, default: false
#        hstsPreloadEnabled: false                         # Optional, default: false
#        contentSecurityPolicy: ""                         # Optional, default: ""
#        cspReportOnly: false                              # Optional, default: false
#        referrerPolicy: ""                                # Optional, default: ""
#      csrf:
#        enabled: true                                     # Optional, default: false
#        ignore: [""]                                      # Optional, default: []
#        tokenLength: 32                                   # Optional, default: 32
#        tokenLookup: "header:X-CSRF-Token"                # Optional, default: "header:X-CSRF-Token"
#        cookieName: "_csrf"                               # Optional, default: _csrf
#        cookieDomain: ""                                  # Optional, default: ""
#        cookiePath: ""                                    # Optional, default: ""
#        cookieMaxAge: 86400                               # Optional, default: 86400
#        cookieHttpOnly: false                             # Optional, default: false
#        cookieSameSite: "default"                         # Optional, default: "default", options: lax, strict, none, default
#      cors:
#        enabled: true                                     # Optional, default: false
#        ignore: [""]                                      # Optional, default: []
#        allowOrigins:                                     # Optional, default: []
#          - "http://localhost:*"                          # Optional, default: *
#        allowCredentials: false                           # Optional, default: false
#        allowHeaders: []                                  # Optional, default: []
#        allowMethods: []                                  # Optional, default: []
#        exposeHeaders: []                                 # Optional, default: []
#        maxAge: 0                                         # Optional, default: 0

Notice of V2

Master branch of this package is under upgrade which will be released to v2.x.x soon.

Major changes listed bellow. This will be updated with every commit.

Last versionNew versionChanges
v0.0.11v2TV is not supported because of LICENSE issue, new TV web UI will be released soon
v0.0.11v2Remote repositry of ConfigEntry and CertEntry removed
v0.0.11v2Swagger json file and boot.yaml file could be embed into embed.FS and pass to rkentry
v0.0.11v2ZapLoggerEntry -> LoggerEntry
v0.0.11v2EventLoggerEntry -> EventEntry
v0.0.11v2LoggerEntry can be used as zap.Logger since all functions are inherited
v0.0.11v2PromEntry can be used as prometheus.Registry since all functions are inherited
v0.0.11v2rk-common dependency was removed
v0.0.11v2Entries are organized by EntryType instead of EntryName, so user can have same entry name with different EntryType
v0.0.11v2zero.middlewares -> gin.middleware in boot.yaml
v0.0.11v2zero.middlewares.loggingZap -> zero.middleware.logging in boot.yaml
v0.0.11v2zero.middlewares.metricsProm -> zero.middleware.prom in boot.yaml
v0.0.11v2zero.middlewares.tracingTelemetry -> zero.middleware.trace in boot.yaml
v0.0.11v2All middlewares are now support zero.middleware.xxx.ignorePrefix options in boot.yaml
v0.0.11v2Middlewares support zero.middleware.ignorePrefix in boot.yaml as global scope
v0.0.11v2LoggerEntry, EventEntry, ConfigEntry, CertEntry now support locale to distinguish in differerent environment
v0.0.11v2LoggerEntry, EventEntry, CertEntry can be referenced to gin entry in boot.yaml
v0.0.11v2Healthy API was replaced by Ready and Alive which also provides validation func from user
v0.0.11v2DocsEntry was added into rk-entry
v0.0.11v2rk-entry support utility functions of embed.FS
v0.0.11v2rk-entry bumped up to v2

Development Status: Stable

Build instruction

Simply run make all to validate your changes. Or run codes in example/ folder.

  • make all

Run unit-test, golangci-lint, doctoc and gofmt.

Test instruction

Run unit test with make test command.

Github workflow will automatically run unit test and golangci-lint for testing and lint validation.

Contributing

We encourage and support an active, healthy community of contributors — including you! Details are in the contribution guide and the code of conduct. The rk maintainers keep an eye on issues and pull requests, but you can also report any negative conduct to [email protected].

Released under the Apache 2.0 License.

# Packages

Package rkzero an implementation of rkentry.Entry which could be used start restful server with go-zero framework.
No description provided by the author
Package rkzerointer provides common utility functions for middleware of go-zero framework.