Dark Mode

Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

ssgo/s

Repository files navigation

GoDe Yi Ge Fu Wu Kuang Jia

ssgoNeng Yi Fei Chang Jian Dan De Fang Shi Kuai Su Bu Shu Cheng Wei Wei Fu Wu Qun

Kai Shi Shi Yong

Ru Guo Nin De Dian Nao go version >= 1.11,Shi Yong Yi Xia Ming Ling Chu Shi Hua Yi Lai Zi Ding Yi sshow:

go mod init sshow
go mod tidy

1, Xia Zai Bing An Zhuang s

go get -u github.com/ssgo/s

2, Zai Xiang Mu Dai Ma Zhong Dao Ru Ta

import "github.com/ssgo/s"

Kuai Su Gou Jian Yi Ge Fu Wu

start.go:

package main

import "github.com/ssgo/s"

func main() {
s.Restful(0, "GET", "/hello", func() string{
return "Hello ssgo\n"
})
s.Start()
}

Ji Ke Kuai Su Gou Jian Chu Yi Ge 8080Duan Kou Ke Fang Wen De Fu Wu :

export service_listen=:8080
export service_httpversion=1
go run start.go

windowsXia Shi Yong :

set service_listen=:8080
set service_httpversion=1
go run start.go

Huan Jing Bian Liang She Zhi Bu Qu Fen Da Xiao Xie

Fu Wu Mo Ren Shi Yong Sui Ji Duan Kou Qi Dong ,Ruo Yao Zhi Ding Duan Kou Ke She Zhi Huan Jing Bian Liang ,Huo start.goMu Lu Xia Pei Zhi Wen Jian service.json

{
"listen":":8081"
}

Kai Fa Shi Ke Yi Shi Yong Pei Zhi Wen Jian

Bu Shu Tui Jian Shi Yong Rong Qi Ji Zhu She Zhi Huan Jing Bian Liang

redis

Kuang Jia Fu Wu Fa Xian Ji Zhi Ji Yu redisShi Xian ,Suo Yi Shi Yong discoverZhi Qian ,Xian Yao Zhun Bei Yi Ge redisFu Wu

Mo Ren Shi Yong 127.0.0.1:6379,dbMo Ren Wei 15,Mi Ma Mo Ren Wei Kong ,Ye Ke Yi Zai Xiang Mu Gen Mu Lu Zi Ding Yi Pei Zhi redis.json

Ru Guo Nin De redisDe Mi Ma Ru Guo Bu Wei Kong ,Xu Yao Shi Yong AESJia Mi Hou Jiang Mi Wen Fang Zai Pei Zhi Wen Jian passwordZi Duan Shang ,Bao Zhang Mi Ma Bu Xie Lu

Mi Ma Shi Yong AESJia Mi

Shi Yong github.com/ssgo/toolZhong De sskeyLai Sheng Cheng Mi Ma :

cd ssgo/tool/sskey
# Ru Guo Yi Qian Mei You Bian Yi Guo
go build sskey.go
# Chuang Jian Bing Bao Cun Mi Yao
sskey -c sshow
# Shu Ru Yuan Shi Mi Ma
sskey -e sshow

De Dao AESJia Mi Hou De Mi Ma Fang Ru discover.jsonZhong

{
"registry":"127.0.0.1:6379:1:upvNALgTxwS/xUp2Cie4tg=="
}

Ye Ke Yi Tong Guo Huan Jing Bian Liang Lai She Zhi :

export DISCOVER_REGISTRY="127.0.0.1:6379:1:upvNALgTxwS/xUp2Cie4tg=="

windowsXia :

set discover_registry="127.0.0.1:6379:1:upvNALgTxwS/xUp2Cie4tg=="

discover_registryDe She Zhi Dai Biao :

redisZhu Ji :Duan Kou Hao :Shu Ju Ku :resJia Mi Hou De Mi Ma

Fu Wu Fa Xian

Service

package main

import "github.com/ssgo/s"

func getFullName(in struct{ Name string }) (out struct{ FullName string }) {
out.FullName = in.Name + " Lee"
return
}

func main() {
s.Register(1, "/{name}/fullName", getFullName)
s.Start()
}
export discover_app=s1
export service_accesstokens='{"s1token":1}'
go run service.go

windowsXia Shi Yong :

set discover_app=s1
set service_accesstokens={"s1token":1}
go run service.go

RegisterDi Yi Ge Can Shu Zhi Wei 1Biao Shi Gai Fu Wu Gong Zuo Zai Ren Zheng Ji Bie 1Shang ,Pai Fa Liao Yi Ge Ling Pai "s1token",Bu Dai Gai Ling Pai De Qing Qiu Jiang Bei Ju Jue

s.Start()Jiang Hui Gong Zuo Zai HTTP/2.0 No SSL Xie Yi Shang (Fu Wu Jian Tong Xun Mo Ren Du Shi Yong HTTP/2.0 No SSL Xie Yi )

Bing Qie Zi Dong Lian Jie Ben Ji Mo Ren De redisFu Wu ,Bing Zhu Ce Yi Ge Jiao s1 De Fu Wu (Ru Xu Shi Yong Qi Ta Ke Yi Can Kao redisDe Pei Zhi )

Ke Yun Xing Duo Ge Shi Li ,Diao Yong Fang Fang Wen Shi Jiang Hui Zi Dong Fu Zai Jun Heng Dao Mou Yi Ge Jie Dian

Controller

package main

import (
"github.com/ssgo/s"
"github.com/ssgo/discover"
)

func getInfo(in struct{ Name string }, c *discover.Caller) (out struct{ FullName string }) {
c.Get("s1", "/"+in.Name+"/fullName", nil).To(&out)
return
}

func main() {
s.Register(0, "/{name}", getInfo)
s.Start()
}
export discover_app=g1
export service_httpversion=1
export service_listen=:8091
export discover_calls='{"s1":"s1token"}'
go run controller.go &

windowsXia Shi Yong :

set discover_app=g1
set service_httpversion=1
set service_listen=:8091
set discover_calls={"s1":"s1token"}
go run controller.go

Gai Fu Wu Gong Zuo Zai Ren Zheng Ji Bie 0Shang ,Gong Zuo Zai HTTP/1.1 Xie Yi Shang ,Ke Yi Zhi Jie Fang Wen

getInfo Fang Fa Zhong Diao Yong s1 Shi Hui Gen Ju redis Zhong Zhu Ce De Jie Dian Xin Xi Fu Zai Jun Heng Dao Mou Yi Ge Jie Dian

Suo You Diao Yong s1 Fu Wu De Qing Qiu Du Hui Zi Dong Dai Shang "sltoken" Zhe Ge Ling Pai Yi Huo De Xiang Ying Deng Ji De Fang Wen Quan Xian

Kuang Jia Chang Yong Fang Fa

// Zhu Ce Fu Wu
func Register(authLevel uint, name string, serviceFunc any) {}

// Zhu Ce Yi Zheng Ze Pi Pei De Fu Wu
func RegisterByRegex(name string, service any){}

// She Zhi Qian Zhi Guo Lu Qi
func SetInFilter(filter func(in *map[string]any, request *http.Request, response *http.ResponseWriter) (out any)) {}

// She Zhi Hou Zhi Guo Lu Qi
func SetOutFilter(filter func(in *map[string]any, request *http.Request, response *http.ResponseWriter, out any) (newOut any, isOver bool)) {}

// Zhu Ce Shen Fen Ren Zheng Mo Kuai
func SetAuthChecker(authChecker func(authLevel uint, url *string, request *map[string]any) bool) {}

// She Zhi panicCuo Wu Chu Li Fang Fa
func SetErrorHandle(myErrorHandle func(err any, request *http.Request, response *http.ResponseWriter) any)


// Mo Ren Qi Dong HTTP/2.0Fu Wu (Ruo Wei Pei Zhi Zheng Shu Jiang Gong Zuo Zai No SSLMo Shi )
// Ru Guo She Zhi Liao httpVersion=1Ze Qi Dong HTTP/1.1Fu Wu
func Start() {}

// Mo Ren Yi Bu Fang Shi Qi Dong HTTP/2.0Fu Wu ()
// Ru Guo She Zhi Liao httpVersion=1Ze Qi Dong HTTP/1.1Fu Wu
func AsyncStart() *AsyncServer {}

// Ting Zhi Yi Yi Bu Fang Shi Qi Dong De Fu Wu Hou Deng Dai Ge Chong Zi Xian Cheng Jie Shu
func (as *AsyncServer) Stop() {}

// Diao Yong Yi Bu Fang Shi Qi Dong De Fu Wu
func (as *AsyncServer) Get(path string, headers ... string) *Result {}
func (as *AsyncServer) Post(path string, data any, headers ... string) *Result {}
func (as *AsyncServer) Put(path string, data any, headers ... string) *Result {}
func (as *AsyncServer) Head(path string, data any, headers ... string) *Result {}
func (as *AsyncServer) Delete(path string, data any, headers ... string) *Result {}
func (as *AsyncServer) Do(path string, data any, headers ... string) *Result {}

Ji Ben Shi Yong

RestfulShi Yong GET, POST, PUT, HEAD, DELETEHe OPTIONS

package main

import (
"github.com/ssgo/s"
"net/http"
"os"
)

type actionIn struct {
Aaa int
Bbb string
Ccc string
}

func restAct(req *http.Request, in actionIn) actionIn {
return in
}
func showFullName(in struct{ Name string }) (out struct{ FullName string }) {
out.FullName = in.Name + " Lee."
return
}
func main() {
//http://127.0.0.1:8301/api/echo?aaa=1&bbb=2&ccc=3
s.Restful(0, "GET", "/api/echo", restAct)
s.Restful(0, "POST", "/api/echo", restAct)
s.Restful(0, "PUT", "/api/echo", restAct)
//HEADHe GETBen Zhi Yi Yang ,Qu Bie Zai Yu HEADBu Han Cheng Xian Shu Ju ,Jin Jin Shi HTTPTou Xin Xi
s.Restful(0, "HEAD", "/api/echo", restAct)
s.Restful(0, "DELETE", "/api/echo", restAct)
s.Restful(0, "OPTIONS", "/api/echo", restAct)
//Chuan Can
//http://127.0.0.1:8301/full_name/david
s.Restful(0, "GET", "/full_name/{name}", showFullName)
//Fang Wen She Zhi header content-type:application/json params:{"name":"jim"}
s.Restful(0, "PUT", "/full_name", showFullName)
s.Start()
}
Huan Jing Bian Liang Zhi
service_listen :8301
service_httpVersion 1

Qing Qiu Li Zi

POST http://127.0.0.1:8301/api/echo HTTP/1.1
Content-Type: application/x-www-form-urlencoded

aaa=12&bbb=hello&ccc=world
PUT http://127.0.0.1:8301/api/echo HTTP/1.1
Content-Type: application/json

{
"aaa": 12,
"bbb": "hello",
"ccc": "world"
}

https

Pei Zhi httpsFu Wu Xu Yao Zai Yuan Lai Pei Zhi Ji Chu Shang Zeng Jia Liang Ge Huan Jing Bian Liang

export service_certfile="your cert file path"
export service_keyfile="your key file path"

windowsXia :

set service_certfile=D:/server/ssl/your.pem
set service_keyfile=D:/server/ssl/your.key

Dui Yu Shang Mian De restfulShi Li ,Ru Guo She Zhi Wei httpsFu Wu :

Qing Qiu Li Zi

POST https://127.0.0.1:8301/api/echo HTTP/1.1
Content-Type: application/x-www-form-urlencoded

aaa=12&bbb=hello&ccc=world

Qing Qiu Tou He Xiang Ying Tou

package main

import (
"github.com/ssgo/s"
"net/http"
"os"
)

func headerTest(request *http.Request, response http.ResponseWriter) (token string) {
token = "Get header token:" + request.Header.Get("token")
response.Header().Set("resToken", "Hello world")
return
}

//Shu Ru Can Shu Fang Zai Qian Fang Zai Hou Du Ke Yi
func label(in struct{ Enter string },
request *http.Request, response http.ResponseWriter) (out struct{ Label string}) {
prefix := request.Header.Get("prefix")
out.Label = prefix + in.Enter
response.Header().Set("accept", "application/json")
return
}

func main() {
//header
s.Restful(0, "GET", "/header_test", headerTest)
s.Restful(0, "POST", "/label", label)
s.Start() ////She Zhi service_httpVersion=1
}

She Zhi Xiang Ying Zhuang Tai Ma

Shi Yong goBiao Zhun Ku Zi Dai De response

s.Register(1, "/ssdesign", func(response http.ResponseWriter) string {
response.WriteHeader(504)
return "controller timeout"
})

Wen Jian Shang Chuan

Wen Jian Shang Chuan Shi Yong Biao Zhun Bao Zi Dai Gong Neng

// Chu Li /upload Luo Ji
func upload(w http.ResponseWriter, r *http.Request) {
r.ParseMultipartForm(32 << 20)
file, handler, err := r.FormFile("uploadfile")
if err != nil {
fmt.Println(err)
return
}
defer file.Close()
fmt.Fprintf(w, "%v", handler.Header)
f, err := os.OpenFile("./upload/"+handler.Filename, os.O_WRONLY|os.O_CREATE, 0666)
if err != nil {
fmt.Println(err)
return
}
defer f.Close()
io.Copy(f, file)

}

Guo Lu Qi Yu Shen Fen Ren Zheng

Zhi Xing Xian Hou Shun Xu Wei :Qian Zhi Guo Lu Qi , Shen Fen Ren Zheng , Hou Zhi Guo Lu Qi

package main

import (
"github.com/ssgo/s"
"net/http"
"os"
)

type actionFilter struct {
Aaa int
Bbb string
Ccc string
Filter1 string
Filter2 int
}

func authTest(in actionFilter) actionFilter {
return in
}

func main() {
s.Restful(0, "GET", "/auth_test", authTest)
s.Restful(1, "POST", "/auth_test", authTest)
s.Restful(2, "PUT", "/auth_test", authTest)
//Qian Zhi Guo Lu Qi
s.SetInFilter(func(in *map[string]any, request *http.Request, response *http.ResponseWriter) any {
(*in)["Filter1"] = "see"
(*in)["filter2"] = 100
(*response).Header().Set("content-type", "application/json")
return nil
})
//Shen Fen Ren Zheng
s.SetAuthChecker(func(authLevel uint, url *string, in *map[string]any, request *http.Request) bool {
token := request.Header.Get("Token")
switch authLevel {
case 1:
return token == "dev" || token == "develop"
case 2:
return token == "dev"
}
return false
})
//Hou Zhi Guo Lu Qi
s.SetOutFilter(func(in *map[string]any, request *http.Request, response *http.ResponseWriter, result any) (any, bool) {
data := result.(actionFilter)
data.Filter2 = data.Filter2 + 100
return data, false
})

s.Start() ////She Zhi service_httpVersion=1
}

SetAuthCheckerFang Fa return falseShi ,Qing Qiu Hui Fan Hui 403Zhuang Tai Ma ,Jin Zhi Fang Wen

Rewrite

Shi Xian Dui urlDe Zhong Xie

func main() {
s.Register(0, "/show", func(in struct{ S1, S2 string }) string {
return in.S1 + " " + in.S2
})
s.Register(0, "/show/{s1}", func(in struct{ S1, S2 string }) string {
return in.S1 + " " + in.S2
})
s.Rewrite("/r1", "/show")
//get http://127.0.0.1:8305/r2/123?s2=456 --> http://127.0.0.1:8305/r2/123?s2=456
s.Rewrite("/r2/(\\w+?)\\?.*?", "/show/$1")
//post http://127.0.0.1:8305/r3?name=123 s2=456
s.Rewrite("/r3\\?name=(\\w+)", "/show/$1")
s.Start() //She Zhi service_httpVersion=1
}

Yi Bu Fu Wu

Qi Dong Yi Bu Fu Wu Yu Yi Bu Fu Wu De Diao Yong :

package main

import (
"fmt"
"github.com/ssgo/s"
"net/http"
"os"
)

type actIn struct {
Aaa int
Bbb string
Ccc string
}

func act(req *http.Request, in actIn) actIn {
return in
}

func main() {
s.ResetAllSets()
//http://127.0.0.1:8301/api/echo?aaa=1&bbb=2&ccc=3
s.Restful(0, "GET", "/act/echo", act)
s.Restful(1, "POST", "/act/echo", act)
//s.Restful(2, "PUT", "/act/echo", act)
as := s.AsyncStart()
defer as.Stop()

asyncPost := as.Post("/act/echo?aaa=hello&bbb=hi", s.Map{
"ccc": "welcome",
}, "Cid", "demo-post").Map()
asyncPut := as.Put("/act/echo", s.Map{
"aaa": "hello",
"bbb": "hi",
"ccc": "welcome",
}, "Cid", "demo-put").Map()
asyncGet := as.Get("/act/echo?aaa=11&bbb=222&ccc=333").Map()
fmt.Println("asyncPut:", asyncPut)
fmt.Println("asyncPost:", asyncPost)
fmt.Println("asyncGet", asyncGet)
}

proxy

Jiang Fu Wu Dai Li Wei Zi Ding Yi Fu Wu ,Zhi Chi Zheng Ze Biao Da Shi

func main() {
s.Register(1, "/serv/provide", func() (out struct{ Name string }) {
out.Name = "server here"
return
})
//Diao Yong Zhu Ce De Fu Wu
s.Register(2, "/serv/gate_get", func(c *discover.Caller) string {
r := struct{ Name string }{}
c.Get("e1", "/serv/provide").To(&r)
return "gate get " + r.Name
})
s.Proxy("/proxy/(.+?)", "e1", "/serv/$1")

os.Setenv("LOG_FILE", os.DevNull)
os.Setenv("SERVICE_ACCESSTOKENS", `{"e1_level1": 1, "e1_level2": 2, "e1_level3":3}`)
os.Setenv("DISCOVER_CALLS", `{"e1":"5000:e1_level3:1"}`)
//Yi Ding Yao Zuo reset,Bu Ran Shou Dong She Zhi De Huan Jing Bian Liang Bu Ke Bei Jia Zai ****
config.ResetConfigEnv()
as := s.AsyncStart()
fmt.Println("/serv/provide:")
fmt.Println(as.Get("/serv/provide", "Access-Token", "e1_level1"))
fmt.Println("/serv/gate_get:")
fmt.Println(as.Get("/serv/gate_get", "Access-Token", "e1_level2"))
fmt.Println("/proxy/provide:")
fmt.Println(as.Get("/proxy/provide", "Access-Token", "e1_level2"))
fmt.Println("/proxy/gate_get:")
fmt.Println(as.Get("/proxy/gate_get", "Access-Token", "e1_level2"))
defer as.Stop()
}

Shou Quan Deng Ji

Zhu Ce Fu Wu Zhi Ding authLevelWei 0,Qi Dong De Fu Wu Bei Diao Yong Shi Bu Xu Yao Jian Quan ,Ke Yi Zhi Jie Fang Wen

Ke Yi Wei Yi Ge Fu Wu Zhi Ding Duo Ge Shou Quan Deng Ji (1,2,3,4,5,6......),Ju Bei Dui Ying Shou Quan Deng Ji De accessTokenDe Ke Hu Duan ,You Quan Xian Fang Wen Fu Wu

callsKe Hu Duan Shi Yong Fu Wu Ju Bei De Gao Deng Ji De Fang Wen token,Ke Yi Fang Wen Yi Di Shou Quan Deng Ji Qi Dong De Fu Wu

Ru Guo accessTokenCuo Wu ,Huo Zhe Ju Bei Xiao Yu Fu Wu Qi Dong Shou Quan Deng Ji De token,Fang Wen Fu Wu Hui Bei Ju Jue ,Fan Hui 403

Li Ru :

Ke Hu Duan Ju Bei 6Deng Ji accessToken,Dui Yu Ying Yong Xia Zhu Ce Qi Dong De 1,2,3,4,5,6Fu Wu Mo Ren Ju Bei Fang Wen Quan Xian

Ke Hu Duan Jin Ju Bei 1Deng Ji accessToken,Dui Yu Ying Yong Xia Zhu Ce Qi Dong De 2,3,4,5,6Fu Wu De Fang Wen Hui Bei Ju Jue

Jing Tai Zi Yuan

s.Static("/", "resource/")
s.Start()

Zhu Yi :resourceJie Wei Yi Ding Yao You /

Qi Dong Fu Wu Ke Yi Fang Wen Zhan Dian resourceMu Lu Xia De Jing Tai Zi Yuan

controllerKe Yi Tong Guo proxyLai Shi Xian Duo Ge Jing Tai Fu Wu De Fu Zai Dai Li :

s.Proxy("/proxy/(.+?)", "k1", "/$1")
s.Start()

Websocket

Yi Ge Yi ActionWei Chu Li Dan Wei De Websocket Feng Zhuang

// Zhu Ce WebsocketFu Wu
func RegisterWebsocket(authLevel uint, name string, updater *websocket.Upgrader,
onOpen any,
onClose any,
decoder func(data any) (action string, request *map[string]any, err error),
encoder func(action string, data any) any) *ActionRegister {}

// Zhu Ce Websocket Action
func (ar *ActionRegister) RegisterAction(authLevel uint, actionName string, action any) {}

// Zhu Ce Zhen Dui Action De Ren Zheng Mo Kuai
func SetActionAuthChecker(authChecker func(authLevel uint, url *string, action *string, request *map[string]any, sess any) bool) {}

Shi Yong websocket:

ws := s.RegisterWebsocket(1, "/dc/ws", updater, open, close, decode, encode)
ws.RegisterAction(0, "hello", func(in struct{ Name string })
(out struct{ Name string }) {
out.Name = in.Name + "!"
return
})
c, _, err := websocket.DefaultDialer.Dial("ws://"+addr2+"/proxy/ws", nil)
err = c.WriteJSON(s.Map{"action": "hello", "name": "aaa"})
err = c.ReadJSON(&r)
c.Close()

cookie

cookieKe Yi Shi Yong goBiao Zhun Bao httpTi Gong De Fang Fa ,cookieFa Song Gei Liu Lan Qi ,Ji Tian Jia Yi Ge cookie

func hadler(w http.ResponseWriter) {
cookieName := http.Cookie{
Name: "name",
Value: "jim",
HttpOnly: true,
}
cookieToken := http.Cookie{
Name: "token",
Value: "asd123dsa",
HttpOnly: true,
MaxAge: 60,//She Zhi You Xiao Qi Wei 60s
}

w.Header().Set("Set-Cookie", cookieName.String())
w.Header().Add("Set-Cookie", cookieToken.String())
}

Shi Yong httpDe setCookieYe Ke Yi

func handler2(w http.ResponseWriter) {
cookieName := http.Cookie{
Name: "name",
Value: "jim",
HttpOnly: true,
}
cookieToken := http.Cookie{
Name: "token",
Value: "asd123dsa",
HttpOnly: true,
}

http.SetCookie(w, &cookieName)
http.SetCookie(w, &cookieToken)
}

Du Qu Cookie

func readCookie(w http.ResponseWriter, r *http.Request) {
cookies := r.Header["Cookie"]
nameCookie, _ := r.Cookie("name")
}

SessionKeyHe SessionInject

// She Zhi SessionKey,Zi Dong Zai Header Zhong Chan Sheng ,AsyncStart De Ke Hu Duan Zhi Chi Zi Dong Chuan Di
func SetSessionKey(inSessionKey string) {}

// Huo Qu SessionKey
func GetSessionKey() string {}

// She Zhi Yi Ge Sheng Ming Zhou Qi Zai Request Zhong De Dui Xiang ,Qing Qiu Zhong Ke Yi Shi Yong Dui Xiang Lei Xing Zhu Ru Can Shu Fang Bian Diao Yong
func SetSessionInject(request *http.Request, obj any) {}

// Huo Qu Ben Sheng Ming Zhou Qi Zhong Zhi Ding Lei Xing De Session Dui Xiang
func GetSessionInject(request *http.Request, dataType reflect.Type) any {}

Ji Yu Http Header Chuan Di SessionId(Bu Tui Jian Shi Yong Cookie)

s.Restful(2, "PUT", "/api/echo", action)
s.SetSessionKey("name")
s.Start()
func showFullName(in struct{ Name string },req *http.Request) (out struct{ FullName string }) {
out.FullName = in.Name + " Lee." + s.GetSessionId(req)
return
}

Shi Yong SetSession She Zhi De Dui Xiang Ke Yi Zai Fu Wu Fang Fa Zhong Zhi Jie Shi Yong Xiang Tong Lei Xing Huo De Dui Xiang ,Yi Ban Shi Zai AuthChecker Huo Zhe InFilter Zhong She Zhi

sessionDui Xiang Zhu Ru

aiValue := actionIn{2, "so", "cool"}
s.SetSessionInject(req, aiValue)
ai := s.GetSessionInject(req, reflect.TypeOf(actionIn{})).(actionIn)

Dui Xiang Zhu Ru

// She Zhi Yi Ge Zhu Ru Dui Xiang ,Qing Qiu Zhong Ke Yi Shi Yong Dui Xiang Lei Xing Zhu Ru Can Shu Fang Bian Diao Yong
func SetInject(obj any) {}

// Huo Qu Yi Ge Zhu Ru Dui Xiang
func GetInject(dataType reflect.Type) any {}

Zhu Ru Dui Xiang Ke Yi Kua Qing Qiu Ti

type actionIn struct {
Aaa int
Bbb string
Ccc string
}
func showInject(in struct{ Name string }) (out struct{ FullName string }) {
ai := s.GetInject(reflect.TypeOf(actionIn{})).(actionIn)
out.FullName = in.Name + " Lee." + " " + ai.Ccc
return
}
func main() {
//......
aiValue := actionIn{2, "so", "cool"}
s.SetInject(aiValue)
//......
}

panicChu Li

Jie Shou Fu Wu Fang Fa Zhu Dong panicDe Chu Li ,Ke Zi Ding Yi SetErrorHandle

Ru Guo Mei You Zi Ding Yi errorHandle,Ke Yi Zou Kuang Jia Mo Ren De Chu Li Fang Shi ,Jian Yi Zi Ding Yi SetErrorHandle,She Zhi Zi Shen De Fu Wu Fang Fa De Tong Yi panicChu Li

func panicFunc() {
panic(errors.New("s panic test"))
}

func main() {
s.ResetAllSets()
s.Register(0, "/panic_test", panicFunc)

s.SetErrorHandle(func(err any, req *http.Request, rsp *http.ResponseWriter) any {
return s.Map{"msg": "defined", "code": "30889", "panic": fmt.Sprintf("%s", err)}
})
as := s.AsyncStart()
defer as.Stop()

r := as.Get("/panic_test")
panicArr := r.Map()

fmt.Println(panicArr)
}

Pei Zhi

Fu Wu Pei Zhi

Ke Zai Ying Yong Gen Mu Lu Fang Zhi Yi Ge service.json

{
"listen": ":8081",
"httpVersion": 2,
"rwTimeout": 5000,
"keepaliveTimeout": 15000,
"rewriteTimeout": 10000,
"noLogGets": false,
"noLogHeaders": "Accept,Accept-Encoding,Cache-Control,Pragma,Connection",
"noLogInputFields": false,
"logInputArrayNum": 0,
"logOutputFields": "code,message",
"logOutputArrayNum": 2,
"logWebsocketAction": false,
"compress": true,
"certFile": "",
"keyFile": "",
"accessTokens": {
"hasfjlkdlasfsa": 1,
"fdasfsadfdsa": 2,
"9ifjjabdsadsa": 2
}
}
Pei Zhi Xiang Lei Xing Yang Li Shu Ju Shuo Ming
listen string :8081 Fu Wu Bang Ding De Duan Kou Hao
httpVersion int 2 Fu Wu De httpBan Ben
rwTimeout int
Hao Miao
10000 Fu Wu Du Xie Chao Shi Shi Jian
keepaliveTimeout int
Hao Miao
10000 keepalivedJi Huo Shi Lian Jie Yun Xu Kong Xian De Zui Da Shi Jian
Ru Guo Wei She Zhi ,Mo Ren Wei 15Miao
rewriteTimeout int
Hao Miao
5000 rewrite, proxyCao Zuo De Chao Shi Shi Jian
noLogGets bool false Wei trueShi Ping Bi GetWang Luo Qing Qiu Ri Zhi
noLogHeaders string Accept,Accept-Encoding Ri Zhi Qing Qiu Tou He Xiang Ying Tou Ping Bi headerTou Zhi Ding Zi Duan Shu Chu
Ke She Zhi Wei false
noLogInputFields string accessToken Ri Zhi Guo Lu Shu Ru De Zi Duan ,Mu Qian Wei Qi Yong
Wei falseDai Biao Suo You Zi Duan Du Ri Zhi Da Yin
logInputArrayNum int 2 Shu Ru Zi Duan Zi Yuan Su (Shu Zu )Ri Zhi Da Yin Ge Shu Xian Zhi
Mo Ren Wei 0, s.Arr{1, 2, 3}Hui Shu Chu Wei float64 (3)
logOutputFields string code,message Ri Zhi Shu Chu De Zi Duan Bai Ming Dan
Mo Ren Wei false,Dai Biao Bu Xian Zhi
logOutputArrayNum int 3 Shu Chu Zi Duan Zi Yuan Su (Shu Zu )Ri Zhi Da Yin Ge Shu Xian Zhi
Mo Ren Wei 0
logWebsocketAction bool false Shi Fou Zhan Shi websocketDe WSACTIONQing Qiu Ri Zhi
compress bool false Shi Fou Kai Qi Xiang Ying gzipYa Suo (Bao Han Jing Tai Zi Yuan )
compressMinSize int 1024 She Zhi Xiang Ying Nei Rong gzipYa Suo Man Zu De Zui Xiao Chi Cun
Mo Ren Wei 1024Bytes
compressMaxSize int 4096000 She Zhi Xiang Ying Nei Rong gzipYa Suo Man Zu De Zui Da Chi Cun
Mo Ren Wei 4096000Bytes
certFile string httpsQian Ming Zheng Shu Wen Jian Lu Jing
keyFile string httpsSi Yao Zheng Shu Wen Jian Lu Jing
accessTokens map {"ad2dc32cde9" : 1} Dang Qian Fu Wu Fang Wen Shou Quan Ma ,Ke Yi Gen Ju Bu Tong De Shou Quan Deng Ji She Zhi Duo Ge
acceptXRealIpWithoutRequestId bool false Zai Mei You X-Request-IDDe Qing Kuang Xia Shi Fou Hu Lue X-Real-IP
falseDai Biao Hu Lue

Fu Wu Fa Xian Pei Zhi

Ke Zai Ying Yong Gen Mu Lu Fang Zhi Yi Ge discover.json

{
"registry": "127.0.0.1:6379:15",
"app": "",
"weight": 1,
"calls": {
"s1": "5000:hasfjlkdlasfsa:2:s"
}
}
Pei Zhi Xiang Lei Xing Yang Li Shu Ju Shuo Ming
registry string 127.0.0.1:6379:15 Fu Wu Fa Xian redisDe host, Duan Kou , Shu Ju Ku , Mi Ma , Chao Shi Shi Jian Pei Zhi
Yong Yu Fu Wu Zhu Ce Yu Zhu Xiao
app string s1 Ke Bei Fa Xian De Fu Wu Ying Yong Ming
weight int 2 Fu Zai Jun Heng Fu Wu Quan Zhong
calls string Ke Hu Duan Fang Wen Fu Wu De Pei Zhi
{"s1":"5000:adfad"}
{"s1":"5000:s"}
{"s1":"adfad:s"}
callRetryTimes int 10 Ke Hu Duan Fang Wen Fu Wu Shi Bai Zhong Shi Ci Shu

callsZhong Bao Han :

timeout:accessToken:httpVersion:SSL

Mei You Gu Ding Qian Hou Shun Xu ,Zi Dong Jian Cha Pei Zhi Xing

Pei Zhi Xiang Lei Xing Bu Tian Mo Ren Yang Li Shu Ju Shuo Ming
timeout int 5000ms 5000 Ru Guo Wei She Zhi Mo Ren Wei 10000(10Miao ),Bi Ru :":s1token" ":s1token:2"
accessToken string Kong 5000 Bi Ru :"5000"
httpVersion int http 2.0 no ssl 2 Diao Yong Fu Wu Shi Yong De httpXie Yi :1Dai Biao http1.1 2Dai Biao http2
SSL string Bu Shi Yong ssl s Shi Fou Shi Yong https ssl Zhe Li De Zhi Ke Yi Bu Tian Huo Zhe Wei s

callsJian Cha Shun Xu :

  • 1Huo 2Dai Biao http 1.1 2.0 Mo Ren Wei 2
  • sDai Biao https Mei You s Biao Shi Bu Shi Yong ssl
  • Zi Fu Chuan Dai Biao token
  • intLei Xing Dai Biao Chao Shi De ms
  • Qi Ta Lei Xing Wei token

Ri Zhi Pei Zhi

Ke Zai Ying Yong Gen Mu Lu Fang Zhi Yi Ge log.json

{
"level": "info",
"truncations": ["github.com/", "/ssgo/"],
"sensitive": ["password", "secure", "token", "accessToken"],
"regexSensitive": ["(^|[^\\d])(1\\d{10})([^\\d]|$)", "\\[(\\w+)\\]"],
"sensitiveRule": ["11:3*3", "7:2*2", "3:1*1", "2:1*0"]

}
Pei Zhi Xiang Lei Xing Yang Li Shu Ju Shuo Ming
level string info Zhi Ding De Ri Zhi Shu Chu Ji Bie
debug,info,warning,error
file string /dev/null Ri Zhi Wen Jian
She Zhi Wei nil,Bu Zhan Shi Ri Zhi
Ke Yi Zhi Ding Ri Zhi Wen Jian Lu Jing
Bu She Zhi Mo Ren Da Xiang Kong Zhi Tai
truncations []string ["github.com/", "/ssgo/"] Cheng Xu Diao Yong Zhan callStackZi Duan Hu Lue De Mu Lu
sensitive []string ["password","token"] Min Gan Zi Duan
regexSensitive []string ["\[(\w+)\]"] Ri Zhi Min Gan Xin Xi Zheng Ze Pi Pei
sensitiveRule []string ["11:33", "7:22", "3:11", "2:10"] Min Gan Zi Duan Zhan Shi Gui Ze

redisPei Zhi

Ke Zai Ying Yong Gen Mu Lu Fang Zhi Yi Ge redis.json

{
"test": {
"host": "127.0.0.1:6379",
"password": "",
"db": 1,
"maxActive": 100,
"maxIdles": 30,
"idleTimeout": 0,
"connTimeout": 3000,
"readTimeout": 0,
"writeTimeout": 0
},
"dev": {
"...":"..."
}
}
Pei Zhi Xiang Lei Xing Yang Li Shu Ju Shuo Ming
host string 127.0.0.1:6379 hostPei Zhi
password string AESJia Mi Hou De Mi Ma
db int 1 Xuan Ze De Shu Ju Ku
maxActive int 1 Zui Da Lian Jie Shu
Mo Ren Wei 0,Dai Biao Bu Xian Zhi
maxIdles int 10 Zui Da Kong Xian Lian Jie Shu ,Mo Ren Wei 0Biao Shi Bu Xian Zhi
idleTimeout int
Hao Miao
10000 keepalivedJi Huo Shi Lian Jie Yun Xu Kong Xian De Zui Da Shi Jian
Mo Ren Wei 0,Dai Biao Bu Xian Zhi
connTimeout int
Hao Miao
10000 Lian Jie Chao Shi Shi Jian ,Mo Ren Wei 10s
readTimeout int
Hao Miao
10000 Du Chao Shi Shi Jian ,Mo Ren Wei 10s
writeTimeout int
Hao Miao
10000 Xie Chao Shi Shi Jian ,Mo Ren Wei 10s

Shu Ju Ku Pei Zhi

Ke Yi Zai Xiang Mu Gen Mu Lu Fang Zhi Yi Ge db.jsonLai Zuo mysqlShu Ju Ku De Pei Zhi

{
"test": {
"type": "mysql",
"user": "test",
"password": "34RVCy0rQBSQmLX64xjoyg==",
"host": "/tmp/mysql.sock",
"db": "test",
"maxOpens": 100,
"maxIdles": 30,
"maxLifeTime": 0
}
}
Pei Zhi Xiang Lei Xing Yang Li Shu Ju Shuo Ming
type string mysql Shu Ju Ku Lei Xing
user string test Shu Ju Ku Ming
password string Jing Guo AESJia Mi De Shu Ju Ku Mi Ma
host string Ke Wei sockWen Jian Lu Jing Huo Zhe mysqlDe Di Zhi , Duan Kou Hao
db string test Shu Ju Ku Ming
maxOpens int 100 Zui Da Lian Jie Shu ,0Biao Shi Bu Xian Zhi
maxIdles int 30 Zui Da Kong Xian Lian Jie ,0Biao Shi Bu Xian Zhi
maxLifeTime int 0 Mei Ge Lian Jie De Cun Huo Shi Jian ,0Biao Shi Yong Yuan

Shu Ju Ku Mi Ma Jia Mi Ke Yi Bao Zhang Bu Xie Lu ,He redisJia Mi Fang Fa Wan Quan Xiang Tong

Ye Ke Yi Yi Qi Ta Fang Shi Zhi Yao Zai init Han Shu Zhong Diao Yong db.SetEncryptKeys She Zhi Pi Pei De keyHe ivJi Ke

Wang Guan Dai Li Pei Zhi

Ke Yi Zai Xiang Mu Gen Mu Lu Fang Zhi Yi Ge gateway.jsonLai Zuo Wang Guan Dai Li Pei Zhi

{
"checkInterval": 1,
"proxies": {
"/abc": "k1",
"/def":"g1",
"/cce":"g1"
}
}
Pei Zhi Xiang Lei Xing Yang Li Shu Ju Shuo Ming
checkInterval int
10 Mei Ge Pei Zhi De Miao Shu Dao redisZhong Huo Qu Zui Xin Shu Ju
Zui Xiao Pei Zhi Zhi Wei 3
proxies map {"/abc": "k1"} Lu You Dao Ying Yong Ming De Ying She
proxies

proxiesKe Yi Cong Huan Jing Bian Liang , Pei Zhi Wen Jian , redisZhong Lai Huo Qu . Qi Zhong redisPei Zhi Shi Dong Tai Pei Zhi ,Huo Qu redisZhong _proxiesDe Zhi ,Dong Tai Geng Xin Dao gatewayYing Yong Shang .

envPei Zhi

Ke Yi Zai Ying Yong Gen Mu Lu Shi Yong env.jsonZong He Pei Zhi (service+discover+log+gateway+redis+db)Fu Wu :

{
"redis":{
"test":{
"host":"127.0.0.1:6379",
"password":"upvNALgTxwS/xUp2Cie4tg==",
"db":1
}
},
"service":{
"listen":":8081"
},
"discover": {
"app":"e1"
},
"log": {
"level": "info"
},
"db":{
"test": {
"type": "mysql",
"user": "root",
"password": "8wv3Kie3Y4nLArmSWs+hng==",
"host": "127.0.0.1:3306",
"db": "test"
}
}
}

env.jsonDe You Xian Ji Gao Yu Qi Ta Pei Zhi Wen Jian .

Ru Guo Tong Ji Mu Lu Xia Tong Shi Chu Xian envHe serverPei Zhi Wen Jian ,envDe Pei Zhi Hui Dui serverPei Zhi Jin Xing Fu Gai .

Huan Jing Bian Liang

Yi Xia Shi Fu Wu Pei Zhi

export discover='{"app": "c1", "calls": {"s1":"5000:asfews:1"}}'
export discover_app='c1'
export discover_calls_s1='5000:asfews:2'

windowsXia :

set discover={"app": "c1", "calls": {"s1":"5000:asfews"}}
set discover_app=c1
set discover_calls_s1=5000:asfews:2

Yi Xia Shi Fu Wu Fa Xian De redisPei Zhi

export discover='{"REGISTRY":"127.0.0.1:6379:1"}'
export discover_registry='127.0.0.1:6379:1:udigzs+oTp2Kau3Gs20xXQ=='

windowsXia :

set discover={"registry":"127.0.0.1:6379:1"}
set discover_registry=127.0.0.1:6379:udigzs+oTp2Kau3Gs20xXQ==

Huan Jing Bian Liang Dan Xiang Pei Zhi You Xian Ji Da Yu Zong Ti Pei Zhi

export service_calls='{"k1": {"accessToken": "s1token"}}'
export service_calls_k1_accesstokens='s1-token'

service_calls_k1_accesstokensDe Pei Zhi Hui Fu Gai service_callsDui k1Fu Wu accessTokenDe Pei Zhi

Pei Zhi You Xian Ji Shun Xu

cliShe Zhi Huan Jing Bian Liang (set/export) > Pei Zhi Wen Jian

Fu Wu Diao Yong

Fu Wu Diao Yong Ke Hu Duan Mo Shi

// Diao Yong Yi Zhu Ce De Fu Wu ,Gen Ju Quan Zhong Fu Zai Jun Heng
func (caller *Caller) Get(app, path string, headers ... string) *Result {}
func (caller *Caller) Post(app, path string, data any, headers ... string) *Result {}
func (caller *Caller) Put(app, path string, data any, headers ... string) *Result {}
func (caller *Caller) Head(app, path string, data any, headers ... string) *Result {}
func (caller *Caller) Delete(app, path string, data any, headers ... string) *Result {}
func (caller *Caller) Do(app, path string, data any, headers ... string) *Result {}

Fu Zai Jun Heng Suan Fa

// Zhi Ding Jie Dian Diao Yong Yi Zhu Ce De Fu Wu ,Bing Fan Hui Ben Ci Shi Yong De Jie Dian
func (caller *Caller) DoWithNode(method, app, withNode, path string, data any, headers ... string) (*Result, string) {}

// She Zhi Yi Ge Fu Zai Jun Heng Suan Fa
func SetLoadBalancer(lb LoadBalancer) {}

type LoadBalancer interface {

// Mei Ge Qing Qiu Wan Cheng Hou Ti Gong Xin Xi
Response(node *NodeInfo, err error, response *http.Response, responseTimeing int64)

// Qing Qiu Shi Gen Ju Jie Dian De De Fen Qu Zui Xiao Zhi Fa Qi Qing Qiu
Next(nodes []*NodeInfo, request *http.Request) *NodeInfo
}

Ri Zhi Shu Chu

Shi Yong jsonGe Shi Shu Chu Ri Zhi

func Debug(logType string, data Map) {}

func Info(logType string, data Map) {}

func Warning(logType string, data Map) {}

func Error(logType string, data Map) {}

func Log(logLevel LogLevelType, logType string, data Map) {}

func TraceLog(logLevel LogLevelType, logType string, data Map) {}

Document Zi Dong Sheng Cheng Jie Kou Wen Dang

// Sheng Cheng Wen Dang Shu Ju
func MakeDocument() []Api {}

// Sheng Cheng Wen Dang Bing Cun Chu Dao json Wen Jian Zhong
func MakeJsonDocumentFile(file string) {

// Sheng Cheng Wen Dang Bing Cun Chu Dao html Wen Jian Zhong ,Shi Yong Mo Ren htmlMo Ban
func MakeHtmlDocumentFile(title, toFile string) string {}

// Sheng Cheng Wen Dang Bing Cun Chu Dao html Wen Jian Zhong ,Shi Yong Zhi Ding htmlMo Ban
func MakeHtmlDocumentFromFile(title, toFile, fromFile string) string {}

Zhen Dui Zhu Ce Hao De Fu Wu ,Ke Qing Song Shi Xian Wen Dang De Sheng Cheng

s.Register(0, "/show1", show1)
s.Register(0, "/show2", show2)
s.Register(0, "/show3", show3)
s.Register(0, "/show4", show4)

s.MakeHtmlDocumentFile("Ce Shi Wen Dang ", "doc.html")

Sheng Cheng htmlWen Dang Mo Ren Shi Yong sKuang Jia Gen Mu Lu Xia De DocTpl.htmlZuo Wei Mo Ban ,Nei Bu Cai Yong {{ }}Biao Shi Yu Fa

DocTpl.htmlKe Yi Zuo Wei Xin Jian Mo Ban De Can Kao

Shi Yong Ming Ling Xing Chuang Jian Wen Dang

Jia She Bian Yi Hao De Wen Jian Wei ./server

// Zhi Jie Shu Chu json Ge Shi Wen Dang
./server doc

// Sheng Cheng json Ge Shi Wen Dang
./server doc xxx.json

// Sheng Cheng html Ge Shi Wen Dang ,Shi Yong Mo Ren htmlMo Ban
./server doc xxx.html

// Sheng Cheng html Ge Shi Wen Dang ,Shi Yong Zhi Ding htmlMo Ban
./server doc xxx.html tpl.html

About

a go web freamwork for micro service, very very easy to create and deploy, with auto service registry and discover, high performance and based on http/2 no ssl

Topics

Resources

Readme

License

MIT license

Stars

Watchers

Forks

Packages

Contributors