Compare commits

...

10 Commits

Author SHA1 Message Date
eson
e5cf6638cc 更新 2023-11-24 18:41:17 +08:00
eson
b52f8c3849 折磨 2023-11-24 16:38:11 +08:00
eson
81df0950e3 更新 2023-11-21 18:30:26 +08:00
eson
ebcd27bbd5 需要修复一下gateway 2023-11-17 18:35:28 +08:00
eson
15c27afb44 update 2023-11-16 18:01:01 +08:00
eson
889b25edef 提交最新的gateway 支持通用的response map返回 2023-11-16 17:45:04 +08:00
eson
f7efb6faf3 最新的gateway 2023-11-16 16:24:52 +08:00
eson
309b18a2b7 更新网关 2023-11-15 14:32:14 +08:00
eson
b20cb4b7c3 支持重定向, 自定义内容输出 2023-11-14 17:33:19 +08:00
eson
67387be192 更新gateway 2023-11-13 17:52:02 +08:00
10 changed files with 164 additions and 54 deletions

7
go.mod
View File

@ -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
View File

@ -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

@ -1 +1 @@
Subproject commit f05c723d4dea13224cdd9dcbfeb9ed8c9a59da35
Subproject commit cbab13f32436a22e47eaa01bac51211063b16155

View File

@ -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
View 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

View 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)
}

View File

@ -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

View 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
}

View File

@ -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
}

View File

@ -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()),
}