New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

github.com/rookie-ninja/rk-grpc

Package Overview
Dependencies
Alerts
File Explorer
Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

github.com/rookie-ninja/rk-grpc

  • v1.2.25
  • Source
  • Go
  • Socket score

Version published
Created
Source

rk-grpc

build codecov Go Report Card License

Interceptor & bootstrapper designed for gRPC and grpc-gateway. 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

BootstrapDescription
YAML basedStart gRPC and grpc-gateway microservice from YAML
Code basedStart gRPC and grpc-gateway 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
gRPCgRPC defined with protocol buffer.
gRPC proxyProxy gRPC request to another gRPC server.
grpc-gatewaygrpc-gateway service with same port.
grpc-gateway optionsWell defined grpc-gateway options.
ConfigConfigure spf13/viper as config instance and reference it from YAML
LoggerConfigure uber-go/zap logger configuration and reference it from YAML
EventLoggerConfigure logging of RPC with rk-query and reference it from YAML
CredentialFetch credentials from remote datastore like ETCD.
CertFetch TLS/SSL certificates from remote datastore like ETCD and start microservice.
PrometheusStart prometheus client at client side and push metrics to pushgateway as needed.
SwaggerBuiltin swagger UI handler.
CommonServiceList of common APIs.
TVA Web UI shows microservice and environment information.
StaticFileHandlerA 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!

MiddlewareDescription
MetricsCollect RPC metrics and export to prometheus client.
LogLog 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 micsroservice metadata as header to client.
AuthSupport [Basic Auth] and [API Key] authorization types.
RateLimitLimiting RPC rate globally or per path.
TimeoutTiming out request by configuration.
CORSServer side CORS validation.
JWTServer side JWT validation.
SecureServer side secure validation.
CSRFServer side csrf validation.

Installation

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

Quick Start

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

  • gRPC and grpc-gateway server
  • gRPC server reflection
  • Swagger UI
  • CommonService
  • TV
  • Prometheus Metrics (middleware)
  • Logging (middleware)
  • Meta (middleware)

Please refer example at example/boot/simple.

1.Prepare .proto files

  • api/v1/greeter.proto
syntax = "proto3";

package api.v1;

option go_package = "api/v1/greeter";

service Greeter {
  rpc Greeter (GreeterRequest) returns (GreeterResponse) {}
}

message GreeterRequest {
  bytes msg = 1;
}

message GreeterResponse {}
  • api/v1/gw_mapping.yaml
type: google.api.Service
config_version: 3

# Please refer google.api.Http in https://github.com/googleapis/googleapis/blob/master/google/api/http.proto file for details.
http:
  rules:
    - selector: api.v1.Greeter.Greeter
      get: /v1/greeter
  • buf.yaml
version: v1beta1
name: github.com/rk-dev/rk-boot
build:
  roots:
    - api
  • buf.gen.yaml
version: v1beta1
plugins:
  # protoc-gen-go needs to be installed, generate go files based on proto files
  - name: go
    out: api/gen
    opt:
     - paths=source_relative
  # protoc-gen-go-grpc needs to be installed, generate grpc go files based on proto files
  - name: go-grpc
    out: api/gen
    opt:
      - paths=source_relative
      - require_unimplemented_servers=false
  # protoc-gen-grpc-gateway needs to be installed, generate grpc-gateway go files based on proto files
  - name: grpc-gateway
    out: api/gen
    opt:
      - paths=source_relative
      - grpc_api_configuration=api/v1/gw_mapping.yaml
  # protoc-gen-openapiv2 needs to be installed, generate swagger config files based on proto files
  - name: openapiv2
    out: api/gen
    opt:
      - grpc_api_configuration=api/v1/gw_mapping.yaml

2.Generate .pb.go files with buf

$ buf generate --path api/v1
  • directory hierarchy
.
├── api
│   ├── gen
│   │   └── v1
│   │       ├── greeter.pb.go
│   │       ├── greeter.pb.gw.go
│   │       ├── greeter.swagger.json
│   │       └── greeter_grpc.pb.go
│   └── v1
│       ├── greeter.proto
│       └── gw_mapping.yaml
├── boot.yaml
├── buf.gen.yaml
├── buf.yaml
├── go.mod
├── go.sum
└── main.go

3.Create boot.yaml

---
grpc:
  - name: greeter                     # Required
    port: 8080                        # Required
    enabled: true                     # Required
    enableReflection: true            # Optional, default: false
    enableRkGwOption: true            # Optional, default: false
    commonService:
      enabled: true                   # Optional, default: false
    tv:
      enabled: true                   # Optional, default: false
    sw:
      enabled: true                   # Optional, default: false
    prom:
      enabled: true                   # Optional, default: false
    interceptors:
      loggingZap:
        enabled: true                 # Optional, default: false
      metricsProm:
        enabled: true                 # Optional, default: false
      meta:
        enabled: true                 # Optional, default: false

4.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"
	"github.com/rookie-ninja/rk-entry/entry"
	"github.com/rookie-ninja/rk-grpc/boot"
	proto "github.com/rookie-ninja/rk-grpc/example/boot/simple/api/gen/v1"
	"google.golang.org/grpc"
)

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

	// Bootstrap grpc entry from boot config
	res := rkgrpc.RegisterGrpcEntriesWithConfig("example/boot/simple/boot.yaml")

	// Get GrpcEntry
	grpcEntry := res["greeter"].(*rkgrpc.GrpcEntry)
	// Register gRPC server
	grpcEntry.AddRegFuncGrpc(func(server *grpc.Server) {
		proto.RegisterGreeterServer(server, &GreeterServer{})
	})
	// Register grpc-gateway func
	grpcEntry.AddRegFuncGw(proto.RegisterGreeterHandlerFromEndpoint)

	// Bootstrap grpc entry
	grpcEntry.Bootstrap(context.Background())

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

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

// GreeterServer Implementation of GreeterServer.
type GreeterServer struct{}

// SayHello Handle SayHello method.
func (server *GreeterServer) Greeter(context.Context, *proto.GreeterRequest) (*proto.GreeterResponse, error) {
	return &proto.GreeterResponse{}, nil
}

5.Start server

$ go run main.go

6.Validation

6.1 gRPC & grpc-gateway server

Try to test gRPC & grpc-gateway Service with curl & grpcurl

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

Please refer documentation for details of configuration.

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

sw

6.3 TV

Please refer documentation for details of configuration.

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

tv

6.4 Prometheus Metrics

Please refer documentation for details of configuration.

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

prom

6.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-28T05:36:21.561+0800    INFO    boot/grpc_entry.go:1515 Bootstrap grpcEntry     {"eventId": "db2c977c-e0ff-4b21-bc0d-5966f1cad093", "entryName": "greeter"}
------------------------------------------------------------------------
endTime=2021-12-28T05:36:21.563575+08:00
startTime=2021-12-28T05:36:21.561362+08:00
elapsedNano=2213846
timezone=CST
ids={"eventId":"db2c977c-e0ff-4b21-bc0d-5966f1cad093"}
app={"appName":"rk","appVersion":"","entryName":"greeter","entryType":"GrpcEntry"}
env={"arch":"amd64","az":"*","domain":"*","hostname":"lark.local","localIP":"10.8.0.2","os":"darwin","realm":"*","region":"*"}
payloads={"commonServiceEnabled":true,"commonServicePathPrefix":"/rk/v1/","grpcPort":8080,"gwPort":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
6.6 Meta

Please refer documentation for details of configuration.

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

$ curl -vs localhost:8080/rk/v1/healthy
...
< HTTP/1.1 200 OK
< Content-Type: application/json
< X-Request-Id: 7e4f5ac5-3369-485f-89f7-55551cc4a9a1
< X-Rk-App-Name: rk
< X-Rk-App-Unix-Time: 2021-12-28T05:39:50.508328+08:00
< X-Rk-App-Version: 
< X-Rk-Received-Time: 2021-12-28T05:39:50.508328+08:00
< Date: Mon, 27 Dec 2021 21:39:50 GMT
...
6.7 Send request

We registered /v1/greeter API in grpc-gateway server and let's validate it!

$ curl -vs localhost:8080/v1/greeter             
*   Trying ::1...
* TCP_NODELAY set
* Connection failed
* connect to ::1 port 8080 failed: Connection refused
*   Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 8080 (#0)
> GET /v1/greeter HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.64.1
> Accept: */*
> 
< HTTP/1.1 200 OK
< Content-Type: application/json
< X-Request-Id: 07b0fbf6-cebf-40ac-84a2-533bbd4b8958
< X-Rk-App-Name: rk
< X-Rk-App-Unix-Time: 2021-12-28T05:41:04.653652+08:00
< X-Rk-App-Version: 
< X-Rk-Received-Time: 2021-12-28T05:41:04.653652+08:00
< Date: Mon, 27 Dec 2021 21:41:04 GMT
< Content-Length: 2
< 
* Connection #0 to host localhost left intact
{}

We registered api.v1.Greeter.Greeter API in gRPC server and let's validate it!

$ grpcurl -plaintext localhost:8080 api.v1.Greeter.Greeter 
{
  
}
6.8 RPC logs

Bellow logs would be printed in stdout.

The first block of log is from grpc-gateway request.

The second block of log is from gRPC request.

------------------------------------------------------------------------
endTime=2021-12-28T05:45:52.986041+08:00
startTime=2021-12-28T05:45:52.985956+08:00
elapsedNano=85065
timezone=CST
ids={"eventId":"88362f69-7eda-4f03-bdbe-7ef667d06bac","requestId":"88362f69-7eda-4f03-bdbe-7ef667d06bac"}
app={"appName":"rk","appVersion":"","entryName":"greeter","entryType":"GrpcEntry"}
env={"arch":"amd64","az":"*","domain":"*","hostname":"lark.local","localIP":"10.8.0.2","os":"darwin","realm":"*","region":"*"}
payloads={"grpcMethod":"Greeter","grpcService":"api.v1.Greeter","grpcType":"unaryServer","gwMethod":"GET","gwPath":"/v1/greeter","gwScheme":"http","gwUserAgent":"curl/7.64.1"}
error={}
counters={}
pairs={}
timing={}
remoteAddr=127.0.0.1:61520
operation=/api.v1.Greeter/Greeter
resCode=OK
eventStatus=Ended
EOE
------------------------------------------------------------------------
endTime=2021-12-28T05:44:45.686734+08:00
startTime=2021-12-28T05:44:45.686592+08:00
elapsedNano=141716
timezone=CST
ids={"eventId":"7765862c-9e83-443a-a6e5-bb28f17f8ea0","requestId":"7765862c-9e83-443a-a6e5-bb28f17f8ea0"}
app={"appName":"rk","appVersion":"","entryName":"greeter","entryType":"GrpcEntry"}
env={"arch":"amd64","az":"*","domain":"*","hostname":"lark.local","localIP":"10.8.0.2","os":"darwin","realm":"*","region":"*"}
payloads={"grpcMethod":"Greeter","grpcService":"api.v1.Greeter","grpcType":"unaryServer","gwMethod":"","gwPath":"","gwScheme":"","gwUserAgent":""}
error={}
counters={}
pairs={}
timing={}
remoteAddr=127.0.0.1:57149
operation=/api.v1.Greeter/Greeter
resCode=OK
eventStatus=Ended
EOE
6.9 RPC prometheus metrics

Prometheus client will automatically register into grpc-gateway instance at /metrics.

Access http://localhost:8080/metrics

image

YAML options

User can start multiple gRPC and grpc-gateway instances at the same time. Please make sure use different port and name.

gRPC Service

namedescriptiontypedefault value
grpc.nameThe name of gRPC serverstringN/A
grpc.enabledEnable gRPC entryboolfalse
grpc.portThe port of gRPC serverintegernil, server won't start
grpc.descriptionDescription of gRPC entry.string""
grpc.enableReflectionEnable gRPC server reflectionbooleanfalse
grpc.enableRkGwOptionEnable RK style grpc-gateway server options. detailfalse
grpc.noRecvMsgSizeLimitDisable gRPC server side receive message size limitfalse
grpc.gwMappingFilePathsThe grpc grpc-gateway mapping file path. examplestring array[]
grpc.certEntryReference of cert entry declared in cert entrystring""
grpc.logger.zapLoggerReference of zapLoggerEntry declared in zapLoggerEntrystring""
grpc.logger.eventLoggerReference of eventLoggerEntry declared in eventLoggerEntrystring""

gRPC gateway options

Please refer to bellow repository for detailed explanations.

namedescriptiontypedefault value
grpc.gwOption.marshal.multilineEnable multiline in grpc-gateway marshallerboolfalse
grpc.gwOption.marshal.emitUnpopulatedEnable emitUnpopulated in grpc-gateway marshallerboolfalse
grpc.gwOption.marshal.indentSet indent in grpc-gateway marshallerstring" "
grpc.gwOption.marshal.allowPartialEnable allowPartial in grpc-gateway marshallerboolfalse
grpc.gwOption.marshal.useProtoNamesEnable useProtoNames in grpc-gateway marshallerboolfalse
grpc.gwOption.marshal.useEnumNumbersEnable useEnumNumbers in grpc-gateway marshallerboolfalse
grpc.gwOption.unmarshal.allowPartialEnable allowPartial in grpc-gateway unmarshalerboolfalse
grpc.gwOption.unmarshal.discardUnknownEnable discardUnknown in grpc-gateway unmarshalerboolfalse

Common Service

PathDescription
/rk/v1/apisList APIs in current GinEntry.
/rk/v1/certsList CertEntry.
/rk/v1/configsList ConfigEntry.
/rk/v1/depsList dependencies related application, entire contents of go.mod file would be returned.
/rk/v1/entriesList all Entries.
/rk/v1/gcTrigger GC
/rk/v1/healthyGet application healthy status.
/rk/v1/infoGet application and process info.
/rk/v1/licenseGet license related application, entire contents of LICENSE file would be returned.
/rk/v1/logsList logger related entries.
/rk/v1/gitGet git information.
/rk/v1/readmeGet contents of README file.
/rk/v1/reqList prometheus metrics of requests.
/rk/v1/sysGet OS stat.
/rk/v1/tvGet HTML page of /tv.
namedescriptiontypedefault value
grpc.commonService.enabledEnable embedded common servicebooleanfalse

Prom Client

namedescriptiontypedefault value
grpc.prom.enabledEnable prometheusbooleanfalse
grpc.prom.pathPath of prometheusstring/metrics
grpc.prom.pusher.enabledEnable prometheus pusherboolfalse
grpc.prom.pusher.jobNameJob name would be attached as label while pushing to remote pushgatewaystring""
grpc.prom.pusher.remoteAddresspushgateway address, could be form of http://x.x.x.x or x.x.x.xstring""
grpc.prom.pusher.intervalMsPush interval in millisecondsstring1000
grpc.prom.pusher.basicAuthBasic auth used to interact with remote pushgateway, form of [user:pass]string""
grpc.prom.pusher.cert.refReference of rkentry.CertEntrystring""

TV Service

namedescriptiontypedefault value
grpc.tv.enabledEnable RK TVbooleanfalse

Swagger Service

namedescriptiontypedefault value
grpc.sw.enabledEnable swagger service over gRPC serverbooleanfalse
grpc.sw.pathThe path access swagger service from webstring/sw
grpc.sw.jsonPathWhere the swagger.json files are stored locallystring""
grpc.sw.headersHeaders would be sent to caller as scheme of [key:value][]string[]

Static file handler Service

namedescriptiontypedefault value
grpc.static.enabledOptional, Enable static file handlerbooleanfalse
grpc.static.pathOptional, path of static file handlerstring/rk/v1/static
grpc.static.sourceTypeRequired, local and pkger supportedstring""
grpc.static.sourcePathRequired, full path of source directorystring""
  • 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-grpc:/boot/assets

Interceptors

Log
namedescriptiontypedefault value
grpc.interceptors.loggingZap.enabledEnable log interceptorbooleanfalse
grpc.interceptors.loggingZap.zapLoggerEncodingjson or consolestringconsole
grpc.interceptors.loggingZap.zapLoggerOutputPathsOutput paths[]stringstdout
grpc.interceptors.loggingZap.eventLoggerEncodingjson or consolestringconsole
grpc.interceptors.loggingZap.eventLoggerOutputPathsOutput paths[]stringfalse

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.

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-06-24T05:58:48.282193+08:00
startTime=2021-06-24T05:58:48.28204+08:00
elapsedNano=153005
timezone=CST
ids={"eventId":"573ce6a8-308b-4fc0-9255-33608b9e41d4","requestId":"573ce6a8-308b-4fc0-9255-33608b9e41d4"}
app={"appName":"rk-grpc","appVersion":"master-xxx","entryName":"greeter","entryType":"GrpcEntry"}
env={"arch":"amd64","az":"*","domain":"*","hostname":"lark.local","localIP":"10.8.0.6","os":"darwin","realm":"*","region":"*"}
payloads={"grpcMethod":"Healthy","grpcService":"rk.api.v1.RkCommonService","grpcType":"unaryServer","gwMethod":"GET","gwPath":"/rk/v1/healthy","gwScheme":"http","gwUserAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36"}
error={}
counters={}
pairs={"healthy":"true"}
timing={}
remoteAddr=localhost:57135
operation=/rk.api.v1.RkCommonService/Healthy
resCode=OK
eventStatus=Ended
EOE
Metrics
namedescriptiontypedefault value
grpc.interceptors.metricsProm.enabledEnable metrics interceptorbooleanfalse
Auth

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

namedescriptiontypedefault value
grpc.interceptors.auth.enabledEnable auth interceptorbooleanfalse
grpc.interceptors.auth.basicBasic auth credentials as scheme of user:pass[]string[]
grpc.interceptors.auth.apiKeyAPI key[]string[]
grpc.interceptors.auth.ignorePrefixThe paths of prefix that will be ignored by interceptor[]string[]
Meta

Send application metadata as header to client and grpc-gateway.

namedescriptiontypedefault value
grpc.interceptors.meta.enabledEnable meta interceptorbooleanfalse
grpc.interceptors.meta.prefixHeader key was formed as X--XXXstringRK
Tracing
namedescriptiontypedefault value
grpc.interceptors.tracingTelemetry.enabledEnable tracing interceptorbooleanfalse
grpc.interceptors.tracingTelemetry.exporter.file.enabledEnable file exporterbooleanfalse
grpc.interceptors.tracingTelemetry.exporter.file.outputPathExport tracing info to filesstringstdout
grpc.interceptors.tracingTelemetry.exporter.jaeger.agent.enabledExport tracing info to jaeger agentbooleanfalse
grpc.interceptors.tracingTelemetry.exporter.jaeger.agent.hostAs name describedstringlocalhost
grpc.interceptors.tracingTelemetry.exporter.jaeger.agent.portAs name describedint6831
grpc.interceptors.tracingTelemetry.exporter.jaeger.collector.enabledExport tracing info to jaeger collectorbooleanfalse
grpc.interceptors.tracingTelemetry.exporter.jaeger.collector.endpointAs name describedstringhttp://localhost:16368/api/trace
grpc.interceptors.tracingTelemetry.exporter.jaeger.collector.usernameAs name describedstring""
grpc.interceptors.tracingTelemetry.exporter.jaeger.collector.passwordAs name describedstring""
RateLimit
namedescriptiontypedefault value
grpc.interceptors.rateLimit.enabledEnable rate limit interceptorbooleanfalse
grpc.interceptors.rateLimit.algorithmProvide algorithm, tokenBucket and leakyBucket are available optionsstringtokenBucket
grpc.interceptors.rateLimit.reqPerSecRequest per second globallyint0
grpc.interceptors.rateLimit.paths.pathgRPC full namestring""
grpc.interceptors.rateLimit.paths.reqPerSecRequest per second by gRPC full method nameint0
Timeout
namedescriptiontypedefault value
grpc.interceptors.timeout.enabledEnable timeout interceptorbooleanfalse
grpc.interceptors.timeout.timeoutMsGlobal timeout in milliseconds.int5000
grpc.interceptors.timeout.paths.pathFull pathstring""
grpc.interceptors.timeout.paths.timeoutMsTimeout in milliseconds by full pathint5000
CORS

Middleware for grpc-gateway.

namedescriptiontypedefault value
grpc.interceptors.cors.enabledEnable cors interceptorbooleanfalse
grpc.interceptors.cors.allowOriginsProvide allowed origins with wildcard enabled.[]string*
grpc.interceptors.cors.allowMethodsProvide allowed methods returns as response header of OPTIONS request.[]stringAll http methods
grpc.interceptors.cors.allowHeadersProvide allowed headers returns as response header of OPTIONS request.[]stringHeaders from request
grpc.interceptors.cors.allowCredentialsReturns as response header of OPTIONS request.boolfalse
grpc.interceptors.cors.exposeHeadersProvide exposed headers returns as response header of OPTIONS request.[]string""
grpc.interceptors.cors.maxAgeProvide max age returns as response header of OPTIONS request.int0
JWT
namedescriptiontypedefault value
grpc.interceptors.jwt.enabledEnable JWT interceptorbooleanfalse
grpc.interceptors.jwt.signingKeyRequired, Provide signing key.string""
grpc.interceptors.jwt.ignorePrefixProvide ignoring path prefix.[]string[]
grpc.interceptors.jwt.signingKeysProvide signing keys as scheme of :.[]string[]
grpc.interceptors.jwt.signingAlgoProvide signing algorithm.stringHS256
grpc.interceptors.jwt.tokenLookupProvide token lookup scheme, please see bellow description.string"header:Authorization"
grpc.interceptors.jwt.authSchemeProvide auth scheme.stringBearer

The supported scheme of tokenLookup

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

Middleware for grpc-gateway.

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

Middleware for grpc-gateway.

namedescriptiontypedefault value
grpc.interceptors.csrf.enabledEnable csrf interceptorbooleanfalse
grpc.interceptors.csrf.tokenLengthProvide the length of the generated token.int32
grpc.interceptors.csrf.tokenLookupProvide csrf token lookup rules, please see code comments for details.string"header:X-CSRF-Token"
grpc.interceptors.csrf.cookieNameProvide name of the CSRF cookie. This cookie will store CSRF token.string_csrf
grpc.interceptors.csrf.cookieDomainDomain of the CSRF cookie.string""
grpc.interceptors.csrf.cookiePathPath of the CSRF cookie.string""
grpc.interceptors.csrf.cookieMaxAgeProvide max age (in seconds) of the CSRF cookie.int86400
grpc.interceptors.csrf.cookieHttpOnlyIndicates if CSRF cookie is HTTP only.boolfalse
grpc.interceptors.csrf.cookieSameSiteIndicates SameSite mode of the CSRF cookie. Options: lax, strict, none, defaultstringdefault
grpc.interceptors.csrf.ignorePrefixIgnoring 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
#    zap:
#      level: info                                         # Optional, default: info, options: [debug, DEBUG, info, INFO, warn, WARN, dpanic, DPANIC, panic, PANIC, fatal, FATAL]
#      development: true                                   # Optional, default: true
#      disableCaller: false                                # Optional, default: false
#      disableStacktrace: true                             # Optional, default: true
#      sampling:
#        initial: 0                                        # Optional, default: 0
#        thereafter: 0                                     # Optional, default: 0
#      encoding: console                                   # Optional, default: "console", options: [console, json]
#      encoderConfig:
#        messageKey: "msg"                                 # Optional, default: "msg"
#        levelKey: "level"                                 # Optional, default: "level"
#        timeKey: "ts"                                     # Optional, default: "ts"
#        nameKey: "logger"                                 # Optional, default: "logger"
#        callerKey: "caller"                               # Optional, default: "caller"
#        functionKey: ""                                   # Optional, default: ""
#        stacktraceKey: "msg"                              # Optional, default: "msg"
#        lineEnding: "\n"                                  # Optional, default: "\n"
#        levelEncoder: "capitalColor"                      # Optional, default: "capitalColor", options: [capital, capitalColor, color, lowercase]
#        timeEncoder: "iso8601"                            # Optional, default: "iso8601", options: [rfc3339nano, RFC3339Nano, rfc3339, RFC3339, iso8601, ISO8601, millis, nanos]
#        durationEncoder: "string"                         # Optional, default: "string", options: [string, nanos, ms]
#        callerEncoder: ""                                 # Optional, default: ""
#        nameEncoder: ""                                   # Optional, default: ""
#        consoleSeparator: ""                              # Optional, default: ""
#      outputPaths: [ "stdout" ]                           # Optional, default: ["stdout"], stdout would be replaced if specified
#      errorOutputPaths: [ "stderr" ]                      # Optional, default: ["stderr"], stderr would be replaced if specified
#      initialFields:                                      # Optional, default: empty map
#        key: "value"
#    lumberjack:
#      filename: "rkapp.log"                               # Optional, default: It uses <processname>-lumberjack.log in os.TempDir() if empty.
#      maxsize: 1024                                       # Optional, default: 1024 (MB)
#      maxage: 7                                           # Optional, default: 7 (days)
#      maxbackups: 3                                       # Optional, default: 3 (days)
#      localtime: true                                     # Optional, default: true
#      compress: true                                      # Optional, default: 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
#eventLogger:
#  - name: event-logger                                    # Required
#    encoding: "json"                                      # Optional, default: console, options: [json, console]
#    outputPaths: []                                       # Optional, default: ["stdout"], stdout would be replaced if specified
#    lumberjack:
#      filename: "rkapp.log"                               # Optional, default: It uses <processname>-lumberjack.log in os.TempDir() if empty.
#      maxsize: 1024                                       # Optional, default: 1024 (MB)
#      maxage: 7                                           # Optional, default: 7 (days)
#      maxbackups: 3                                       # Optional, default: 3 (days)
#      localtime: true                                     # Optional, default: true
#      compress: true                                      # Optional, default: 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
#cred:
#  - name: "local-cred"                                    # Required
#    description: "Description of entry"                   # Optional
#    provider: "localFs"                                   # Required, etcd, consul, localFs, remoteFs are supported options
#    locale: "*::*::*::*"                                  # Required, default: ""
#    paths:                                                # Optional
#      - "example/boot/full/cred.yaml"
#cert:                                                     # Optional
#  - 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/boot/full/server.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
grpc:
  - name: greeter                                          # Required
    enabled: true                                          # Required
    port: 8080                                             # Required
#    description: "greeter server"                         # Optional, default: ""
#    enableReflection: true                                # Optional, default: false
#    enableRkGwOption: true                                # Optional, default: false
#    gwOption:                                             # Optional, default: nil
#      marshal:                                            # Optional, default: nil
#        multiline: false                                  # Optional, default: false
#        emitUnpopulated: false                            # Optional, default: false
#        indent: ""                                        # Optional, default: false
#        allowPartial: false                               # Optional, default: false
#        useProtoNames: false                              # Optional, default: false
#        useEnumNumbers: false                             # Optional, default: false
#      unmarshal:                                          # Optional, default: nil
#        allowPartial: false                               # Optional, default: false
#        discardUnknown: false                             # Optional, default: false
#    noRecvMsgSizeLimit: true                              # Optional, default: false
#    gwMappingFilePaths: []                                # Optional
#    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.api.v1.RkCommonService/Healthy"    # Optional, default: ""
#            reqPerSec: 0                                  # Optional, default: 1000000
#      timeout:
#        enabled: false                                    # Optional, default: false
#        timeoutMs: 5000                                   # Optional, default: 5000
#        paths:
#          - path: "/rk.api.v1.RkCommonService/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"
#      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: []
#      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

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

  • make buf

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.

FAQs

Package last updated on 30 Jan 2022

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc