{"id":19484059,"url":"https://github.com/rookie-ninja/rk-zero","last_synced_at":"2025-04-25T16:33:11.914Z","repository":{"id":43869045,"uuid":"438881906","full_name":"rookie-ninja/rk-zero","owner":"rookie-ninja","description":"Start go-zero microservice from YAML, plugin of rk-boot","archived":false,"fork":false,"pushed_at":"2023-10-31T12:43:58.000Z","size":12103,"stargazers_count":3,"open_issues_count":0,"forks_count":4,"subscribers_count":2,"default_branch":"master","last_synced_at":"2024-06-20T12:24:58.404Z","etag":null,"topics":["go-zero","golang"],"latest_commit_sha":null,"homepage":"https://rkdev.info","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rookie-ninja.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-12-16T06:20:57.000Z","updated_at":"2022-11-01T19:49:10.000Z","dependencies_parsed_at":"2023-10-31T13:36:15.133Z","dependency_job_id":null,"html_url":"https://github.com/rookie-ninja/rk-zero","commit_stats":null,"previous_names":[],"tags_count":37,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rookie-ninja%2Frk-zero","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rookie-ninja%2Frk-zero/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rookie-ninja%2Frk-zero/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rookie-ninja%2Frk-zero/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rookie-ninja","download_url":"https://codeload.github.com/rookie-ninja/rk-zero/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":224008609,"owners_count":17240415,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["go-zero","golang"],"created_at":"2024-11-10T20:19:03.958Z","updated_at":"2024-11-10T20:19:05.122Z","avatar_url":"https://github.com/rookie-ninja.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# rk-zero\n[![build](https://github.com/rookie-ninja/rk-zero/actions/workflows/ci.yml/badge.svg)](https://github.com/rookie-ninja/rk-zero/actions/workflows/ci.yml)\n[![codecov](https://codecov.io/gh/rookie-ninja/rk-zero/branch/master/graph/badge.svg?token=Y1HM9UQBX6)](https://codecov.io/gh/rookie-ninja/rk-zero)\n[![Go Report Card](https://goreportcard.com/badge/github.com/rookie-ninja/rk-zero)](https://goreportcard.com/report/github.com/rookie-ninja/rk-zero)\n[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)\n\nMiddleware \u0026 bootstrapper designed for [zeromicro/go-zero](https://github.com/zeromicro/go-zero) framework.  [Documentation](https://docs.rkdev.info/docs/rk-boot/getting-started/zero/).\n\nThis belongs to [rk-boot](https://github.com/rookie-ninja/rk-boot) family. \n\n![image](docs/img/boot-arch.png)\n\n## Architecture\n![image](docs/img/zero-arch.png)\n\n## Supported bootstrap\n| Bootstrap  | Description                                                                            |\n|------------|----------------------------------------------------------------------------------------|\n| YAML based | Start [zeromicro/go-zero](https://github.com/zeromicro/go-zero) microservice from YAML |\n| Code based | Start [zeromicro/go-zero](https://github.com/zeromicro/go-zero) microservice from code |\n\n## Supported instances\nAll instances could be configured via YAML or Code.\n\n**User can enable anyone of those as needed! No mandatory binding!**\n\n| Instance          | Description                                                                                                   |\n|-------------------|---------------------------------------------------------------------------------------------------------------|\n| rest.Server       | Compatible with original [zeromicro/go-zero](https://github.com/zeromicro/go-zero) service functionalities    |\n| Config            | Configure [spf13/viper](https://github.com/spf13/viper) as config instance and reference it from YAML         |\n| Logger            | Configure [uber-go/zap](https://github.com/uber-go/zap) logger configuration and reference it from YAML       |\n| Event             | Configure logging of RPC with [rk-query](https://github.com/rookie-ninja/rk-query) and reference it from YAML |\n| Cert              | Fetch TLS/SSL certificates start microservice.                                                                |\n| Prometheus        | Start prometheus client at client side and push metrics to pushgateway as needed.                             |\n| Swagger           | Builtin swagger UI handler.                                                                                   |\n| Docs              | Builtin [RapiDoc](https://github.com/mrin9/RapiDoc) instance which can be used to replace swagger and RK TV.  |\n| CommonService     | List of common APIs.                                                                                          |\n| StaticFileHandler | A Web UI shows files could be downloaded from server, currently support source of local and embed.FS.         |\n| PProf             | PProf web UI.                                                                                                 |\n\n\n## Supported middlewares\nAll middlewares could be configured via YAML or Code.\n\n**User can enable anyone of those as needed! No mandatory binding!**\n\n| Middleware | Description                                                                                                                                           |\n|------------|-------------------------------------------------------------------------------------------------------------------------------------------------------|\n| Prom       | Collect RPC metrics and export to [prometheus](https://github.com/prometheus/client_golang) client.                                                   |\n| Logging    | Log every RPC requests as event with [rk-query](https://github.com/rookie-ninja/rk-query).                                                            |\n| Trace      | Collect RPC trace and export it to stdout, file or jaeger with [open-telemetry/opentelemetry-go](https://github.com/open-telemetry/opentelemetry-go). |\n| Panic      | Recover from panic for RPC requests and log it.                                                                                                       |\n| Meta       | Send micsro service metadata as header to client.                                                                                                     |\n| Auth       | Support [Basic Auth] and [API Key] authorization types.                                                                                               |\n| RateLimit  | Limiting RPC rate globally or per path.                                                                                                               |\n| CORS       | Server side CORS validation.                                                                                                                          |\n| JWT        | Server side JWT validation.                                                                                                                           |\n| Secure     | Server side secure validation.                                                                                                                        |\n| CSRF       | Server side csrf validation.                                                                                                                          |\n\n\n## Installation\n`go get github.com/rookie-ninja/rk-zero`\n\n## Quick Start\nIn the bellow example, we will start microservice with bellow functionality and middlewares enabled via YAML.\n\n- [zeromicro/go-zero](https://github.com/zeromicro/go-zero) server\n- Swagger UI\n- CommonService\n- Docs\n- Prometheus Metrics (middleware)\n- Logging (middleware)\n- Meta (middleware)\n\nPlease refer example at [example/boot/simple](example/boot/simple).\n\n### 1.Create boot.yaml\n- [boot.yaml](example/boot/simple/boot.yaml)\n\n```yaml\n---\nzero:\n  - name: greeter                     # Required\n    port: 8080                        # Required\n    enabled: true                     # Required\n    commonService:\n      enabled: true                   # Optional, default: false\n    sw:\n      enabled: true                   # Optional, default: false\n    docs:\n      enabled: true                   # Optional, default: false\n    prom:\n      enabled: true                   # Optional, default: false\n    middleware:\n      logging:\n        enabled: true                 # Optional, default: false\n      prom:\n        enabled: true                 # Optional, default: false\n      meta:\n        enabled: true                 # Optional, default: false\n```\n\n### 2.Create main.go\n- [main.go](example/boot/simple/main.go)\n\n```go\n// Copyright (c) 2021 rookie-ninja\n//\n// Use of this source code is governed by an Apache-style\n// license that can be found in the LICENSE file.\npackage main\n\nimport (\n\t\"context\"\n\t_ \"embed\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"github.com/rookie-ninja/rk-entry/v2/entry\"\n\t\"github.com/rookie-ninja/rk-zero/boot\"\n\t\"github.com/zeromicro/go-zero/rest\"\n\t\"net/http\"\n)\n\n//go:embed boot.yaml\nvar boot []byte\n\nfunc main() {\n\t// Bootstrap preload entries\n\trkentry.BootstrapPreloadEntryYAML(boot)\n\n\t// Bootstrap zero entry from boot config\n\tres := rkzero.RegisterZeroEntryYAML(boot)\n\n\t// Get ZeroEntry\n\tzeroEntry := res[\"greeter\"].(*rkzero.ZeroEntry)\n\t// Add router\n\tzeroEntry.Server.AddRoute(rest.Route{\n\t\tMethod:  http.MethodGet,\n\t\tPath:    \"/v1/greeter\",\n\t\tHandler: Greeter,\n\t})\n\n\t// Bootstrap zero entry\n\tzeroEntry.Bootstrap(context.Background())\n\n\t// Wait for shutdown signal\n\trkentry.GlobalAppCtx.WaitForShutdownSig()\n\n\t// Interrupt zero entry\n\tzeroEntry.Interrupt(context.Background())\n}\n\nfunc Greeter(writer http.ResponseWriter, request *http.Request) {\n\twriter.WriteHeader(http.StatusOK)\n\tresp := \u0026GreeterResponse{\n\t\tMessage: fmt.Sprintf(\"Hello %s!\", request.URL.Query().Get(\"name\")),\n\t}\n\tbytes, _ := json.Marshal(resp)\n\twriter.Write(bytes)\n}\n\ntype GreeterResponse struct {\n\tMessage string\n}\n```\n\n### 3.Start server\n\n```go\n$ go run main.go\n```\n\n### 4.Validation\n#### 4.1 GoZero server\nTry to test GoZero Service with [curl](https://curl.se/)\n\n```shell script\n# Curl to common service\n$ curl localhost:8080/rk/v1/ready\n{\n  \"ready\": true\n}\n\n$ curl localhost:8080/rk/v1/alive\n{\n  \"alive\": true\n}\n```\n\n#### 4.2 Swagger UI\nPlease refer **sw** section at [Full YAML](#full-yaml).\n\nBy default, we could access swagger UI at [http://localhost:8080/sw](http://localhost:8080/sw)\n\n![sw](docs/img/simple-sw.png)\n\n#### 4.3 Docs UI\nPlease refer **docs** section at [Full YAML](#full-yaml).\n\nBy default, we could access docs UI at [http://localhost:8080/docs](http://localhost:8080/docs)\n\n![docs](docs/img/simple-docs.png)\n\n#### 4.4 Prometheus Metrics\nPlease refer **middleware.prom** section at [Full YAML](#full-yaml).\n\nBy default, we could access prometheus client at [http://localhost:8080/metrics](http://localhost:8080/metrics)\n- http://localhost:8080/metrics\n\n![prom](docs/img/simple-prom.png)\n\n#### 4.5 Logging\nPlease refer **middleware.logging** section at [Full YAML](#full-yaml).\n\nBy default, we enable zap logger and event logger with encoding type of [console]. Encoding type of [json] and [flatten] is also supported.\n\n```shell script\n2021-12-29T01:47:33.795+0800    INFO    boot/zero_entry.go:1168 Bootstrap zeroEntry     {\"eventId\": \"9b176423-d751-4066-838a-1eedcc72a7fb\", \"entryName\": \"greeter\"}\n------------------------------------------------------------------------\nendTime=2021-12-29T01:47:33.797725+08:00\nstartTime=2021-12-29T01:47:33.795914+08:00\nelapsedNano=1810699\ntimezone=CST\nids={\"eventId\":\"9b176423-d751-4066-838a-1eedcc72a7fb\"}\napp={\"appName\":\"rk\",\"appVersion\":\"\",\"entryName\":\"greeter\",\"entryType\":\"ZeroEntry\"}\nenv={\"arch\":\"amd64\",\"az\":\"*\",\"domain\":\"*\",\"hostname\":\"lark.local\",\"localIP\":\"10.8.0.2\",\"os\":\"darwin\",\"realm\":\"*\",\"region\":\"*\"}\npayloads={\"commonServiceEnabled\":true,\"commonServicePathPrefix\":\"/rk/v1/\",\"zeroPort\":8080,\"promEnabled\":true,\"promPath\":\"/metrics\",\"promPort\":8080,\"swEnabled\":true,\"swPath\":\"/sw/\",\"tvEnabled\":true,\"tvPath\":\"/rk/v1/tv/\"}\nerror={}\ncounters={}\npairs={}\ntiming={}\nremoteAddr=localhost\noperation=Bootstrap\nresCode=OK\neventStatus=Ended\nEOE\n```\n\n#### 4.6 Meta\nPlease refer **meta** section at [Full YAML](#full-yaml).\n\nBy default, we will send back some metadata to client including gateway with headers.\n\n```shell script\n$ curl -vs localhost:8080/rk/v1/ready\n...\n\u003c HTTP/1.1 200 OK\n\u003c Content-Type: application/json\n\u003c X-Request-Id: f068670c-56dc-42ed-9368-14961acd8433\n\u003c X-Rk-App-Name: rk\n\u003c X-Rk-App-Unix-Time: 2021-12-29T01:50:35.791623+08:00\n\u003c X-Rk-App-Version: \n\u003c X-Rk-Received-Time: 2021-12-29T01:50:35.791623+08:00\n\u003c X-Trace-Id: 3a84ce72b53ce43468a5e81e8dceadcb\n\u003c Date: Tue, 28 Dec 2021 17:50:35 GMT\n...\n```\n\n#### 4.7 Send request\nWe registered /v1/greeter API in [zeromicro/go-zero](https://github.com/zeromicro/go-zero) server and let's validate it!\n\n```shell script\n$ curl -vs localhost:8080/v1/greeter?name=rk-dev\n*   Trying ::1...\n* TCP_NODELAY set\n* Connected to localhost (::1) port 8080 (#0)\n\u003e GET /v1/greeter?name=rk-dev HTTP/1.1\n\u003e Host: localhost:8080\n\u003e User-Agent: curl/7.64.1\n\u003e Accept: */*\n\u003e \n\u003c HTTP/1.1 200 OK\n\u003c X-Request-Id: d7a6e873-cf8e-465f-8248-c53a76831fed\n\u003c X-Rk-App-Locale: *::*::*::*\n\u003c X-Rk-App-Name: \n\u003c X-Rk-App-Unix-Time: 2022-03-06T22:14:14.56221+08:00\n\u003c X-Rk-App-Version: \n\u003c X-Rk-Received-Time: 2022-03-06T22:14:14.56221+08:00\n\u003c X-Trace-Id: 677c1314e24765ecc1e8ee7396f74d4e\n\u003c Date: Sun, 06 Mar 2022 14:14:14 GMT\n\u003c Content-Length: 27\n\u003c Content-Type: text/plain; charset=utf-8\n\u003c \n* Connection #0 to host localhost left intact\n{\"Message\":\"Hello rk-dev!\"}\n```\n\n#### 4.8 RPC logs\nBellow logs would be printed in stdout.\n\n```\n------------------------------------------------------------------------\nendTime=2021-12-29T01:52:32.478833+08:00\nstartTime=2021-12-29T01:52:32.478736+08:00\nelapsedNano=96450\ntimezone=CST\nids={\"eventId\":\"38bb7368-a829-4707-b079-a942ec4c1f82\",\"requestId\":\"38bb7368-a829-4707-b079-a942ec4c1f82\",\"traceId\":\"4170ff1daeb053166c26f0d7ca98c57e\"}\napp={\"appName\":\"rk\",\"appVersion\":\"\",\"entryName\":\"greeter\",\"entryType\":\"ZeroEntry\"}\nenv={\"arch\":\"amd64\",\"az\":\"*\",\"domain\":\"*\",\"hostname\":\"lark.local\",\"localIP\":\"10.8.0.2\",\"os\":\"darwin\",\"realm\":\"*\",\"region\":\"*\"}\npayloads={\"apiMethod\":\"GET\",\"apiPath\":\"/v1/greeter\",\"apiProtocol\":\"HTTP/1.1\",\"apiQuery\":\"\",\"userAgent\":\"curl/7.64.1\"}\nerror={}\ncounters={}\npairs={}\ntiming={}\nremoteAddr=localhost:62686\noperation=/v1/greeter\nresCode=200\neventStatus=Ended\nEOE\n```\n\n#### 4.9 RPC prometheus metrics\nPrometheus client will automatically register into [zeromicro/go-zero](https://github.com/zeromicro/go-zero) instance at /metrics.\n\nAccess [http://localhost:8080/metrics](http://localhost:8080/metrics)\n\n![image](docs/img/prom-inter.png)\n\n## YAML Options\nUser can start multiple [zeromicro/go-zero](https://github.com/zeromicro/go-zero) instances at the same time. Please make sure use different port and name.\n\n### go-zero\n| name             | description                                                                                                        | type    | default value           |\n|------------------|--------------------------------------------------------------------------------------------------------------------|---------|-------------------------|\n| zero.name        | The name of zero server                                                                                            | string  | N/A                     |\n| zero.port        | The port of zero server                                                                                            | integer | nil, server won't start |\n| zero.enabled     | Enable zero entry or not                                                                                           | bool    | false                   |\n| zero.description | Description of zero entry.                                                                                         | string  | \"\"                      |\n| zero.certEntry   | Optional, Reference of certEntry declared in [cert entry](https://github.com/rookie-ninja/rk-entry#certentry)      | string  | \"\"                      |\n| zero.loggerEntry | Optional, Reference of loggerEntry declared in [LoggerEntry](https://github.com/rookie-ninja/rk-entry#loggerentry) | string  | \"\"                      |\n| zero.eventEntry  | Optional, Reference of eventLEntry declared in [eventEntry](https://github.com/rookie-ninja/rk-entry#evententry)   | string  | \"\"                      |\n\n### CommonService\n| Path         | Description                       |\n|--------------|-----------------------------------|\n| /rk/v1/gc    | Trigger GC                        |\n| /rk/v1/ready | Get application readiness status. |\n| /rk/v1/alive | Get application aliveness status. |\n| /rk/v1/info  | Get application and process info. |\n\n| name                          | description                             | type    | default value |\n|-------------------------------|-----------------------------------------|---------|---------------|\n| zero.commonService.enabled    | Optional, Enable builtin common service | boolean | false         |\n| zero.commonService.pathPrefix | Optional, Provide path prefix           | string  | /rk/v1        |\n\n### Swagger\n| name             | description                                                        | type     | default value |\n|------------------|--------------------------------------------------------------------|----------|---------------|\n| zero.sw.enabled  | Optional, Enable swagger service over gin server                   | boolean  | false         |\n| zero.sw.path     | Optional, The path access swagger service from web                 | string   | /sw           |\n| zero.sw.jsonPath | Optional, Where the swagger.json files are stored locally          | []string | [\"\"]          |\n| zero.sw.headers  | Optional, Headers would be sent to caller as scheme of [key:value] | []string | []            |\n\n### Docs (RapiDoc)\n| name                  | description                                                                            | type     | default value |\n|-----------------------|----------------------------------------------------------------------------------------|----------|---------------|\n| zero.docs.enabled     | Optional, Enable RapiDoc service over gin server                                       | boolean  | false         |\n| zero.docs.path        | Optional, The path access docs service from web                                        | string   | /docs         |\n| zero.docs.jsonPath    | Optional, Where the swagger.json or open API files are stored locally                  | []string | [\"\"]          |\n| zero.docs.headers     | Optional, Headers would be sent to caller as scheme of [key:value]                     | []string | []            |\n| zero.docs.style.theme | Optional, light and dark are supported options                                         | string   | []            |\n| zero.docs.debug       | Optional, Enable debugging mode in RapiDoc which can be used as the same as Swagger UI | boolean  | false         |\n\n### Prometheus Client\n| name                           | description                                                                        | type    | default value |\n|--------------------------------|------------------------------------------------------------------------------------|---------|---------------|\n| zero.prom.enabled              | Optional, Enable prometheus                                                        | boolean | false         |\n| zero.prom.path                 | Optional, Path of prometheus                                                       | string  | /metrics      |\n| zero.prom.pusher.enabled       | Optional, Enable prometheus pusher                                                 | bool    | false         |\n| zero.prom.pusher.jobName       | Optional, Job name would be attached as label while pushing to remote pushgateway  | string  | \"\"            |\n| zero.prom.pusher.remoteAddress | Optional, PushGateWay address, could be form of http://x.x.x.x or x.x.x.x          | string  | \"\"            |\n| zero.prom.pusher.intervalMs    | Optional, Push interval in milliseconds                                            | string  | 1000          |\n| zero.prom.pusher.basicAuth     | Optional, Basic auth used to interact with remote pushgateway, form of [user:pass] | string  | \"\"            |\n| zero.prom.pusher.certEntry     | Optional, Reference of rkentry.CertEntry                                           | string  | \"\"            |\n\n### Static file handler\n| name                   | description                                | type    | default value |\n|------------------------|--------------------------------------------|---------|---------------|\n| zero.static.enabled    | Optional, Enable static file handler       | boolean | false         |\n| zero.static.path       | Optional, path of static file handler      | string  | /static       |\n| zero.static.sourceType | Required, local and embed.FS are supported | string  | \"\"            |\n| zero.static.sourcePath | Required, full path of source directory    | string  | \"\"            |\n\n- About embed.FS\n  User has to set embedFS before Bootstrap() function as bellow:\n-\n```go\n//go:embed /*\nvar staticFS embed.FS\n\nrkentry.GlobalAppCtx.AddEmbedFS(rkentry.StaticFileHandlerEntryType, \"greeter\", \u0026staticFS)\n```\n\n### Middlewares\n| name                   | description                                            | type     | default value |\n|------------------------|--------------------------------------------------------|----------|---------------|\n| zero.middleware.ignore | The paths of prefix that will be ignored by middleware | []string | []            |\n\n#### Logging\n| name                                      | description                                            | type     | default value |\n|-------------------------------------------|--------------------------------------------------------|----------|---------------|\n| zero.middleware.logging.enabled           | Enable log middleware                                  | boolean  | false         |\n| zero.middleware.logging.ignore            | The paths of prefix that will be ignored by middleware | []string | []            |\n| zero.middleware.logging.loggerEncoding    | json or console or flatten                             | string   | console       |\n| zero.middleware.logging.loggerOutputPaths | Output paths                                           | []string | stdout        |\n| zero.middleware.logging.eventEncoding     | json or console or flatten                             | string   | console       |\n| zero.middleware.logging.eventOutputPaths  | Output paths                                           | []string | false         |\n\nWe will log two types of log for every RPC call.\n- Logger\n\nContains user printed logging with requestId or traceId.\n\n- Event\n\nContains per RPC metadata, response information, environment information and etc.\n\n| Field       | Description                                                                                                                                                                                                                                                                                                           |\n|-------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| endTime     | As name described                                                                                                                                                                                                                                                                                                     |\n| startTime   | As name described                                                                                                                                                                                                                                                                                                     |\n| elapsedNano | Elapsed time for RPC in nanoseconds                                                                                                                                                                                                                                                                                   |\n| timezone    | As name described                                                                                                                                                                                                                                                                                                     |\n| 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. |\n| app         | Contains [appName, appVersion](https://github.com/rookie-ninja/rk-entry#appinfoentry), entryName, entryType.                                                                                                                                                                                                          |\n| 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.                                                                                                      |\n| payloads    | Contains RPC related metadata                                                                                                                                                                                                                                                                                         |\n| error       | Contains errors if occur                                                                                                                                                                                                                                                                                              |\n| counters    | Set by calling event.SetCounter() by user.                                                                                                                                                                                                                                                                            |\n| pairs       | Set by calling event.AddPair() by user.                                                                                                                                                                                                                                                                               |\n| timing      | Set by calling event.StartTimer() and event.EndTimer() by user.                                                                                                                                                                                                                                                       |\n| remoteAddr  | As name described                                                                                                                                                                                                                                                                                                     |\n| operation   | RPC method name                                                                                                                                                                                                                                                                                                       |\n| resCode     | Response code of RPC                                                                                                                                                                                                                                                                                                  |\n| eventStatus | Ended or InProgress                                                                                                                                                                                                                                                                                                   |\n\n- example\n\n```shell script\n------------------------------------------------------------------------\nendTime=2021-11-01T23:31:01.706614+08:00\nstartTime=2021-11-01T23:31:01.706335+08:00\nelapsedNano=278966\ntimezone=CST\nids={\"eventId\":\"61cae46e-ea98-47b5-8a39-1090d015e09a\",\"requestId\":\"61cae46e-ea98-47b5-8a39-1090d015e09a\"}\napp={\"appName\":\"rk-zero\",\"appVersion\":\"master-e4538d7\",\"entryName\":\"greeter\",\"entryType\":\"ZeroEntry\"}\nenv={\"arch\":\"amd64\",\"az\":\"*\",\"domain\":\"*\",\"hostname\":\"lark.local\",\"localIP\":\"192.168.1.104\",\"os\":\"darwin\",\"realm\":\"*\",\"region\":\"*\"}\npayloads={\"apiMethod\":\"GET\",\"apiPath\":\"/rk/v1/healthy\",\"apiProtocol\":\"HTTP/1.1\",\"apiQuery\":\"\",\"userAgent\":\"curl/7.64.1\"}\nerror={}\ncounters={}\npairs={}\ntiming={}\nremoteAddr=localhost:54376\noperation=/rk/v1/healthy\nresCode=200\neventStatus=Ended\nEOE\n```\n\n#### Prometheus\n| name                         | description                                            | type     | default value |\n|------------------------------|--------------------------------------------------------|----------|---------------|\n| zero.middleware.prom.enabled | Enable metrics middleware                              | boolean  | false         |\n| zero.middleware.prom.ignore  | The paths of prefix that will be ignored by middleware | []string | []            |\n\n#### Auth\nEnable the server side auth. codes.Unauthenticated would be returned to client if not authorized with user defined credential.\n\n| name                         | description                                            | type     | default value |\n|------------------------------|--------------------------------------------------------|----------|---------------|\n| zero.middleware.auth.enabled | Enable auth middleware                                 | boolean  | false         |\n| zero.middleware.auth.ignore  | The paths of prefix that will be ignored by middleware | []string | []            |\n| zero.middleware.auth.basic   | Basic auth credentials as scheme of \u003cuser:pass\u003e        | []string | []            |\n| zero.middleware.auth.apiKey  | API key auth                                           | []string | []            |\n\n#### Meta\nSend application metadata as header to client.\n\n| name                         | description                                            | type     | default value |\n|------------------------------|--------------------------------------------------------|----------|---------------|\n| zero.middleware.meta.enabled | Enable meta middleware                                 | boolean  | false         |\n| zero.middleware.meta.ignore  | The paths of prefix that will be ignored by middleware | []string | []            |\n| zero.middleware.meta.prefix  | Header key was formed as X-\u003cPrefix\u003e-XXX                | string   | RK            |\n\n#### Tracing\n| name                                                     | description                                            | type     | default value                    |\n|----------------------------------------------------------|--------------------------------------------------------|----------|----------------------------------|\n| zero.middleware.trace.enabled                            | Enable tracing middleware                              | boolean  | false                            |\n| zero.middleware.trace.ignore                             | The paths of prefix that will be ignored by middleware | []string | []                               |\n| zero.middleware.trace.exporter.file.enabled              | Enable file exporter                                   | boolean  | false                            |\n| zero.middleware.trace.exporter.file.outputPath           | Export tracing info to files                           | string   | stdout                           |\n| zero.middleware.trace.exporter.jaeger.agent.enabled      | Export tracing info to jaeger agent                    | boolean  | false                            |\n| zero.middleware.trace.exporter.jaeger.agent.host         | As name described                                      | string   | localhost                        |\n| zero.middleware.trace.exporter.jaeger.agent.port         | As name described                                      | int      | 6831                             |\n| zero.middleware.trace.exporter.jaeger.collector.enabled  | Export tracing info to jaeger collector                | boolean  | false                            |\n| zero.middleware.trace.exporter.jaeger.collector.endpoint | As name described                                      | string   | http://localhost:16368/api/trace |\n| zero.middleware.trace.exporter.jaeger.collector.username | As name described                                      | string   | \"\"                               |\n| zero.middleware.trace.exporter.jaeger.collector.password | As name described                                      | string   | \"\"                               |\n\n\n#### RateLimit\n| name                                      | description                                                          | type     | default value |\n|-------------------------------------------|----------------------------------------------------------------------|----------|---------------|\n| zero.middleware.rateLimit.enabled         | Enable rate limit middleware                                         | boolean  | false         |\n| zero.middleware.rateLimit.ignore          | The paths of prefix that will be ignored by middleware               | []string | []            |\n| zero.middleware.rateLimit.algorithm       | Provide algorithm, tokenBucket and leakyBucket are available options | string   | tokenBucket   |\n| zero.middleware.rateLimit.reqPerSec       | Request per second globally                                          | int      | 0             |\n| zero.middleware.rateLimit.paths.path      | Full path                                                            | string   | \"\"            |\n| zero.middleware.rateLimit.paths.reqPerSec | Request per second by full path                                      | int      | 0             |\n\n#### CORS\n| name                                  | description                                                            | type     | default value        |\n|---------------------------------------|------------------------------------------------------------------------|----------|----------------------|\n| zero.middleware.cors.enabled          | Enable cors middleware                                                 | boolean  | false                |\n| zero.middleware.cors.ignore           | The paths of prefix that will be ignored by middleware                 | []string | []                   |\n| zero.middleware.cors.allowOrigins     | Provide allowed origins with wildcard enabled.                         | []string | *                    |\n| zero.middleware.cors.allowMethods     | Provide allowed methods returns as response header of OPTIONS request. | []string | All http methods     |\n| zero.middleware.cors.allowHeaders     | Provide allowed headers returns as response header of OPTIONS request. | []string | Headers from request |\n| zero.middleware.cors.allowCredentials | Returns as response header of OPTIONS request.                         | bool     | false                |\n| zero.middleware.cors.exposeHeaders    | Provide exposed headers returns as response header of OPTIONS request. | []string | \"\"                   |\n| zero.middleware.cors.maxAge           | Provide max age returns as response header of OPTIONS request.         | int      | 0                    |\n\n#### JWT\nIn order to make swagger UI and RK tv work under JWT without JWT token, we need to ignore prefixes of paths as bellow.\n\n```yaml\njwt:\n  ...\n  ignore:\n   - \"/sw\"\n```\n\n| name                                          | description                                                                      | type     | default value          |\n|-----------------------------------------------|----------------------------------------------------------------------------------|----------|------------------------|\n| zero.middleware.jwt.enabled                   | Optional, Enable JWT middleware                                                  | boolean  | false                  |\n| zero.middleware.jwt.ignore                    | Optional, Provide ignoring path prefix.                                          | []string | []                     |\n| zero.middleware.jwt.signerEntry               | Optional, Provide signerEntry name.                                              | string   | \"\"                     |\n| zero.middleware.jwt.symmetric.algorithm       | Required if symmetric specified. One of HS256, HS384, HS512                      | string   | \"\"                     |\n| zero.middleware.jwt.symmetric.token           | Optional, raw token for signing and verification                                 | string   | \"\"                     |\n| zero.middleware.jwt.symmetric.tokenPath       | Optional, path of token file                                                     | string   | \"\"                     |\n| zero.middleware.jwt.asymmetric.algorithm      | Required if symmetric specified. One of RS256, RS384, RS512, ES256, ES384, ES512 | string   | \"\"                     |\n| zero.middleware.jwt.asymmetric.privateKey     | Optional, raw private key file for signing                                       | string   | \"\"                     |\n| zero.middleware.jwt.asymmetric.privateKeyPath | Optional, private key file path for signing                                      | string   | \"\"                     |\n| zero.middleware.jwt.asymmetric.publicKey      | Optional, raw public key file for verification                                   | string   | \"\"                     |\n| zero.middleware.jwt.asymmetric.publicKeyPath  | Optional, public key file path for verification                                  | string   | \"\"                     |\n| zero.middleware.jwt.tokenLookup               | Provide token lookup scheme, please see bellow description.                      | string   | \"header:Authorization\" |\n| zero.middleware.jwt.authScheme                | Provide auth scheme.                                                             | string   | Bearer                 |\n\nThe supported scheme of **tokenLookup**\n\n```\n// Optional. Default value \"header:Authorization\".\n// Possible values:\n// - \"header:\u003cname\u003e\"\n// - \"query:\u003cname\u003e\"\n// Multiply sources example:\n// - \"header: Authorization,cookie: myowncookie\"\n```\n\n#### Secure\n| name                                         | description                                       | type     | default value   |\n|----------------------------------------------|---------------------------------------------------|----------|-----------------|\n| zero.middleware.secure.enabled               | Enable secure middleware                          | boolean  | false           |\n| zero.middleware.secure.ignore                | Ignoring path prefix.                             | []string | []              |\n| zero.middleware.secure.xssProtection         | X-XSS-Protection header value.                    | string   | \"1; mode=block\" |\n| zero.middleware.secure.contentTypeNosniff    | X-Content-Type-Options header value.              | string   | nosniff         |\n| zero.middleware.secure.xFrameOptions         | X-Frame-Options header value.                     | string   | SAMEORIGIN      |\n| zero.middleware.secure.hstsMaxAge            | Strict-Transport-Security header value.           | int      | 0               |\n| zero.middleware.secure.hstsExcludeSubdomains | Excluding subdomains of HSTS.                     | bool     | false           |\n| zero.middleware.secure.hstsPreloadEnabled    | Enabling HSTS preload.                            | bool     | false           |\n| zero.middleware.secure.contentSecurityPolicy | Content-Security-Policy header value.             | string   | \"\"              |\n| zero.middleware.secure.cspReportOnly         | Content-Security-Policy-Report-Only header value. | bool     | false           |\n| zero.middleware.secure.referrerPolicy        | Referrer-Policy header value.                     | string   | \"\"              |\n\n#### CSRF\n| name                                | description                                                                     | type     | default value         |\n|-------------------------------------|---------------------------------------------------------------------------------|----------|-----------------------|\n| zero.middleware.csrf.enabled        | Enable csrf middleware                                                          | boolean  | false                 |\n| zero.middleware.csrf.ignore         | Ignoring path prefix.                                                           | []string | []                    |\n| zero.middleware.csrf.tokenLength    | Provide the length of the generated token.                                      | int      | 32                    |\n| zero.middleware.csrf.tokenLookup    | Provide csrf token lookup rules, please see code comments for details.          | string   | \"header:X-CSRF-Token\" |\n| zero.middleware.csrf.cookieName     | Provide name of the CSRF cookie. This cookie will store CSRF token.             | string   | _csrf                 |\n| zero.middleware.csrf.cookieDomain   | Domain of the CSRF cookie.                                                      | string   | \"\"                    |\n| zero.middleware.csrf.cookiePath     | Path of the CSRF cookie.                                                        | string   | \"\"                    |\n| zero.middleware.csrf.cookieMaxAge   | Provide max age (in seconds) of the CSRF cookie.                                | int      | 86400                 |\n| zero.middleware.csrf.cookieHttpOnly | Indicates if CSRF cookie is HTTP only.                                          | bool     | false                 |\n| zero.middleware.csrf.cookieSameSite | Indicates SameSite mode of the CSRF cookie. Options: lax, strict, none, default | string   | default               |\n\n\n### Full YAML\n```yaml\n---\n#app:\n#  name: my-app                                            # Optional, default: \"rk-app\"\n#  version: \"v1.0.0\"                                       # Optional, default: \"v0.0.0\"\n#  description: \"this is description\"                      # Optional, default: \"\"\n#  keywords: [\"rk\", \"golang\"]                              # Optional, default: []\n#  homeUrl: \"http://example.com\"                           # Optional, default: \"\"\n#  docsUrl: [\"http://example.com\"]                         # Optional, default: []\n#  maintainers: [\"rk-dev\"]                                 # Optional, default: []\n#logger:\n#  - name: my-logger                                       # Required\n#    description: \"Description of entry\"                   # Optional\n#    domain: \"*\"                                           # Optional, default: \"*\"\n#    default: false                                        # Optional, default: false, use as default logger entry\n#    zap:                                                  # Optional\n#      level: info                                         # Optional, default: info\n#      development: true                                   # Optional, default: true\n#      disableCaller: false                                # Optional, default: false\n#      disableStacktrace: true                             # Optional, default: true\n#      encoding: console                                   # Optional, default: console\n#      outputPaths: [\"stdout\"]                             # Optional, default: [stdout]\n#      errorOutputPaths: [\"stderr\"]                        # Optional, default: [stderr]\n#      encoderConfig:                                      # Optional\n#        timeKey: \"ts\"                                     # Optional, default: ts\n#        levelKey: \"level\"                                 # Optional, default: level\n#        nameKey: \"logger\"                                 # Optional, default: logger\n#        callerKey: \"caller\"                               # Optional, default: caller\n#        messageKey: \"msg\"                                 # Optional, default: msg\n#        stacktraceKey: \"stacktrace\"                       # Optional, default: stacktrace\n#        skipLineEnding: false                             # Optional, default: false\n#        lineEnding: \"\\n\"                                  # Optional, default: \\n\n#        consoleSeparator: \"\\t\"                            # Optional, default: \\t\n#      sampling:                                           # Optional, default: nil\n#        initial: 0                                        # Optional, default: 0\n#        thereafter: 0                                     # Optional, default: 0\n#      initialFields:                                      # Optional, default: empty map\n#        key: value\n#    lumberjack:                                           # Optional, default: nil\n#      filename:\n#      maxsize: 1024                                       # Optional, suggested: 1024 (MB)\n#      maxage: 7                                           # Optional, suggested: 7 (day)\n#      maxbackups: 3                                       # Optional, suggested: 3 (day)\n#      localtime: true                                     # Optional, suggested: true\n#      compress: true                                      # Optional, suggested: true\n#    loki:\n#      enabled: true                                       # Optional, default: false\n#      addr: localhost:3100                                # Optional, default: localhost:3100\n#      path: /loki/api/v1/push                             # Optional, default: /loki/api/v1/push\n#      username: \"\"                                        # Optional, default: \"\"\n#      password: \"\"                                        # Optional, default: \"\"\n#      maxBatchWaitMs: 3000                                # Optional, default: 3000\n#      maxBatchSize: 1000                                  # Optional, default: 1000\n#      insecureSkipVerify: false                           # Optional, default: false\n#      labels:                                             # Optional, default: empty map\n#        my_label_key: my_label_value\n#event:\n#  - name: my-event                                        # Required\n#    description: \"Description of entry\"                   # Optional\n#    domain: \"*\"                                           # Optional, default: \"*\"\n#    default: false                                        # Optional, default: false, use as default event entry\n#    encoding: console                                     # Optional, default: console\n#    outputPaths: [\"stdout\"]                               # Optional, default: [stdout]\n#    lumberjack:                                           # Optional, default: nil\n#      filename:\n#      maxsize: 1024                                       # Optional, suggested: 1024 (MB)\n#      maxage: 7                                           # Optional, suggested: 7 (day)\n#      maxbackups: 3                                       # Optional, suggested: 3 (day)\n#      localtime: true                                     # Optional, suggested: true\n#      compress: true                                      # Optional, suggested: true\n#    loki:\n#      enabled: true                                       # Optional, default: false\n#      addr: localhost:3100                                # Optional, default: localhost:3100\n#      path: /loki/api/v1/push                             # Optional, default: /loki/api/v1/push\n#      username: \"\"                                        # Optional, default: \"\"\n#      password: \"\"                                        # Optional, default: \"\"\n#      maxBatchWaitMs: 3000                                # Optional, default: 3000\n#      maxBatchSize: 1000                                  # Optional, default: 1000\n#      insecureSkipVerify: false                           # Optional, default: false\n#      labels:                                             # Optional, default: empty map\n#        my_label_key: my_label_value\n#cert:\n#  - name: my-cert                                         # Required\n#    description: \"Description of entry\"                   # Optional, default: \"\"\n#    domain: \"*\"                                           # Optional, default: \"*\"\n#    caPath: \"certs/ca.pem\"                                # Optional, default: \"\"\n#    certPemPath: \"certs/server-cert.pem\"                  # Optional, default: \"\"\n#    keyPemPath: \"certs/server-key.pem\"                    # Optional, default: \"\"\n#config:\n#  - name: my-config                                       # Required\n#    description: \"Description of entry\"                   # Optional, default: \"\"\n#    domain: \"*\"                                           # Optional, default: \"*\"\n#    path: \"config/config.yaml\"                            # Optional\n#    envPrefix: \"\"                                         # Optional, default: \"\"\n#    content:                                              # Optional, defualt: empty map\n#      key: value\nzero:\n  - name: greeter                                          # Required\n    port: 8080                                             # Required\n    enabled: true                                          # Required\n#    description: \"greeter server\"                         # Optional, default: \"\"\n#    certEntry: my-cert                                    # Optional, default: \"\", reference of cert entry declared above\n#    loggerEntry: my-logger                                # Optional, default: \"\", reference of cert entry declared above, STDOUT will be used if missing\n#    eventEntry: my-event                                  # Optional, default: \"\", reference of cert entry declared above, STDOUT will be used if missing\n#    sw:\n#      enabled: true                                       # Optional, default: false\n#      path: \"sw\"                                          # Optional, default: \"sw\"\n#      jsonPath: [\"\"]                                      # Optional\n#      headers: [\"sw:rk\"]                                  # Optional, default: []\n#    commonService:\n#      enabled: true                                       # Optional, default: false\n#      pathPrefix: \"\"                                      # Optional, default: \"/rk/v1/\"\n#    docs:\n#      enabled: true                                       # Optional, default: false\n#      path: \"docs\"                                        # Optional, default: \"docs\"\n#      specPath: \"\"                                        # Optional\n#      headers: [\"sw:rk\"]                                  # Optional, default: []\n#      style:                                              # Optional\n#        theme: \"light\"                                    # Optional, default: \"light\"\n#      debug: false                                        # Optional, default: false\n#    static:\n#      enabled: true                                       # Optional, default: false\n#      path: \"/static\"                                     # Optional, default: /static\n#      sourceType: local                                   # Optional, options: local, embed.FS can be used either, need to specify in code\n#      sourcePath: \".\"                                     # Optional, full path of source directory\n#    pprof:\n#      enabled: true                                       # Optional, default: false\n#      path: \"/pprof\"                                      # Optional, default: /pprof\n#    prom:\n#      enabled: true                                       # Optional, default: false\n#      path: \"\"                                            # Optional, default: \"metrics\"\n#      pusher:\n#        enabled: false                                    # Optional, default: false\n#        jobName: \"greeter-pusher\"                         # Required\n#        remoteAddress: \"localhost:9091\"                   # Required\n#        basicAuth: \"user:pass\"                            # Optional, default: \"\"\n#        intervalMs: 10000                                 # Optional, default: 1000\n#        certEntry: my-cert                                # Optional, default: \"\", reference of cert entry declared above\n#    middleware:\n#      ignore: [\"\"]                                        # Optional, default: []\n#      errorModel: google                                  # Optional, default: google, [amazon, google] are supported options\n#      logging:\n#        enabled: true                                     # Optional, default: false\n#        ignore: [\"\"]                                      # Optional, default: []\n#        loggerEncoding: \"console\"                         # Optional, default: \"console\"\n#        loggerOutputPaths: [\"logs/app.log\"]               # Optional, default: [\"stdout\"]\n#        eventEncoding: \"console\"                          # Optional, default: \"console\"\n#        eventOutputPaths: [\"logs/event.log\"]              # Optional, default: [\"stdout\"]\n#      prom:\n#        enabled: true                                     # Optional, default: false\n#        ignore: [\"\"]                                      # Optional, default: []\n#      auth:\n#        enabled: true                                     # Optional, default: false\n#        ignore: [\"\"]                                      # Optional, default: []\n#        basic:\n#          - \"user:pass\"                                   # Optional, default: []\n#        apiKey:\n#          - \"keys\"                                        # Optional, default: []\n#      meta:\n#        enabled: true                                     # Optional, default: false\n#        ignore: [\"\"]                                      # Optional, default: []\n#        prefix: \"rk\"                                      # Optional, default: \"rk\"\n#      trace:\n#        enabled: true                                     # Optional, default: false\n#        ignore: [\"\"]                                      # Optional, default: []\n#        exporter:                                         # Optional, default will create a stdout exporter\n#          file:\n#            enabled: true                                 # Optional, default: false\n#            outputPath: \"logs/trace.log\"                  # Optional, default: stdout\n#          jaeger:\n#            agent:\n#              enabled: false                              # Optional, default: false\n#              host: \"\"                                    # Optional, default: localhost\n#              port: 0                                     # Optional, default: 6831\n#            collector:\n#              enabled: true                               # Optional, default: false\n#              endpoint: \"\"                                # Optional, default: http://localhost:14268/api/traces\n#              username: \"\"                                # Optional, default: \"\"\n#              password: \"\"                                # Optional, default: \"\"\n#      rateLimit:\n#        enabled: false                                    # Optional, default: false\n#        ignore: [\"\"]                                      # Optional, default: []\n#        algorithm: \"leakyBucket\"                          # Optional, default: \"tokenBucket\"\n#        reqPerSec: 100                                    # Optional, default: 1000000\n#        paths:\n#          - path: \"/rk/v1/healthy\"                        # Optional, default: \"\"\n#            reqPerSec: 0                                  # Optional, default: 1000000\n#      jwt:\n#        enabled: true                                     # Optional, default: false\n#        ignore: [ \"\" ]                                    # Optional, default: []\n#        signerEntry: \"\"                                   # Optional, default: \"\"\n#        skipVerify: false                                 # Optional, default: false\n#        symmetric:                                        # Optional\n#          algorithm: \"\"                                   # Required, default: \"\"\n#          token: \"\"                                       # Optional, default: \"\"\n#          tokenPath: \"\"                                   # Optional, default: \"\"\n#        asymmetric:                                       # Optional\n#          algorithm: \"\"                                   # Required, default: \"\"\n#          privateKey: \"\"                                  # Optional, default: \"\"\n#          privateKeyPath: \"\"                              # Optional, default: \"\"\n#          publicKey: \"\"                                   # Optional, default: \"\"\n#          publicKeyPath: \"\"                               # Optional, default: \"\"\n#        tokenLookup: \"header:\u003cname\u003e\"                      # Optional, default: \"header:Authorization\"\n#        authScheme: \"Bearer\"                              # Optional, default: \"Bearer\"\n#      secure:\n#        enabled: true                                     # Optional, default: false\n#        ignore: [\"\"]                                      # Optional, default: []\n#        xssProtection: \"\"                                 # Optional, default: \"1; mode=block\"\n#        contentTypeNosniff: \"\"                            # Optional, default: nosniff\n#        xFrameOptions: \"\"                                 # Optional, default: SAMEORIGIN\n#        hstsMaxAge: 0                                     # Optional, default: 0\n#        hstsExcludeSubdomains: false                      # Optional, default: false\n#        hstsPreloadEnabled: false                         # Optional, default: false\n#        contentSecurityPolicy: \"\"                         # Optional, default: \"\"\n#        cspReportOnly: false                              # Optional, default: false\n#        referrerPolicy: \"\"                                # Optional, default: \"\"\n#      csrf:\n#        enabled: true                                     # Optional, default: false\n#        ignore: [\"\"]                                      # Optional, default: []\n#        tokenLength: 32                                   # Optional, default: 32\n#        tokenLookup: \"header:X-CSRF-Token\"                # Optional, default: \"header:X-CSRF-Token\"\n#        cookieName: \"_csrf\"                               # Optional, default: _csrf\n#        cookieDomain: \"\"                                  # Optional, default: \"\"\n#        cookiePath: \"\"                                    # Optional, default: \"\"\n#        cookieMaxAge: 86400                               # Optional, default: 86400\n#        cookieHttpOnly: false                             # Optional, default: false\n#        cookieSameSite: \"default\"                         # Optional, default: \"default\", options: lax, strict, none, default\n#      cors:\n#        enabled: true                                     # Optional, default: false\n#        ignore: [\"\"]                                      # Optional, default: []\n#        allowOrigins:                                     # Optional, default: []\n#          - \"http://localhost:*\"                          # Optional, default: *\n#        allowCredentials: false                           # Optional, default: false\n#        allowHeaders: []                                  # Optional, default: []\n#        allowMethods: []                                  # Optional, default: []\n#        exposeHeaders: []                                 # Optional, default: []\n#        maxAge: 0                                         # Optional, default: 0\n```\n\n## Notice of V2\nMaster branch of this package is under upgrade which will be released to v2.x.x soon.\n\nMajor changes listed bellow. This will be updated with every commit.\n\n| Last version | New version | Changes                                                                                                            |\n|--------------|-------------|--------------------------------------------------------------------------------------------------------------------|\n| v0.0.11      | v2          | TV is not supported because of LICENSE issue, new TV web UI will be released soon                                  |\n| v0.0.11      | v2          | Remote repositry of ConfigEntry and CertEntry removed                                                              |\n| v0.0.11      | v2          | Swagger json file and boot.yaml file could be embed into embed.FS and pass to rkentry                              |\n| v0.0.11      | v2          | ZapLoggerEntry -\u003e LoggerEntry                                                                                      |\n| v0.0.11      | v2          | EventLoggerEntry -\u003e EventEntry                                                                                     |\n| v0.0.11      | v2          | LoggerEntry can be used as zap.Logger since all functions are inherited                                            |\n| v0.0.11      | v2          | PromEntry can be used as prometheus.Registry since all functions are inherited                                     |\n| v0.0.11      | v2          | rk-common dependency was removed                                                                                   |\n| v0.0.11      | v2          | Entries are organized by EntryType instead of EntryName, so user can have same entry name with different EntryType |\n| v0.0.11      | v2          | zero.middlewares -\u003e gin.middleware in boot.yaml                                                                    |\n| v0.0.11      | v2          | zero.middlewares.loggingZap -\u003e zero.middleware.logging in boot.yaml                                                |\n| v0.0.11      | v2          | zero.middlewares.metricsProm -\u003e zero.middleware.prom in boot.yaml                                                  |\n| v0.0.11      | v2          | zero.middlewares.tracingTelemetry -\u003e zero.middleware.trace in boot.yaml                                            |\n| v0.0.11      | v2          | All middlewares are now support zero.middleware.xxx.ignorePrefix options in boot.yaml                              |\n| v0.0.11      | v2          | Middlewares support zero.middleware.ignorePrefix in boot.yaml as global scope                                      |\n| v0.0.11      | v2          | LoggerEntry, EventEntry, ConfigEntry, CertEntry now support locale to distinguish in differerent environment       |\n| v0.0.11      | v2          | LoggerEntry, EventEntry, CertEntry can be referenced to gin entry in boot.yaml                                     |\n| v0.0.11      | v2          | Healthy API was replaced by Ready and Alive which also provides validation func from user                          |\n| v0.0.11      | v2          | DocsEntry was added into rk-entry                                                                                  |\n| v0.0.11      | v2          | rk-entry support utility functions of embed.FS                                                                     |\n| v0.0.11      | v2          | rk-entry bumped up to v2                                                                                           |\n\n## Development Status: Stable\n\n## Build instruction\nSimply run make all to validate your changes. Or run codes in example/ folder.\n\n- make all\n\nRun unit-test, golangci-lint, doctoc and gofmt.\n\n## Test instruction\nRun unit test with **make test** command.\n\nGithub workflow will automatically run unit test and golangci-lint for testing and lint validation.\n\n## Contributing\nWe encourage and support an active, healthy community of contributors \u0026mdash;\nincluding you! Details are in the [contribution guide](CONTRIBUTING.md) and\nthe [code of conduct](CODE_OF_CONDUCT.md). The rk maintainers keep an eye on\nissues and pull requests, but you can also report any negative conduct to\nlark@rkdev.info.\n\nReleased under the [Apache 2.0 License](LICENSE).\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frookie-ninja%2Frk-zero","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frookie-ninja%2Frk-zero","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frookie-ninja%2Frk-zero/lists"}