rk-gin

module
v1.2.22 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Feb 20, 2022 License: Apache-2.0

README

rk-gin

build codecov Go Report Card License

Interceptor & bootstrapper designed for gin-gonic/gin web framework. Documentation.

This belongs to rk-boot family. We suggest use this lib from rk-boot.

image

Table of Contents generated with DocToc

Architecture

image

Supported bootstrap

Bootstrap Description
YAML based Start gin-gonic/gin microservice from YAML
Code based Start gin-gonic/gin 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!

Instance Description
gin.Router Compatible with original gin-gonic/gin service functionalities
Config Configure spf13/viper as config instance and reference it from YAML
Logger Configure uber-go/zap logger configuration and reference it from YAML
EventLogger Configure logging of RPC with rk-query and reference it from YAML
Credential Fetch credentials from remote datastore like ETCD.
Cert Fetch TLS/SSL certificates from remote datastore like ETCD and start microservice.
Prometheus Start prometheus client at client side and push metrics to pushgateway as needed.
Swagger Builtin swagger UI handler.
CommonService List of common APIs.
TV A Web UI shows microservice and environment information.
StaticFileHandler A Web UI shows files could be downloaded from server, currently support source of local and pkger.

Supported middlewares

All middlewares could be configured via YAML or Code.

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

Middleware Description
Metrics Collect RPC metrics and export to prometheus client.
Log Log every RPC requests as event with rk-query.
Trace Collect RPC trace and export it to stdout, file or jaeger with open-telemetry/opentelemetry-go.
Panic Recover from panic for RPC requests and log it.
Meta Send micsroservice metadata as header to client.
Auth Support [Basic Auth] and [API Key] authorization types.
RateLimit Limiting RPC rate globally or per path.
Timeout Timing out request by configuration.
Gzip Compress and Decompress message body based on request header with gzip format .
CORS Server side CORS validation.
JWT Server side JWT validation.
Secure Server side secure validation.
CSRF Server side csrf validation.

Installation

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

Quick Start

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

  • gin-gonic/gin server
  • Swagger UI
  • CommonService
  • TV
  • Prometheus Metrics (middleware)
  • Logging (middleware)
  • Meta (middleware)

Please refer example at example/boot/simple.

1.Create boot.yaml
---
gin:
  - name: greeter                     # Required
    port: 8080                        # Required
    enabled: true                     # Required
    tv:
      enabled: true                   # Optional, default: false
    prom:
      enabled: true                   # Optional, default: false
    sw:                               # Optional
      enabled: true                   # Optional, default: false
    commonService:                    # Optional
      enabled: true                   # Optional, default: false
    interceptors:
      loggingZap:
        enabled: true
      metricsProm:
        enabled: true
      meta:
        enabled: true
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"
	"fmt"
	"github.com/gin-gonic/gin"
	"github.com/rookie-ninja/rk-entry/entry"
	"github.com/rookie-ninja/rk-gin/boot"
	"net/http"
)

func main() {
	// Bootstrap basic entries from boot config.
	rkentry.RegisterInternalEntriesFromConfig("example/boot/simple/boot.yaml")

	// Bootstrap gin entry from boot config
	res := rkgin.RegisterGinEntriesWithConfig("example/boot/simple/boot.yaml")

	// Get GinEntry
	ginEntry := res["greeter"].(*rkgin.GinEntry)
	// Use *gin.Router adding handler.
	ginEntry.Router.GET("/v1/greeter", Greeter)

	// Bootstrap gin entry
	ginEntry.Bootstrap(context.Background())

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

	// Interrupt gin entry
	ginEntry.Interrupt(context.Background())
}

// @Summary Greeter service
// @Id 1
// @version 1.0
// @produce application/json
// @Param name query string true "Input name"
// @Success 200 {object} GreeterResponse
// @Router /v1/greeter [get]
func Greeter(ctx *gin.Context) {
	ctx.JSON(http.StatusOK, &GreeterResponse{
		Message: fmt.Sprintf("Hello %s!", ctx.Query("name")),
	})
}

// Response.
type GreeterResponse struct {
	Message string
}
3.Start server
$ go run main.go
4.Validation
4.1 Gin server

Try to test Gin Service with curl

# Curl to common service
$ curl localhost:8080/rk/v1/healthy
{"healthy":true}
4.2 Swagger UI

Please refer documentation for details of configuration.

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

sw

4.3 TV

Please refer documentation for details of configuration.

By default, we could access TV at http://localhost:8080/rk/v1/tv

tv

4.4 Prometheus Metrics

Please refer documentation for details of configuration.

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

prom

4.5 Logging

Please refer documentation for details of configuration.

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

2021-12-28T02:14:48.303+0800    INFO    boot/gin_entry.go:920   Bootstrap ginEntry      {"eventId": "65b03dbc-c10e-4998-8d49-26775dafc78b", "entryName": "greeter"}
------------------------------------------------------------------------
endTime=2021-12-28T02:14:48.305036+08:00
startTime=2021-12-28T02:14:48.30306+08:00
elapsedNano=1977443
timezone=CST
ids={"eventId":"65b03dbc-c10e-4998-8d49-26775dafc78b"}
app={"appName":"rk","appVersion":"","entryName":"greeter","entryType":"GinEntry"}
env={"arch":"amd64","az":"*","domain":"*","hostname":"lark.local","localIP":"10.8.0.2","os":"darwin","realm":"*","region":"*"}
payloads={"commonServiceEnabled":true,"commonServicePathPrefix":"/rk/v1/","entryName":"greeter","entryPort":8080,"entryType":"GinEntry","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 documentation for details of configuration.

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

$ curl -vs localhost:8080/rk/v1/healthy
*   Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 8080 (#0)
> GET /rk/v1/healthy HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.64.1
> Accept: */*
> 
< HTTP/1.1 200 OK
< Content-Type: application/json; charset=utf-8
< X-Request-Id: f3f0212e-5d99-4851-ae79-ea88818f0ed6
< X-Rk-App-Name: rk
< X-Rk-App-Unix-Time: 2021-12-28T02:20:48.207716+08:00
< X-Rk-Received-Time: 2021-12-28T02:20:48.207716+08:00
< Date: Mon, 27 Dec 2021 18:20:48 GMT
< Content-Length: 16
< 
* Connection #0 to host localhost left intact
{"healthy":true}
4.7 Send request

We registered /v1/greeter API in gin-gonic/gin 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
< Content-Type: application/json; charset=utf-8
< X-Request-Id: a96ab531-e28f-47ca-a082-fc3f8ef14187
< X-Rk-App-Name: rk
< X-Rk-App-Unix-Time: 2021-12-28T02:22:03.289469+08:00
< X-Rk-Received-Time: 2021-12-28T02:22:03.289469+08:00
< Date: Mon, 27 Dec 2021 18:22:03 GMT
< Content-Length: 27
< 
* 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-28T02:22:03.289585+08:00
startTime=2021-12-28T02:22:03.289457+08:00
elapsedNano=128210
timezone=CST
ids={"eventId":"a96ab531-e28f-47ca-a082-fc3f8ef14187","requestId":"a96ab531-e28f-47ca-a082-fc3f8ef14187"}
app={"appName":"rk","appVersion":"","entryName":"greeter","entryType":"GinEntry"}
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":"name=rk-dev","userAgent":"curl/7.64.1"}
error={}
counters={}
pairs={}
timing={}
remoteAddr=localhost:54028
operation=/v1/greeter
resCode=200
eventStatus=Ended
EOE
4.9 RPC prometheus metrics

Prometheus client will automatically register into gin-gonic/gin instance at /metrics.

Access http://localhost:8080/metrics

image

YAML Options

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

Gin
name description type default value
gin.name Required, The name of gin server string N/A
gin.port Required, The port of gin server integer nil, server won't start
gin.enabled Optional, Enable Gin entry or not bool false
gin.description Optional, Description of gin entry. string ""
gin.cert.ref Optional, Reference of cert entry declared in cert entry string ""
gin.logger.zapLogger Optional, Reference of zapLoggerEntry declared in zapLoggerEntry string ""
gin.logger.eventLogger Optional, Reference of eventLoggerEntry declared in eventLoggerEntry string ""
CommonService
Path Description
/rk/v1/apis List APIs in current GinEntry.
/rk/v1/certs List CertEntry.
/rk/v1/configs List ConfigEntry.
/rk/v1/deps List dependencies related application, entire contents of go.mod file would be returned.
/rk/v1/entries List all Entries.
/rk/v1/gc Trigger GC
/rk/v1/healthy Get application healthy status.
/rk/v1/info Get application and process info.
/rk/v1/license Get license related application, entire contents of LICENSE file would be returned.
/rk/v1/logs List logger related entries.
/rk/v1/git Get git information.
/rk/v1/readme Get contents of README file.
/rk/v1/req List prometheus metrics of requests.
/rk/v1/sys Get OS stat.
/rk/v1/tv Get HTML page of /tv.
name description type default value
gin.commonService.enabled Optional, Enable embedded common service boolean false
Swagger
name description type default value
gin.sw.enabled Optional, Enable swagger service over gin server boolean false
gin.sw.path Optional, The path access swagger service from web string /sw
gin.sw.jsonPath Optional, Where the swagger.json files are stored locally string ""
gin.sw.headers Optional, Headers would be sent to caller as scheme of [key:value] []string []
Prom Client
name description type default value
gin.prom.enabled Optional, Enable prometheus boolean false
gin.prom.path Optional, Path of prometheus string /metrics
gin.prom.pusher.enabled Optional, Enable prometheus pusher bool false
gin.prom.pusher.jobName Optional, Job name would be attached as label while pushing to remote pushgateway string ""
gin.prom.pusher.remoteAddress Optional, PushGateWay address, could be form of http://x.x.x.x or x.x.x.x string ""
gin.prom.pusher.intervalMs Optional, Push interval in milliseconds string 1000
gin.prom.pusher.basicAuth Optional, Basic auth used to interact with remote pushgateway, form of [user:pass] string ""
gin.prom.pusher.cert.ref Optional, Reference of rkentry.CertEntry string ""
TV
name description type default value
gin.tv.enabled Optional, Enable RK TV boolean false
Static file handler
name description type default value
gin.static.enabled Optional, Enable static file handler boolean false
gin.static.path Optional, path of static file handler string /rk/v1/static
gin.static.sourceType Required, local and pkger supported string ""
gin.static.sourcePath Required, full path of source directory string ""
  • About pkger User can use pkger command line tool to embed static files into .go files.

Please use sourcePath like: github.com/rookie-ninja/rk-gin:/boot/assets

Middlewares
Log
name description type default value
gin.interceptors.loggingZap.enabled Enable log interceptor boolean false
gin.interceptors.loggingZap.zapLoggerEncoding json or console string console
gin.interceptors.loggingZap.zapLoggerOutputPaths Output paths []string stdout
gin.interceptors.loggingZap.eventLoggerEncoding json or console string console
gin.interceptors.loggingZap.eventLoggerOutputPaths Output paths []string false

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

  • zapLogger

Contains user printed logging with requestId or traceId.

  • eventLogger

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

Field Description
endTime As name described
startTime As name described
elapsedNano Elapsed time for RPC in nanoseconds
timezone As name described
ids Contains 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.
app Contains appName, appVersion, entryName, entryType.
env Contains 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.
payloads Contains RPC related metadata
error Contains errors if occur
counters Set by calling event.SetCounter() by user.
pairs Set by calling event.AddPair() by user.
timing Set by calling event.StartTimer() and event.EndTimer() by user.
remoteAddr As name described
operation RPC method name
resCode Response code of RPC
eventStatus Ended or InProgress
  • example
------------------------------------------------------------------------
endTime=2021-06-25T01:30:45.144023+08:00
startTime=2021-06-25T01:30:45.143767+08:00
elapsedNano=255948
timezone=CST
ids={"eventId":"3332e575-43d8-4bfe-84dd-45b5fc5fb104","requestId":"3332e575-43d8-4bfe-84dd-45b5fc5fb104","traceId":"65b9aa7a9705268bba492fdf4a0e5652"}
app={"appName":"rk-gin","appVersion":"master-xxx","entryName":"greeter","entryType":"GinEntry"}
env={"arch":"amd64","az":"*","domain":"*","hostname":"lark.local","localIP":"10.8.0.2","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:60718
operation=/rk/v1/healthy
resCode=200
eventStatus=Ended
EOE
Metrics
name description type default value
gin.interceptors.metricsProm.enabled Enable metrics interceptor boolean false
Auth

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

name description type default value
gin.interceptors.auth.enabled Enable auth interceptor boolean false
gin.interceptors.auth.basic Basic auth credentials as scheme of user:pass []string []
gin.interceptors.auth.apiKey API key auth []string []
gin.interceptors.auth.ignorePrefix The paths of prefix that will be ignored by interceptor []string []
Meta

Send application metadata as header to client.

name description type default value
gin.interceptors.meta.enabled Enable meta interceptor boolean false
gin.interceptors.meta.prefix Header key was formed as X--XXX string RK
Tracing
name description type default value
gin.interceptors.tracingTelemetry.enabled Enable tracing interceptor boolean false
gin.interceptors.tracingTelemetry.exporter.file.enabled Enable file exporter boolean RK
gin.interceptors.tracingTelemetry.exporter.file.outputPath Export tracing info to files string stdout
gin.interceptors.tracingTelemetry.exporter.jaeger.agent.enabled Export tracing info to jaeger agent boolean false
gin.interceptors.tracingTelemetry.exporter.jaeger.agent.host As name described string localhost
gin.interceptors.tracingTelemetry.exporter.jaeger.agent.port As name described int 6831
gin.interceptors.tracingTelemetry.exporter.jaeger.collector.enabled Export tracing info to jaeger collector boolean false
gin.interceptors.tracingTelemetry.exporter.jaeger.collector.endpoint As name described string http://localhost:16368/api/trace
gin.interceptors.tracingTelemetry.exporter.jaeger.collector.username As name described string ""
gin.interceptors.tracingTelemetry.exporter.jaeger.collector.password As name described string ""
RateLimit
name description type default value
gin.interceptors.rateLimit.enabled Enable rate limit interceptor boolean false
gin.interceptors.rateLimit.algorithm Provide algorithm, tokenBucket and leakyBucket are available options string tokenBucket
gin.interceptors.rateLimit.reqPerSec Request per second globally int 0
gin.interceptors.rateLimit.paths.path Full path string ""
gin.interceptors.rateLimit.paths.reqPerSec Request per second by full path int 0
Timeout
name description type default value
gin.interceptors.timeout.enabled Enable timeout interceptor boolean false
gin.interceptors.timeout.timeoutMs Global timeout in milliseconds. int 5000
gin.interceptors.timeout.paths.path Full path string ""
gin.interceptors.timeout.paths.timeoutMs Timeout in milliseconds by full path int 5000
Gzip
name description type default value
gin.interceptors.gzip.enabled Enable gzip interceptor boolean false
gin.interceptors.gzip.level Provide level of compression, options are noCompression, bestSpeed, bestCompression, defaultCompression, huffmanOnly. string defaultCompression
CORS
name description type default value
gin.interceptors.cors.enabled Enable cors interceptor boolean false
gin.interceptors.cors.allowOrigins Provide allowed origins with wildcard enabled. []string *
gin.interceptors.cors.allowMethods Provide allowed methods returns as response header of OPTIONS request. []string All http methods
gin.interceptors.cors.allowHeaders Provide allowed headers returns as response header of OPTIONS request. []string Headers from request
gin.interceptors.cors.allowCredentials Returns as response header of OPTIONS request. bool false
gin.interceptors.cors.exposeHeaders Provide exposed headers returns as response header of OPTIONS request. []string ""
gin.interceptors.cors.maxAge Provide max age returns as response header of OPTIONS request. int 0
JWT

rk-gin using github.com/golang-jwt/jwt/v4, please beware of version compatibility.

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:
  ...
  ignorePrefix:
   - "/rk/v1/tv"
   - "/sw"
   - "/rk/v1/assets"
name description type default value
gin.interceptors.jwt.enabled Enable JWT interceptor boolean false
gin.interceptors.jwt.signingKey Required, Provide signing key. string ""
gin.interceptors.jwt.ignorePrefix Provide ignoring path prefix. []string []
gin.interceptors.jwt.signingKeys Provide signing keys as scheme of :. []string []
gin.interceptors.jwt.signingAlgo Provide signing algorithm. string HS256
gin.interceptors.jwt.tokenLookup Provide token lookup scheme, please see bellow description. string "header:Authorization"
gin.interceptors.jwt.authScheme Provide auth scheme. string Bearer

The supported scheme of tokenLookup

// Optional. Default value "header:Authorization".
// Possible values:
// - "header:<name>"
// - "query:<name>"
// - "param:<name>"
// - "cookie:<name>"
// - "form:<name>"
// Multiply sources example:
// - "header: Authorization,cookie: myowncookie"
Secure
name description type default value
gin.interceptors.secure.enabled Enable secure interceptor boolean false
gin.interceptors.secure.xssProtection X-XSS-Protection header value. string "1; mode=block"
gin.interceptors.secure.contentTypeNosniff X-Content-Type-Options header value. string nosniff
gin.interceptors.secure.xFrameOptions X-Frame-Options header value. string SAMEORIGIN
gin.interceptors.secure.hstsMaxAge Strict-Transport-Security header value. int 0
gin.interceptors.secure.hstsExcludeSubdomains Excluding subdomains of HSTS. bool false
gin.interceptors.secure.hstsPreloadEnabled Enabling HSTS preload. bool false
gin.interceptors.secure.contentSecurityPolicy Content-Security-Policy header value. string ""
gin.interceptors.secure.cspReportOnly Content-Security-Policy-Report-Only header value. bool false
gin.interceptors.secure.referrerPolicy Referrer-Policy header value. string ""
gin.interceptors.secure.ignorePrefix Ignoring path prefix. []string []
CSRF
name description type default value
gin.interceptors.csrf.enabled Enable csrf interceptor boolean false
gin.interceptors.csrf.tokenLength Provide the length of the generated token. int 32
gin.interceptors.csrf.tokenLookup Provide csrf token lookup rules, please see code comments for details. string "header:X-CSRF-Token"
gin.interceptors.csrf.cookieName Provide name of the CSRF cookie. This cookie will store CSRF token. string _csrf
gin.interceptors.csrf.cookieDomain Domain of the CSRF cookie. string ""
gin.interceptors.csrf.cookiePath Path of the CSRF cookie. string ""
gin.interceptors.csrf.cookieMaxAge Provide max age (in seconds) of the CSRF cookie. int 86400
gin.interceptors.csrf.cookieHttpOnly Indicates if CSRF cookie is HTTP only. bool false
gin.interceptors.csrf.cookieSameSite Indicates SameSite mode of the CSRF cookie. Options: lax, strict, none, default string default
gin.interceptors.csrf.ignorePrefix Ignoring path prefix. []string []
Full YAML
---
#app:
#  description: "this is description"                      # Optional, default: ""
#  keywords: ["rk", "golang"]                              # Optional, default: []
#  homeUrl: "http://example.com"                           # Optional, default: ""
#  iconUrl: "http://example.com"                           # Optional, default: ""
#  docsUrl: ["http://example.com"]                         # Optional, default: []
#  maintainers: ["rk-dev"]                                 # Optional, default: []
#zapLogger:
#  - name: zap-logger                                      # Required
#    description: "Description of entry"                   # Optional
#    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
#eventLogger:
#  - name: event-logger                                    # Required
#    description: "Description of entry"                   # Optional
#    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
#cred:
#  - name: "local-cred"                                    # Required
#    provider: "localFs"                                   # Required, etcd, consul, localFs, remoteFs are supported options
#    locale: "*::*::*::*"                                  # Required, default: *::*::*::*
#    description: "Description of entry"                   # Optional
#    paths:                                                # Optional
#      - "example/boot/full/cred.yaml"
#cert:
#  - name: "local-cert"                                    # Required
#    provider: "localFs"                                   # Required, etcd, consul, localFs, remoteFs are supported options
#    locale: "*::*::*::*"                                  # Required, default: *::*::*::*
#    description: "Description of entry"                   # Optional
#    serverCertPath: "example/boot/full/server.pem"        # Optional, default: "", path of certificate on local FS
#    serverKeyPath: "example/boot/full/server-key.pem"     # Optional, default: "", path of certificate on local FS
#    clientCertPath: "example/client.pem"                  # Optional, default: "", path of certificate on local FS
#    clientKeyPath: "example/client.pem"                   # Optional, default: "", path of certificate on local FS
#config:
#  - name: rk-main                                         # Required
#    path: "example/boot/full/config.yaml"                 # Required
#    locale: "*::*::*::*"                                  # Required, default: *::*::*::*
#    description: "Description of entry"                   # Optional
gin:
  - name: greeter                                          # Required
    port: 8080                                             # Required
    enabled: true                                          # Required
#    description: "greeter server"                         # Optional, default: ""
#    certEntry: "local-cert"                               # Optional, default: "", reference of cert entry declared above
#    sw:
#      enabled: true                                       # Optional, default: false
#      path: "sw"                                          # Optional, default: "sw"
#      jsonPath: ""                                        # Optional
#      headers: ["sw:rk"]                                  # Optional, default: []
#    commonService:
#      enabled: true                                       # Optional, default: false
#    static:
#      enabled: true                                       # Optional, default: false
#      path: "/rk/v1/static"                               # Optional, default: /rk/v1/static
#      sourceType: local                                   # Required, options: pkger, local
#      sourcePath: "."                                     # Required, full path of source directory
#    tv:
#      enabled:  true                                      # Optional, default: false
#    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
#        cert:                                             # Optional
#          ref: "local-test"                               # Optional, default: "", reference of cert entry declared above
#    logger:
#      zapLogger: zap-logger                               # Optional, default: logger of STDOUT, reference of logger entry declared above
#      eventLogger: event-logger                           # Optional, default: logger of STDOUT, reference of logger entry declared above
#    interceptors:
#      loggingZap:
#        enabled: true                                     # Optional, default: false
#        zapLoggerEncoding: "json"                         # Optional, default: "console"
#        zapLoggerOutputPaths: ["logs/app.log"]            # Optional, default: ["stdout"]
#        eventLoggerEncoding: "json"                       # Optional, default: "console"
#        eventLoggerOutputPaths: ["logs/event.log"]        # Optional, default: ["stdout"]
#      metricsProm:
#        enabled: true                                     # Optional, default: false
#      auth:
#        enabled: true                                     # Optional, default: false
#        basic:
#          - "user:pass"                                   # Optional, default: []
#        ignorePrefix:
#          - "/rk/v1"                                      # Optional, default: []
#        apiKey:
#          - "keys"                                        # Optional, default: []
#      meta:
#        enabled: true                                     # Optional, default: false
#        prefix: "rk"                                      # Optional, default: "rk"
#      tracingTelemetry:
#        enabled: true                                     # Optional, default: false
#        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
#        algorithm: "leakyBucket"                          # Optional, default: "tokenBucket"
#        reqPerSec: 100                                    # Optional, default: 1000000
#        paths:
#          - path: "/rk/v1/healthy"                        # Optional, default: ""
#            reqPerSec: 0                                  # Optional, default: 1000000
#      timeout:
#        enabled: false                                    # Optional, default: false
#        timeoutMs: 5000                                   # Optional, default: 5000
#        paths:
#          - path: "/rk/v1/healthy"                        # Optional, default: ""
#            timeoutMs: 1000                               # Optional, default: 5000
#      jwt:
#        enabled: true                                     # Optional, default: false
#        signingKey: "my-secret"                           # Required
#        ignorePrefix:                                     # Optional, default: []
#          - "/rk/v1/tv"
#          - "/sw"
#          - "/rk/v1/assets"
#        signingKeys:                                      # Optional
#          - "key:value"
#        signingAlgo: ""                                   # Optional, default: "HS256"
#        tokenLookup: "header:<name>"                      # Optional, default: "header:Authorization"
#        authScheme: "Bearer"                              # Optional, default: "Bearer"
#      secure:
#        enabled: true                                     # Optional, default: false
#        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: ""
#        ignorePrefix: []                                  # Optional, default: []
#      csrf:
#        enabled: true
#        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
#        ignorePrefix: []                                  # Optional, default: []
#      gzip:
#        enabled: true
#        level: bestSpeed                                  # Optional, options: [noCompression, bestSpeed, bestCompression, defaultCompression, huffmanOnly]
#      cors:
#        enabled: true                                     # Optional, default: false
#        allowOrigins:
#          - "http://localhost:*"                          # Optional, default: *
#        allowCredentials: false                           # Optional, default: false
#        allowHeaders: []                                  # Optional, default: []
#        allowMethods: []                                  # Optional, default: []
#        exposeHeaders: []                                 # Optional, default: []
#        maxAge: 0                                         # Optional, default: 0
Development Status: Stable

Build instruction

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

  • make all

If files in boot/assets have been modified, then we need to run it.

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 lark@rkdev.info.

Released under the Apache 2.0 License.

Directories

Path Synopsis
Package rkgin an implementation of rkentry.Entry which could be used start restful server with gin framework
Package rkgin an implementation of rkentry.Entry which could be used start restful server with gin framework
example
interceptor
auth
Package rkginauth is auth middleware for gin framework
Package rkginauth is auth middleware for gin framework
context
Package rkginctx defines utility functions and variables used by Gin middleware
Package rkginctx defines utility functions and variables used by Gin middleware
cors
Package rkgincors is a CORS middleware for gin framework
Package rkgincors is a CORS middleware for gin framework
csrf
Package rkgincsrf is a middleware of gin framework for adding csrf in RPC response
Package rkgincsrf is a middleware of gin framework for adding csrf in RPC response
jwt
Package rkginjwt is a middleware of gin framework for adding jwt in RPC response
Package rkginjwt is a middleware of gin framework for adding jwt in RPC response
log/zap
Package rkginlog is a middleware for gin framework for logging RPC.
Package rkginlog is a middleware for gin framework for logging RPC.
meta
Package rkginmeta is a middleware of gin framework for adding metadata in RPC response
Package rkginmeta is a middleware of gin framework for adding metadata in RPC response
metrics/prom
Package rkginmetrics is a middleware for gin framework which record prometheus metrics for RPC
Package rkginmetrics is a middleware for gin framework which record prometheus metrics for RPC
panic
Package rkginpanic is a middleware of gin framework for recovering from panic
Package rkginpanic is a middleware of gin framework for recovering from panic
ratelimit
Package rkginlimit is a middleware of gin framework for adding rate limit in RPC response
Package rkginlimit is a middleware of gin framework for adding rate limit in RPC response
secure
Package rkginsec is a middleware of gin framework for adding secure headers in RPC response
Package rkginsec is a middleware of gin framework for adding secure headers in RPC response
tracing/telemetry
Package rkgintrace is aa middleware of gin framework for recording trace info of RPC
Package rkgintrace is aa middleware of gin framework for recording trace info of RPC

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL