当前位置:网站首页>Goframe framework: graceful closing process
Goframe framework: graceful closing process
2022-06-23 17:47:00 【Trespass 】
Introduce
Through a complete example , Describes how to close gracefully gogf/gf Microservices .
What is graceful closure ?
When the process receives a shutdown signal , We need to turn off the logic running in the background , such as ,MySQL Connection and so on .
We will use rk-boot To start up gogf/gf Microservices .
rk-boot It's a pass through YAML Start multiple Web Service framework . Please refer to the last chapter of this article , understand rk-boot details .
Please visit the following address for a complete tutorial :https://rkdocs.netlify.app/cn
install
go get github.com/rookie-ninja/rk-boot/gf
Quick start
1. establish boot.yaml
boot.yaml The file will tell rk-boot How to start gogf/gf service .
---
gf:
- name: greeter
port: 8080
enabled: true2. establish main.go
adopt AddShutdownHookFunc() To add shutdownhook function .
You need to add : import _ "github.com/rookie-ninja/rk-boot/gf"
otherwise rk-boot Can't read boot.yaml The contents of the document .
// Copyright (c) 2021 rookie-ninja
//
// Use of this source code is governed by an Apache-style
// license that can be found in the LICENSE file.
package main
import (
"context"
"fmt"
"github.com/rookie-ninja/rk-boot"
_ "github.com/rookie-ninja/rk-boot/gf"
)
func main() {
// Create a new boot instance.
boot := rkboot.NewBoot()
boot.AddShutdownHookFunc("shutdown-hook", func() {
fmt.Println("shutting down")
})
// Bootstrap
boot.Bootstrap(context.Background())
// Wait for shutdown sig
boot.WaitForShutdownSig(context.Background())
}3. start-up main.go
$ go run main.go
2022-01-05T18:24:36.293+0800 INFO boot/gf_entry.go:1050 Bootstrap gfEntry {"eventId": "fabd662e-801c-4c8b-b596-f55001a66d62", "entryName": "greeter"}
------------------------------------------------------------------------
endTime=2022-01-05T18:24:36.293501+08:00
startTime=2022-01-05T18:24:36.293309+08:00
elapsedNano=191536
timezone=CST
ids={"eventId":"fabd662e-801c-4c8b-b596-f55001a66d62"}
app={"appName":"rk","appVersion":"","entryName":"greeter","entryType":"GfEntry"}
env={"arch":"amd64","az":"*","domain":"*","hostname":"lark.local","localIP":"10.8.0.2","os":"darwin","realm":"*","region":"*"}
payloads={"gfPort":8080}
error={}
counters={}
pairs={}
timing={}
remoteAddr=localhost
operation=Bootstrap
resCode=OK
eventStatus=Ended
EOE4.ctrl-c
adopt ctrl-c Shut down the program , We will see the following information printed .
shutting down
2022-01-05T18:24:39.674+0800 INFO boot/gf_entry.go:1050 Interrupt gfEntry {"eventId": "f400e32e-6b99-4733-8ec3-1fe186fe8abe", "entryName": "greeter"}
------------------------------------------------------------------------
endTime=2022-01-05T18:24:39.674817+08:00
startTime=2022-01-05T18:24:39.674688+08:00
elapsedNano=128645
timezone=CST
ids={"eventId":"f400e32e-6b99-4733-8ec3-1fe186fe8abe"}
app={"appName":"rk","appVersion":"","entryName":"greeter","entryType":"GfEntry"}
env={"arch":"amd64","az":"*","domain":"*","hostname":"lark.local","localIP":"10.8.0.2","os":"darwin","realm":"*","region":"*"}
payloads={"gfPort":8080}
error={}
counters={}
pairs={}
timing={}
remoteAddr=localhost
operation=Interrupt
resCode=OK
eventStatus=Ended
EOErk-boot Introduce
rk-boot It's a pass through YAML Start multiple Web Service framework .
It's kind of like Spring boot. Through integration rk-xxx Series Library , Can start a variety of Web frame . Of course , Users can also customize rk-xxx The library is integrated into rk-boot in .
rk-boot Bright spot
Through the same format YAML file , Start different Web frame .
such as , We can use the following documents , Start simultaneously in one process gRPC, Gin, Echo, GoFrame frame . Unify the micro service layout within the team .
- Dependent installation
go get github.com/rookie-ninja/rk-boot/grpc go get github.com/rookie-ninja/rk-boot/gin go get github.com/rookie-ninja/rk-boot/echo go get github.com/rookie-ninja/rk-boot/gf
- boot.yaml
---
grpc:
- name: grpc-server
port: 8080
enabled: true
commonService:
enabled: true
gin:
- name: gin-server
port: 8081
enabled: true
commonService:
enabled: true
echo:
- name: echo-server
port: 8082
enabled: true
commonService:
enabled: true
gf:
- name: gf-server
port: 8083
enabled: true
commonService:
enabled: true- 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-boot"
_ "github.com/rookie-ninja/rk-boot/echo"
_ "github.com/rookie-ninja/rk-boot/gf"
_ "github.com/rookie-ninja/rk-boot/gin"
_ "github.com/rookie-ninja/rk-boot/grpc"
)
// Application entrance.
func main() {
// Create a new boot instance.
boot := rkboot.NewBoot()
// Bootstrap
boot.Bootstrap(context.Background())
// Wait for shutdown sig
boot.WaitForShutdownSig(context.Background())
}- verification
# gRPC throuth grpc-gateway
$ curl localhost:8080/rk/v1/healthy
{"healthy":true}
# Gin
$ curl localhost:8081/rk/v1/healthy
{"healthy":true}
# Echo
$ curl localhost:8082/rk/v1/healthy
{"healthy":true}
# GoFrame
$ curl localhost:8083/rk/v1/healthy
{"healthy":true}rk-boot Supported by Web frame
Welcome to contribute new Web Frame to rk-boot In the series .
Reference resources docs & rk-gin As an example .
frame | Development status | install | rely on |
|---|---|---|---|
Stable | go get github.com/rookie-ninja/rk-boot/gin | ||
Stable | go get github.com/rookie-ninja/rk-boot/grpc | ||
Stable | go get github.com/rookie-ninja/rk-boot/echo | ||
Stable | go get github.com/rookie-ninja/rk-boot/gf | ||
Testing | go get github.com/rookie-ninja/rk-boot/fiber | ||
Testing | go get github.com/rookie-ninja/rk-boot/zero | ||
Testing | go get github.com/rookie-ninja/rk-boot/mux |
rk-gf Introduce
rk-gf Used by YAML start-up gogf/gf Web service .
Supported features
according to YAML The file initializes the following example , If it's external , Keep the original usage .
example | Introduce |
|---|---|
ghttp.Server | Native gogf/gf |
Config | Native spf13/viper Parameter instance |
Logger | Native uber-go/zap Log instance |
EventLogger | Used to record RPC Request log , Use rk-query |
Credential | For remote services , for example ETCD Pull Credential |
Cert | From remote service (ETCD wait ) In order to get TLS/SSL certificate , And start the SSL/TLS |
Prometheus | start-up Prometheus client , And push it to pushgateway |
Swagger | Local boot Swagger UI |
CommonService | Exposure general API |
TV | TV Webpage , Show the basic information of microservices |
StaticFileHandler | start-up Web Form of static file download service , Background storage supports local file systems and pkger. |
Supported middleware
rk-gf Will be based on YAML File initialization middleware .
Middleware | Description |
|---|---|
Metrics | collect RPC Metrics, And start the prometheus |
Log | Use rk-query Record each RPC journal |
Trace | collect RPC Call chain , And send data to stdout, Local files or jaeger open-telemetry/opentelemetry-go. |
Panic | Recover from panic for RPC requests and log it. |
Meta | Collect service meta information , Add to return Header in |
Auth | Support Basic Auth & API Key Verification middleware |
RateLimit | RPC Speed limiting middleware |
Timeout | RPC Timeout |
CORS | CORS middleware |
JWT | JWT verification |
Secure | Server side security middleware |
CSRF | CSRF middleware |
GoFrame complete YAML To configure
---
#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
#eventLogger:
# - name: event-logger # Required
# description: "Description of entry" # Optional
#cred:
# - name: "local-cred" # Required
# provider: "localFs" # Required, etcd, consul, localFs, remoteFs are supported options
# description: "Description of entry" # Optional
# locale: "*::*::*::*" # Optional, default: *::*::*::*
# paths: # Optional
# - "example/boot/full/cred.yaml"
#cert:
# - name: "local-cert" # Required
# provider: "localFs" # Required, etcd, consul, localFs, remoteFs are supported options
# description: "Description of entry" # Optional
# locale: "*::*::*::*" # Optional, default: *::*::*::*
# serverCertPath: "example/boot/full/server.pem" # Optional, default: "", path of certificate on local FS
# serverKeyPath: "example/boot/full/server-key.pem" # Optional, default: "", path of certificate on local FS
# clientCertPath: "example/client.pem" # Optional, default: "", path of certificate on local FS
# clientKeyPath: "example/client.pem" # Optional, default: "", path of certificate on local FS
#config:
# - name: rk-main # Required
# path: "example/boot/full/config.yaml" # Required
# locale: "*::*::*::*" # Required, default: *::*::*::*
# description: "Description of entry" # Optional
gf:
- name: greeter # Required
port: 8080 # Required
enabled: true # Required
# description: "greeter server" # Optional, default: ""
# cert:
# ref: "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:
# ref: zap-logger # Optional, default: logger of STDOUT, reference of logger entry declared above
# eventLogger:
# ref: event-logger # Optional, default: logger of STDOUT, reference of logger entry declared above
# interceptors:
# loggingZap:
# enabled: true # Optional, default: false
# zapLoggerEncoding: "json" # Optional, default: "console"
# zapLoggerOutputPaths: ["logs/app.log"] # Optional, default: ["stdout"]
# eventLoggerEncoding: "json" # Optional, default: "console"
# eventLoggerOutputPaths: ["logs/event.log"] # Optional, default: ["stdout"]
# metricsProm:
# enabled: true # Optional, default: false
# auth:
# enabled: true # Optional, default: false
# basic:
# - "user:pass" # Optional, default: []
# ignorePrefix:
# - "/rk/v1" # Optional, default: []
# apiKey:
# - "keys" # Optional, default: []
# meta:
# enabled: true # Optional, default: false
# prefix: "rk" # Optional, default: "rk"
# tracingTelemetry:
# enabled: true # Optional, default: false
# exporter: # Optional, default will create a stdout exporter
# file:
# enabled: true # Optional, default: false
# outputPath: "logs/trace.log" # Optional, default: stdout
# jaeger:
# agent:
# enabled: false # Optional, default: false
# host: "" # Optional, default: localhost
# port: 0 # Optional, default: 6831
# collector:
# enabled: true # Optional, default: false
# endpoint: "" # Optional, default: http://localhost:14268/api/traces
# username: "" # Optional, default: ""
# password: "" # Optional, default: ""
# rateLimit:
# enabled: false # Optional, default: false
# algorithm: "leakyBucket" # Optional, default: "tokenBucket"
# reqPerSec: 100 # Optional, default: 1000000
# paths:
# - path: "/rk/v1/healthy" # Optional, default: ""
# reqPerSec: 0 # Optional, default: 1000000
# jwt:
# enabled: true # Optional, default: false
# signingKey: "my-secret" # Required
# ignorePrefix: # Optional, default: []
# - "/rk/v1/tv"
# - "/sw"
# - "/rk/v1/assets"
# signingKeys: # Optional
# - "key:value"
# signingAlgo: "" # Optional, default: "HS256"
# tokenLookup: "header:<name>" # Optional, default: "header:Authorization"
# authScheme: "Bearer" # Optional, default: "Bearer"
# secure:
# enabled: true # Optional, default: false
# xssProtection: "" # Optional, default: "1; mode=block"
# contentTypeNosniff: "" # Optional, default: nosniff
# xFrameOptions: "" # Optional, default: SAMEORIGIN
# hstsMaxAge: 0 # Optional, default: 0
# hstsExcludeSubdomains: false # Optional, default: false
# hstsPreloadEnabled: false # Optional, default: false
# contentSecurityPolicy: "" # Optional, default: ""
# cspReportOnly: false # Optional, default: false
# referrerPolicy: "" # Optional, default: ""
# ignorePrefix: [] # Optional, default: []
# csrf:
# enabled: true
# tokenLength: 32 # Optional, default: 32
# tokenLookup: "header:X-CSRF-Token" # Optional, default: "header:X-CSRF-Token"
# cookieName: "_csrf" # Optional, default: _csrf
# cookieDomain: "" # Optional, default: ""
# cookiePath: "" # Optional, default: ""
# cookieMaxAge: 86400 # Optional, default: 86400
# cookieHttpOnly: false # Optional, default: false
# cookieSameSite: "default" # Optional, default: "default", options: lax, strict, none, default
# ignorePrefix: [] # Optional, default: []边栏推荐
- How code 39 check bits are calculated
- 解答02:Smith圓為什麼能“上感下容 左串右並”?
- First use of kubernetes cronjob
- 【网络通信 -- WebRTC】WebRTC 源码分析 -- PacingController 相关知识点补充
- Analysis of object class structure in Nanny level teaching (common class) [source code attached]
- Is it cost-effective to buy a long-term financial product?
- History of storage technology: from tape to hardware liquefaction
- Li Kou daily question - day 25 -495 Timo attack
- What is the mobile account opening process? Is it safe to open an account online now?
- How to open an account through online stock? Is online account opening safe?
猜你喜欢

The official Chinese course of zero foundation introduction jetpack compose is coming

How to use SQL window functions

Ctfshow PHP features
![QT layout manager [qvboxlayout, qhboxlayout, qgridlayout]](/img/62/a0425a325f123ba91a7a69cf854d2c.png)
QT layout manager [qvboxlayout, qhboxlayout, qgridlayout]

C # connection to database

MySQL transaction and its characteristics and locking mechanism

hands-on-data-analysis 第二单元 第四节数据可视化

EasyPlayer移动端播放webrtc协议时长按播放页面无法关闭“关于我们”页面

内网渗透令牌窃取

Online communication - the combination of machine learning and knowledge reasoning in trusted machine learning (Qing Yuan talk, issue 20, Li Bo)
随机推荐
JS reset form
Tupu digital twin 3D wind farm, offshore wind power of smart wind power
Hapoxy-集群服务搭建
EasyPlayer移动端播放webrtc协议时长按播放页面无法关闭“关于我们”页面
Li Kou daily question - day 25 -495 Timo attack
Huawei mobile phones install APK through ADB and prompt "the signature is inconsistent. The application may have been modified."
Intel arc A380 graphics card message summary: the entry-level price products of running point and bright driving need to be optimized
Here comes the official zero foundation introduction jetpack compose Chinese course!
Drawing black technology - easy to build a "real twin" 2D scene
What is the problem with TS File Error 404 when easynvr plays HLS protocol?
[go] calling Alipay to scan code for payment in a sandbox environment
How to configure MySQL log management
MySQL transaction and its characteristics and locking mechanism
The Google play academy team PK competition is in full swing!
How to create a three elimination game
Read the typical application circuit of microphone
记录——kubeadm集群node节点加入
Answer 03: why can Smith circle "allow left string and right parallel"?
mysql-选择使用Repeatable read的原因
C. Add One--Divide by Zero 2021 and Codeforces Round #714 (Div. 2)