README ¶
rk-gin
Interceptor & bootstrapper designed for gin-gonic/gin web framework. Documentation.
This belongs to rk-boot family. We suggest use this lib from rk-boot.
Table of Contents generated with DocToc
- Architecture
- Supported bootstrap
- Supported instances
- Supported middlewares
- Installation
- Quick Start
- YAML Options
- Build instruction
- Test instruction
- Contributing
Architecture
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
4.3 TV
Please refer documentation for details of configuration.
By default, we could access TV at http://localhost:8080/rk/v1/tv
4.4 Prometheus Metrics
Please refer documentation for details of configuration.
By default, we could access prometheus client at http://localhost:8080/metrics
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
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 |