Compare commits
10 Commits
7f6b187843
...
e5cf6638cc
Author | SHA1 | Date | |
---|---|---|---|
|
e5cf6638cc | ||
|
b52f8c3849 | ||
|
81df0950e3 | ||
|
ebcd27bbd5 | ||
|
15c27afb44 | ||
|
889b25edef | ||
|
f7efb6faf3 | ||
|
309b18a2b7 | ||
|
b20cb4b7c3 | ||
|
67387be192 |
7
go.mod
7
go.mod
@ -5,9 +5,7 @@ go 1.20
|
||||
require (
|
||||
fusen-basic v0.0.0
|
||||
github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1
|
||||
github.com/nacos-group/nacos-sdk-go/v2 v2.2.3
|
||||
golang.org/x/text v0.14.0
|
||||
google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17
|
||||
google.golang.org/grpc v1.59.0
|
||||
google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.3.0
|
||||
google.golang.org/protobuf v1.31.0
|
||||
@ -26,6 +24,7 @@ require (
|
||||
github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect
|
||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
||||
github.com/modern-go/reflect2 v1.0.2 // indirect
|
||||
github.com/nacos-group/nacos-sdk-go/v2 v2.2.3 // indirect
|
||||
github.com/opentracing/opentracing-go v1.2.1-0.20220228012449-10b1cf09e00b // indirect
|
||||
github.com/pkg/errors v0.9.1 // indirect
|
||||
github.com/prometheus/client_golang v1.17.0 // indirect
|
||||
@ -33,6 +32,7 @@ require (
|
||||
github.com/prometheus/common v0.45.0 // indirect
|
||||
github.com/prometheus/procfs v0.12.0 // indirect
|
||||
github.com/rogpeppe/go-internal v1.11.0 // indirect
|
||||
github.com/sirupsen/logrus v1.9.3 // indirect
|
||||
go.uber.org/atomic v1.11.0 // indirect
|
||||
go.uber.org/multierr v1.11.0 // indirect
|
||||
go.uber.org/zap v1.26.0 // indirect
|
||||
@ -41,10 +41,11 @@ require (
|
||||
golang.org/x/sys v0.14.0 // indirect
|
||||
golang.org/x/time v0.4.0 // indirect
|
||||
google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17 // indirect
|
||||
google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17 // indirect
|
||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17 // indirect
|
||||
gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect
|
||||
gopkg.in/yaml.v2 v2.4.0 // indirect
|
||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||
)
|
||||
|
||||
replace fusen-basic v0.0.0 => gitee.com/fusenpack/fusen-basic v0.0.5-0.20231109042013-6235d097ca40
|
||||
replace fusen-basic v0.0.0 => gitee.com/fusenpack/fusen-basic v0.0.5-0.20231124072222-16de191b1dbe
|
||||
|
7
go.sum
7
go.sum
@ -1,6 +1,6 @@
|
||||
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
|
||||
gitee.com/fusenpack/fusen-basic v0.0.5-0.20231109042013-6235d097ca40 h1:Ab4+L6M36S2ZIjSh2gpStnpL6d2qP5dcPLssxgBTw9E=
|
||||
gitee.com/fusenpack/fusen-basic v0.0.5-0.20231109042013-6235d097ca40/go.mod h1:VTOMNVbG/jJBGUinI+/pn8MPsbkN7+gwk2DP8vncTkA=
|
||||
gitee.com/fusenpack/fusen-basic v0.0.5-0.20231124072222-16de191b1dbe h1:Ti0GAaJilLuKWFwbVy2aSzYga9YaVXvzHr3jK0FfpRM=
|
||||
gitee.com/fusenpack/fusen-basic v0.0.5-0.20231124072222-16de191b1dbe/go.mod h1:M6MEfmoOqiH6z2xfGb3WMd+jADI42flrUrNv2WoFE8A=
|
||||
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
|
||||
github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo=
|
||||
github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=
|
||||
@ -72,6 +72,8 @@ github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k
|
||||
github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo=
|
||||
github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M=
|
||||
github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA=
|
||||
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
|
||||
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
@ -118,6 +120,7 @@ golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7w
|
||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q=
|
||||
golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
|
2
proto
2
proto
@ -1 +1 @@
|
||||
Subproject commit f05c723d4dea13224cdd9dcbfeb9ed8c9a59da35
|
||||
Subproject commit cbab13f32436a22e47eaa01bac51211063b16155
|
33
protoc.sh
33
protoc.sh
@ -10,35 +10,4 @@ cd $script_dir/proto
|
||||
git pull origin master
|
||||
cd $script_dir
|
||||
go run -gcflags="-N" proto/goutils/proto_build/main.go gateway
|
||||
|
||||
run_server() {
|
||||
server_name="server"
|
||||
gateway_name="grpc-gateway"
|
||||
|
||||
# 导航到相应的目录
|
||||
cd $script_dir/server
|
||||
echo "build $gateway_name"
|
||||
go build
|
||||
|
||||
# 如果之前存在相同名字的 screen 会话,先将其终止
|
||||
# 首先尝试关闭已存在的screen会话
|
||||
existing_session=$(screen -ls | grep -w "$gateway_name")
|
||||
if [ -n "$existing_session" ]; then
|
||||
echo "Terminating existing screen session for $gateway_name"
|
||||
screen -S "$gateway_name" -X quit
|
||||
while [[ $(screen -ls | grep "\.$gateway_name\s") ]]; do
|
||||
sleep 0.1s # 等待0.1秒后再次检查
|
||||
echo "wait for $gateway_name"
|
||||
done
|
||||
fi
|
||||
|
||||
# 循环检查screen进程是否存在
|
||||
|
||||
[ -f .gitignore ] || (echo "server" > .gitignore && echo "main" >> .gitignore)
|
||||
# 使用 screen 运行 go run <server_name>.go
|
||||
|
||||
echo "Running $gateway_name"
|
||||
screen -dmS $gateway_name -L ./$server_name
|
||||
}
|
||||
|
||||
run_server
|
||||
|
48
run_gateway_latest.sh
Executable file
48
run_gateway_latest.sh
Executable file
@ -0,0 +1,48 @@
|
||||
#! /bin/bash
|
||||
|
||||
rm ./gen/go -rf
|
||||
|
||||
./update_fspkg_master.sh
|
||||
|
||||
# 获取当前脚本的全局路径
|
||||
script_path=$(realpath "$0")
|
||||
|
||||
# 获取当前脚本的目录
|
||||
script_dir=$(dirname "$script_path")
|
||||
|
||||
cd $script_dir/proto
|
||||
git pull origin master
|
||||
cd $script_dir
|
||||
go run -gcflags="-N" proto/goutils/proto_build/main.go gateway
|
||||
|
||||
run_server() {
|
||||
server_name="server"
|
||||
gateway_name="grpc-gateway"
|
||||
|
||||
# 导航到相应的目录
|
||||
cd $script_dir/server
|
||||
echo "build $gateway_name"
|
||||
go build
|
||||
|
||||
# 如果之前存在相同名字的 screen 会话,先将其终止
|
||||
# 首先尝试关闭已存在的screen会话
|
||||
existing_session=$(screen -ls | grep -w "$gateway_name")
|
||||
if [ -n "$existing_session" ]; then
|
||||
echo "Terminating existing screen session for $gateway_name"
|
||||
screen -S "$gateway_name" -X quit
|
||||
while [[ $(screen -ls | grep "\.$gateway_name\s") ]]; do
|
||||
sleep 0.1s # 等待0.1秒后再次检查
|
||||
echo "wait for $gateway_name"
|
||||
done
|
||||
fi
|
||||
|
||||
# 循环检查screen进程是否存在
|
||||
|
||||
[ -f .gitignore ] || (echo "server" > .gitignore && echo "main" >> .gitignore)
|
||||
# 使用 screen 运行 go run <server_name>.go
|
||||
|
||||
echo "Running $gateway_name"
|
||||
screen -dmS $gateway_name -L ./$server_name
|
||||
}
|
||||
|
||||
run_server
|
12
server/logic/custom_test.go
Normal file
12
server/logic/custom_test.go
Normal file
@ -0,0 +1,12 @@
|
||||
package logic
|
||||
|
||||
import (
|
||||
"log"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestRe(t *testing.T) {
|
||||
fsHeader := `{"code": 200 , "msg":"asd"}`
|
||||
code := codeRE.FindStringSubmatch(string(fsHeader))
|
||||
log.Println(code)
|
||||
}
|
@ -16,6 +16,11 @@ func AutoRegisterHandler(ctx context.Context, mux *runtime.ServeMux, opts ...grp
|
||||
return err
|
||||
}
|
||||
|
||||
err = service.RegisterNotifyHandlerClientNacos(ctx, mux, opts...)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
err = service.RegisterInfoHandlerClientNacos(ctx, mux, opts...)
|
||||
if err != nil {
|
||||
return err
|
||||
|
15
server/logic/gateway_meta.go
Normal file
15
server/logic/gateway_meta.go
Normal file
@ -0,0 +1,15 @@
|
||||
package logic
|
||||
|
||||
import (
|
||||
"context"
|
||||
"net/http"
|
||||
|
||||
"google.golang.org/grpc/metadata"
|
||||
)
|
||||
|
||||
func PassMetadata(ctx context.Context, r *http.Request) metadata.MD {
|
||||
headerValue := r.Header.Get("Debug-Token")
|
||||
// 将值添加到 gRPC 元数据
|
||||
md := metadata.Pairs("debug-token", headerValue)
|
||||
return md
|
||||
}
|
@ -3,8 +3,11 @@ package logic
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"fmt"
|
||||
"fusen-basic/basic"
|
||||
"fusen-gateway/gen/go/service"
|
||||
"net/http"
|
||||
"regexp"
|
||||
|
||||
"github.com/grpc-ecosystem/grpc-gateway/v2/runtime"
|
||||
"google.golang.org/protobuf/encoding/protojson"
|
||||
@ -19,35 +22,79 @@ func (m *EmptyMarshaler) Marshal(v interface{}) ([]byte, error) {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
var fsProtoJSON = &runtime.JSONPb{
|
||||
var fsDefaultProtoJSON = &runtime.JSONPb{
|
||||
MarshalOptions: protojson.MarshalOptions{
|
||||
EmitUnpopulated: true,
|
||||
UseProtoNames: true,
|
||||
},
|
||||
UnmarshalOptions: protojson.UnmarshalOptions{
|
||||
DiscardUnknown: true,
|
||||
},
|
||||
}
|
||||
|
||||
func ResponseHeaderMatcher(ctx context.Context, w http.ResponseWriter, resp proto.Message) error {
|
||||
headers := w.Header()
|
||||
key := http.CanonicalHeaderKey("Grpc-Metadata-" + string(basic.GM_FusenResponse))
|
||||
var codeRE = regexp.MustCompile(`(?i)"code"\s*:\s*(\d+)`)
|
||||
|
||||
if location, ok := headers[key]; ok {
|
||||
// w.Header().Set("Location", location[0])
|
||||
// w.WriteHeader(http.StatusFound)
|
||||
w.WriteHeader(200)
|
||||
fsHeader := location[0]
|
||||
var buf = bytes.NewBufferString(fsHeader[:len(fsHeader)-1] + ",")
|
||||
rdata, err := fsProtoJSON.Marshal(resp)
|
||||
func WriteFusenResponse(fsHeader string, w http.ResponseWriter, resp proto.Message) error {
|
||||
w.WriteHeader(200)
|
||||
var buf = bytes.NewBufferString(fsHeader[:len(fsHeader)-1] + ",")
|
||||
var rdata []byte
|
||||
var err error
|
||||
|
||||
if customResp, ok := resp.(*service.Response); ok {
|
||||
if customResp.GetData() != nil {
|
||||
rdata, err = fsDefaultProtoJSON.Marshal(customResp.GetData())
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
} else {
|
||||
rdata = []byte("null")
|
||||
}
|
||||
} else {
|
||||
rdata, err = fsDefaultProtoJSON.Marshal(resp)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
buf.WriteString(`"data":`)
|
||||
buf.Write(rdata)
|
||||
buf.WriteString(`}`)
|
||||
|
||||
w.Write(buf.Bytes())
|
||||
}
|
||||
|
||||
buf.WriteString(`"data":`)
|
||||
buf.Write(rdata)
|
||||
buf.WriteString(`}`)
|
||||
|
||||
w.Write(buf.Bytes())
|
||||
return nil
|
||||
}
|
||||
|
||||
func ResponseHeaderMatcher(ctx context.Context, w http.ResponseWriter, resp proto.Message) error {
|
||||
headers := w.Header()
|
||||
|
||||
key := http.CanonicalHeaderKey(basic.GM_FusenResponse.GrpcMetadataKey())
|
||||
|
||||
if grpcResp, ok := headers[key]; ok {
|
||||
fsHeader := grpcResp[0]
|
||||
code := codeRE.FindStringSubmatch(string(fsHeader))
|
||||
if len(code) > 0 && code[1] != "200" {
|
||||
return WriteFusenResponse(fsHeader, w, resp)
|
||||
}
|
||||
|
||||
// 判断自定返回的内容, 用html的页面返回等...
|
||||
selfwrite := http.CanonicalHeaderKey(basic.GM_SelfWrite.GrpcMetadataKey())
|
||||
if sw, ok := headers[selfwrite]; ok {
|
||||
w.WriteHeader(200)
|
||||
w.Write([]byte(sw[0]))
|
||||
return nil
|
||||
}
|
||||
|
||||
// 重定向
|
||||
redirect := http.CanonicalHeaderKey(basic.GM_Redirect.GrpcMetadataKey())
|
||||
if location, ok := headers[redirect]; ok {
|
||||
w.WriteHeader(http.StatusFound)
|
||||
w.Header().Set("Location", location[0])
|
||||
return nil
|
||||
}
|
||||
|
||||
return WriteFusenResponse(fsHeader, w, resp)
|
||||
}
|
||||
|
||||
w.Write([]byte(fmt.Sprintf("%s error", basic.GM_FusenResponse.String())))
|
||||
return nil
|
||||
}
|
||||
|
@ -2,6 +2,7 @@ package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"log"
|
||||
|
||||
"fusen-basic/env"
|
||||
"fusen-gateway/gen/go/service"
|
||||
@ -27,11 +28,20 @@ func main() {
|
||||
ctx, cancel := context.WithCancel(ctx)
|
||||
defer cancel()
|
||||
mux := runtime.NewServeMux(
|
||||
runtime.WithErrorHandler(func(ctx context.Context, sm *runtime.ServeMux, m runtime.Marshaler, w http.ResponseWriter, r *http.Request, err error) {
|
||||
log.Println(err)
|
||||
w.Write([]byte("gateway: " + err.Error()))
|
||||
}),
|
||||
runtime.WithMetadata(logic.PassMetadata),
|
||||
runtime.WithForwardResponseOption(logic.ResponseHeaderMatcher),
|
||||
runtime.WithMarshalerOption("*", &logic.EmptyMarshaler{}),
|
||||
)
|
||||
|
||||
opts := []grpc.DialOption{
|
||||
grpc.WithUnaryInterceptor(func(ctx context.Context, method string, req, reply any, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error {
|
||||
log.Println(method)
|
||||
return invoker(ctx, method, req, reply, cc, opts...)
|
||||
}),
|
||||
grpc.WithTransportCredentials(insecure.NewCredentials()),
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user