Compare commits

..

No commits in common. "e5cf6638cc957a1f93a9e65dfe9a879d3f723aa6" and "7f6b1878437628f9f8a304253fc591ca0e23bd51" have entirely different histories.

10 changed files with 54 additions and 164 deletions

7
go.mod
View File

@ -5,7 +5,9 @@ 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
@ -24,7 +26,6 @@ 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
@ -32,7 +33,6 @@ 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,11 +41,10 @@ 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.20231124072222-16de191b1dbe
replace fusen-basic v0.0.0 => gitee.com/fusenpack/fusen-basic v0.0.5-0.20231109042013-6235d097ca40

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.20231124072222-16de191b1dbe h1:Ti0GAaJilLuKWFwbVy2aSzYga9YaVXvzHr3jK0FfpRM=
gitee.com/fusenpack/fusen-basic v0.0.5-0.20231124072222-16de191b1dbe/go.mod h1:M6MEfmoOqiH6z2xfGb3WMd+jADI42flrUrNv2WoFE8A=
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=
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,8 +72,6 @@ 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=
@ -120,7 +118,6 @@ 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 cbab13f32436a22e47eaa01bac51211063b16155
Subproject commit f05c723d4dea13224cdd9dcbfeb9ed8c9a59da35

View File

@ -10,4 +10,35 @@ 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

@ -1,48 +0,0 @@
#! /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

@ -1,12 +0,0 @@
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,11 +16,6 @@ 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

@ -1,15 +0,0 @@
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,11 +3,8 @@ 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"
@ -22,79 +19,35 @@ func (m *EmptyMarshaler) Marshal(v interface{}) ([]byte, error) {
return nil, nil
}
var fsDefaultProtoJSON = &runtime.JSONPb{
var fsProtoJSON = &runtime.JSONPb{
MarshalOptions: protojson.MarshalOptions{
EmitUnpopulated: true,
UseProtoNames: true,
},
UnmarshalOptions: protojson.UnmarshalOptions{
DiscardUnknown: true,
},
}
var codeRE = regexp.MustCompile(`(?i)"code"\s*:\s*(\d+)`)
func ResponseHeaderMatcher(ctx context.Context, w http.ResponseWriter, resp proto.Message) error {
headers := w.Header()
key := http.CanonicalHeaderKey("Grpc-Metadata-" + string(basic.GM_FusenResponse))
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 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)
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,7 +2,6 @@ package main
import (
"context"
"log"
"fusen-basic/env"
"fusen-gateway/gen/go/service"
@ -28,20 +27,11 @@ 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()),
}