diff --git a/core/config.go b/core/config.go new file mode 100644 index 0000000..f49817b --- /dev/null +++ b/core/config.go @@ -0,0 +1,33 @@ +package core + +import ( + "gopkg.in/yaml.v3" + "log" +) + +type Config struct { + Gateway struct { + Routes []struct { + Path string `yaml:"path"` + Service string `yaml:"service"` + } `yaml:"routes"` + } `yaml:"gateway"` +} + +func ConfigChanged(data string) { + // 从配置文件解析为对象 + config := Config{} + err := yaml.Unmarshal([]byte(data), &config) + if err != nil { + log.Printf("解析配置文本失败: %v\n", err.Error()) + return + } + rs := config.Gateway.Routes + var sma []serviceMap + for _, r := range rs { + item := NewServiceMapItem(r.Path, r.Service) + sma = append(sma, item) + } + ServiceMap = sma + log.Println("配置文件解析完毕") +} diff --git a/core/core.go b/core/core.go new file mode 100644 index 0000000..6490783 --- /dev/null +++ b/core/core.go @@ -0,0 +1,6 @@ +package core + +var ( + NacosClient nacosClient + ServiceMap []serviceMap +) diff --git a/core/nacos.go b/core/nacos.go new file mode 100644 index 0000000..e022970 --- /dev/null +++ b/core/nacos.go @@ -0,0 +1,77 @@ +package core + +import ( + "fmt" + "github.com/gin-gonic/gin" + "github.com/nacos-group/nacos-sdk-go/clients/config_client" + "github.com/nacos-group/nacos-sdk-go/clients/naming_client" + "github.com/nacos-group/nacos-sdk-go/vo" + "io/ioutil" + "log" + "net/http" + "strings" +) + +type nacosClient struct { + client naming_client.INamingClient + config config_client.IConfigClient +} + +func NewNacosClient(c naming_client.INamingClient, n config_client.IConfigClient) nacosClient { + return nacosClient{c, n} +} + +// Remote 发起远程调用 +func (n nacosClient) Remote(ctx *gin.Context) { + // 取出URI + uri := ctx.Request.RequestURI + // 截取第二个/前面那一段 + pathAry := strings.Split(uri, "/") + serviceName := "" + apiService := fmt.Sprintf("/%v", pathAry[1]) + for _, s := range ServiceMap { + if s.Path != "" && s.Path == apiService { + serviceName = s.Service + break + } + } + if serviceName == "" { + ctx.String(http.StatusNotFound, "服务不可达") + return + } + + instance, err := n.client.SelectOneHealthyInstance(vo.SelectOneHealthInstanceParam{ + ServiceName: serviceName, + }) + if err != nil { + log.Printf("获取健康服务失败: %v\n", err.Error()) + return + } + // 组装内部接口 + apiUrl := fmt.Sprintf("http://%v:%v%v", instance.Ip, instance.Port, uri) + // 创建Request对象 + req, err := http.NewRequest(ctx.Request.Method, apiUrl, ctx.Request.Body) + if err != nil { + log.Printf("请求异常: %v\n", err) + return + } + // 填充Form参数(大概率用不上) + req.Form = ctx.Request.Form + // 填充链路追踪标记 + req.Header.Add("uber-trace-id", ctx.GetString("UberTraceId")) + // 请求ID + req.Header.Add("X-Request-Id", ctx.GetString("X-Request-Id")) + // 设置来源 + req.Header.Add("From", "internal") + // 发起请求 + client := &http.Client{} + response, err := client.Do(req) + if err != nil { + log.Printf("请求异常: %v\n", err) + return + } + // 返回结果到前端 + sss, _ := ioutil.ReadAll(response.Body) + log.Println(string(sss)) + ctx.String(response.StatusCode, string(sss)) +} diff --git a/core/service.go b/core/service.go new file mode 100644 index 0000000..02348b3 --- /dev/null +++ b/core/service.go @@ -0,0 +1,15 @@ +package core + +type serviceMap struct { + Path string + Service string +} + +func NewServiceMapItem(k, v string) serviceMap { + //var sma []serviceMap + // 从Nacos读取规则 + // gateway: + // - path: /user + // service: mb-user-service + return serviceMap{k, v} +} diff --git a/feign.go b/feign.go deleted file mode 100644 index e23fe52..0000000 --- a/feign.go +++ /dev/null @@ -1,103 +0,0 @@ -package main - -import ( - "fmt" - "github.com/nacos-group/nacos-sdk-go/clients" - "github.com/nacos-group/nacos-sdk-go/clients/naming_client" - "github.com/nacos-group/nacos-sdk-go/common/constant" - "github.com/nacos-group/nacos-sdk-go/vo" - "io/ioutil" - "log" - "net/http" -) - -var nameClient naming_client.INamingClient - -func initNacos() { - sc := []constant.ServerConfig{ - *constant.NewServerConfig("nacos", 8848), - } - cc := constant.ClientConfig{ - AppName: "gateway", - //NamespaceId: "e56f939e-6d22-449c-97d2-39a8ae5afd58", //namespace id - NamespaceId: "", - TimeoutMs: 5000, - NotLoadCacheAtStart: true, - RotateTime: "1h", - MaxAge: 3, - LogLevel: "debug", - } - client, err := clients.NewNamingClient( - vo.NacosClientParam{ - ClientConfig: &cc, - ServerConfigs: sc, - }, - ) - - if err != nil { - panic(err) - } - ip := "gateway-demo" - if ips := getIps(); ips != nil { - ip = ips[0] - } - success, _ := client.RegisterInstance(vo.RegisterInstanceParam{ - Ip: ip, - Port: 8889, - Weight: 10, - Enable: true, - Healthy: true, - ServiceName: "gateway", - Ephemeral: true, - }) - log.Println("Nacos注册结果: ", success) - if !success { - log.Fatal("服务注册失败,退出程序") - } - nameClient = client -} - -func get(method, url string) string { - info, err := nameClient.SelectAllInstances(vo.SelectAllInstancesParam{ - ServiceName: "api1", - }) - if err != nil { - return "获取服务异常:" + err.Error() - } - log.Println("获取到实例数量:", len(info)) - instance, err := nameClient.SelectOneHealthyInstance(vo.SelectOneHealthInstanceParam{ - ServiceName: "api1", - //GroupName: "Micro", // 默认值DEFAULT_GROUP - //Clusters: []string{pojo.InitConf.CurVersion}, // 默认值DEFAULT - }) - if err != nil { - return "获取服务异常:" + err.Error() - } - apiUrl := fmt.Sprintf("http://%v:%v%v", instance.Ip, instance.Port, url) - response, err := http.Get(apiUrl) - if err != nil { - log.Fatalf("请求异常: %v", err) - } - content, err := ioutil.ReadAll(response.Body) - respBody := string(content) - return respBody -} - -func post(url string) string { - instance, err := nameClient.SelectOneHealthyInstance(vo.SelectOneHealthInstanceParam{ - ServiceName: "api1", - //GroupName: "Micro", // 默认值DEFAULT_GROUP - //Clusters: []string{pojo.InitConf.CurVersion}, // 默认值DEFAULT - }) - if err != nil { - return "获取服务异常:" + err.Error() - } - apiUrl := fmt.Sprintf("http://%v:%v%v", instance.Ip, instance.Port, url) - response, err := http.Post(apiUrl, "application/json", nil) - if err != nil { - log.Fatalf("请求异常: %v", err) - } - content, err := ioutil.ReadAll(response.Body) - respBody := string(content) - return respBody -} diff --git a/go.mod b/go.mod index a7e395e..bac8753 100644 --- a/go.mod +++ b/go.mod @@ -5,9 +5,13 @@ go 1.17 require ( github.com/gin-gonic/gin v1.7.4 github.com/nacos-group/nacos-sdk-go v1.0.8 + github.com/opentracing/opentracing-go v1.2.0 + github.com/uber/jaeger-client-go v2.29.1+incompatible + gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c ) require ( + github.com/HdrHistogram/hdrhistogram-go v1.1.2 // indirect github.com/aliyun/alibaba-cloud-sdk-go v1.61.18 // indirect github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23 // indirect github.com/gin-contrib/sse v0.1.0 // indirect @@ -24,14 +28,18 @@ require ( github.com/mattn/go-isatty v0.0.12 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742 // indirect + github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect github.com/pkg/errors v0.9.1 // indirect + github.com/stretchr/testify v1.7.0 // indirect github.com/toolkits/concurrent v0.0.0-20150624120057-a4371d70e3e3 // indirect + github.com/uber/jaeger-lib v2.4.1+incompatible // indirect github.com/ugorji/go/codec v1.1.7 // indirect go.uber.org/atomic v1.6.0 // indirect go.uber.org/multierr v1.5.0 // indirect go.uber.org/zap v1.15.0 // indirect golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 // indirect golang.org/x/sys v0.0.0-20200116001909-b77594299b42 // indirect + gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f // indirect gopkg.in/ini.v1 v1.42.0 // indirect gopkg.in/yaml.v2 v2.2.8 // indirect ) diff --git a/go.sum b/go.sum index d0fad45..0d859ed 100644 --- a/go.sum +++ b/go.sum @@ -1,20 +1,28 @@ +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/HdrHistogram/hdrhistogram-go v1.1.2 h1:5IcZpTvzydCQeHzK4Ef/D5rrSqwxob0t8PQPMybUNFM= +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= github.com/aliyun/alibaba-cloud-sdk-go v1.61.18 h1:zOVTBdCKFd9JbCKz9/nt+FovbjPFmb7mUnp8nH9fQBA= github.com/aliyun/alibaba-cloud-sdk-go v1.61.18/go.mod h1:v8ESoHo4SyHmuB4b1tJqDHxfTGEciD+yhvOU/5s1Rfk= github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23 h1:D21IyuvjDCshj1/qq+pCNd3VZOAEI9jy6Bi131YlXgI= github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/fastly/go-utils v0.0.0-20180712184237-d95a45783239 h1:Ghm4eQYC0nEPnSJdVkTrXpu9KtoVCSo1hg7mtI7G9KU= github.com/fastly/go-utils v0.0.0-20180712184237-d95a45783239/go.mod h1:Gdwt2ce0yfBxPvZrHkprdPPTTS3N5rwmLE8T22KBXlw= +github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-gonic/gin v1.7.4 h1:QmUZXrvJ9qZ3GfWvQ+2wnW/1ePrTEJqPKMYEU3lD/DM= github.com/gin-gonic/gin v1.7.4/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY= github.com/go-errors/errors v1.0.1 h1:LUHzmkK3GUKUrL/1gfBUxAHzcev3apQlezX/+O7ma6w= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q= @@ -24,10 +32,12 @@ github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+ github.com/go-playground/validator/v10 v10.4.1 h1:pH2c5ADXtd66mxoE0Zm9SUhxE20r7aM3F26W0hOn+GE= github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= github.com/goji/httpauth v0.0.0-20160601135302-2da839ab0f4d/go.mod h1:nnjvkQ9ptGaCkuDUx6wNykzzlUixGxvkme+H/lnzb+A= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/mock v1.3.1 h1:qGJ6qTW+x6xX/my+8YUVl4WNpX9B7+/l2tRsHGZ7f2s= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= github.com/golang/protobuf v1.3.3 h1:gyjaxf+svBWX08ZjK86iN9geUJF0H6gp2IRKX6Nf6/I= github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= @@ -44,12 +54,13 @@ github.com/json-iterator/go v1.1.9 h1:9yzud/Ht36ygwatGx56VwCZtlI/2AD15T1X2sjSuGn github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/lestrrat/go-envload v0.0.0-20180220120943-6ed08b54a570 h1:0iQektZGS248WXmGIYOwRXSQhD4qn3icjMpuxwO7qlo= @@ -67,6 +78,10 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742 h1:Esafd1046DLD github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/nacos-group/nacos-sdk-go v1.0.8 h1:8pEm05Cdav9sQgJSv5kyvlgfz0SzFUUGI3pWX6SiSnM= github.com/nacos-group/nacos-sdk-go v1.0.8/go.mod h1:hlAPn3UdzlxIlSILAyOXKxjFSvDJ9oLzTJ9hLAK1KzA= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= +github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -77,15 +92,21 @@ github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykE github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a h1:pa8hGb/2YqsZKovtsgrwcDH1RZhVbTKCjLp47XpqCDs= github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/stretchr/objx v0.1.0 h1:4G4v2dO3VZwixGIRoQ5Lfboy6nUhCyYzaqnIAPPhYs4= 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.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/tebeka/strftime v0.1.3 h1:5HQXOqWKYRFfNyBMNVc9z5+QzuBtIXy03psIhtdJYto= github.com/tebeka/strftime v0.1.3/go.mod h1:7wJm3dZlpr4l/oVK0t1HYIc4rMzQ2XJlOMIUJUJH6XQ= github.com/toolkits/concurrent v0.0.0-20150624120057-a4371d70e3e3 h1:kF/7m/ZU+0D4Jj5eZ41Zm3IH/J8OElK1Qtd7tVKAwLk= github.com/toolkits/concurrent v0.0.0-20150624120057-a4371d70e3e3/go.mod h1:QDlpd3qS71vYtakd2hmdpqhJ9nwv6mD6A30bQ1BPBFE= +github.com/uber/jaeger-client-go v2.29.1+incompatible h1:R9ec3zO3sGpzs0abd43Y+fBZRJ9uiH6lXyR/+u6brW4= +github.com/uber/jaeger-client-go v2.29.1+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= +github.com/uber/jaeger-lib v2.4.1+incompatible h1:td4jdvLcExb4cBISKIpHuGoVXh+dVKhn2Um6rjCsSsg= +github.com/uber/jaeger-lib v2.4.1+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs= @@ -102,37 +123,61 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859 h1:R/3boaszxrf1GEUWTVDzSKVwLmSJpwZ1yqXm8j0v2QI= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42 h1:vEOn+mP2zCOVzKckCZy6YsCtDblrpj/w7B9nxGNELpg= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5 h1:hKsoRgsbwY1NafxrwTs+k64bikrLBkAgPir1TNCj3Zs= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= +gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= +gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= +gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/ini.v1 v1.42.0 h1:7N3gPTt50s8GuLortA00n8AqRTk75qOP98+mTPpgzRk= gopkg.in/ini.v1 v1.42.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= diff --git a/initialization/init.go b/initialization/init.go new file mode 100644 index 0000000..5a5e552 --- /dev/null +++ b/initialization/init.go @@ -0,0 +1,9 @@ +package initialization + +// InitSystem 初始化系统 +func InitSystem() { + // 服务路由规则 + //core.InitServiceMap() + // Nacos + initNacos() +} diff --git a/initialization/nacos.go b/initialization/nacos.go new file mode 100644 index 0000000..cde1d8d --- /dev/null +++ b/initialization/nacos.go @@ -0,0 +1,76 @@ +package initialization + +import ( + "gateway/core" + "gateway/utils" + "github.com/nacos-group/nacos-sdk-go/clients" + "github.com/nacos-group/nacos-sdk-go/common/constant" + "github.com/nacos-group/nacos-sdk-go/vo" + "log" +) + +// 初始化Nacos注册 +func initNacos() { + sc := []constant.ServerConfig{ + *constant.NewServerConfig("192.168.0.124", 8848), + } + cc := constant.ClientConfig{ + AppName: "gateway", + //NamespaceId: "e56f939e-6d22-449c-97d2-39a8ae5afd58", //namespace id + NamespaceId: "", + TimeoutMs: 5000, + NotLoadCacheAtStart: true, + RotateTime: "1h", + MaxAge: 3, + LogLevel: "debug", + } + configParam := vo.NacosClientParam{ + ClientConfig: &cc, + ServerConfigs: sc, + } + + client, err := clients.NewNamingClient(configParam) + + if err != nil { + panic(err) + } + ip := "gateway" + if ips := utils.GetIps(); ips != nil { + ip = ips[0] + } + success, _ := client.RegisterInstance(vo.RegisterInstanceParam{ + Ip: ip, + Port: 8889, + Weight: 10, + Enable: true, + Healthy: true, + ServiceName: "gateway", + Ephemeral: true, + }) + log.Println("Nacos注册结果: ", success) + if !success { + log.Fatal("服务注册失败,退出程序") + } + + configClient, err := clients.NewConfigClient(configParam) + if err != nil { + log.Fatalf("创建配置连接失败: %v", err.Error()) + } + _ = configClient.ListenConfig(vo.ConfigParam{ + DataId: "gateway.yml", + Group: "DEFAULT_GROUP", + OnChange: configChanged, + }) + + // 读取初始配置 + core.NacosClient = core.NewNacosClient(client, configClient) + configStr, err := configClient.GetConfig(vo.ConfigParam{DataId: "gateway.yml", Group: "DEFAULT_GROUP"}) + if err != nil { + log.Panicf("读取配置文件错误: %v", err.Error()) + } + core.ConfigChanged(configStr) +} + +func configChanged(namespace, group, dataId, data string) { + core.ConfigChanged(data) +} diff --git a/main.go b/main.go index 9812609..a58ab82 100644 --- a/main.go +++ b/main.go @@ -1,47 +1,39 @@ package main import ( - "fmt" + "gateway/core" + "gateway/initialization" + "gateway/middleware" "github.com/gin-gonic/gin" - "net" - "net/http" ) -func getIps() []string { - addrs, err := net.InterfaceAddrs() - if err != nil { - return nil - } - var ips []string - for _, address := range addrs { - // 检查ip地址判断是否回环地址 - if ipnet, ok := address.(*net.IPNet); ok && !ipnet.IP.IsLoopback() { - if ipnet.IP.To4() != nil { - ip := ipnet.IP.String() - fmt.Println(ip) - ips = append(ips, ip) - } - } - } - //ipStr := strings.Join(aaaa, ",") - return ips -} - func main() { + // 初始化系统 + initialization.InitSystem() + // 创建默认Web服务 app := gin.Default() - initNacos() - app.GET("/hello", func(context *gin.Context) { - context.String(http.StatusOK, get("get", context.Request.RequestURI)) - }) + app.Use(middleware.GenRequestId(), middleware.OpenTracing()) - app.POST("/hello", func(context *gin.Context) { - context.String(http.StatusOK, post(context.Request.RequestURI)) - }) + app.Any("/*action", core.NacosClient.Remote) - app.GET("/ip", func(context *gin.Context) { - context.String(http.StatusOK, get("get", context.Request.RequestURI)) - }) + //app.GET("/hello", func(context *gin.Context) { + // dd := context.GetString("UberTraceId") + // //log.Println("数据是否存在: ", boo) + // //if boo { + // // log.Println(dd) + // //} + // context.String(http.StatusOK, get("get", context.Request.RequestURI, context.GetString("X-Request-Id"), dd)) + //}) + // + //app.POST("/hello", func(context *gin.Context) { + // context.String(http.StatusOK, post(context.Request.RequestURI)) + //}) + // + //app.GET("/ip", func(context *gin.Context) { + // dd := context.GetString("UberTraceId") + // context.String(http.StatusOK, get("get", context.Request.RequestURI, context.GetString("X-Request-Id"), dd)) + //}) - app.Run(":8889") + _ = app.Run(":8889") } diff --git a/middleware/jaeger.go b/middleware/jaeger.go new file mode 100644 index 0000000..02e56bf --- /dev/null +++ b/middleware/jaeger.go @@ -0,0 +1,78 @@ +package middleware + +import ( + "fmt" + "github.com/gin-gonic/gin" + "github.com/opentracing/opentracing-go" + "github.com/opentracing/opentracing-go/ext" + "github.com/uber/jaeger-client-go/config" + "io" +) + +const ( + AppName = "gateway" + JaegerHostPort = "192.168.0.124:6831" +) + +func OpenTracing() gin.HandlerFunc { + return func(c *gin.Context) { + var parentSpan opentracing.Span + + tracer, closer := NewJaegerTracer(AppName) + defer closer.Close() + + spCtx, err := opentracing.GlobalTracer().Extract(opentracing.HTTPHeaders, opentracing.HTTPHeadersCarrier(c.Request.Header)) + + if err != nil { + parentSpan = tracer.StartSpan(c.Request.URL.Path) + defer parentSpan.Finish() + } else { + parentSpan = opentracing.StartSpan( + c.Request.URL.Path, + opentracing.ChildOf(spCtx), + opentracing.Tag{Key: string(ext.Component), Value: "HTTP"}, + ext.SpanKindRPCServer, + ) + defer parentSpan.Finish() + } + + c.Set("Tracer", tracer) + asd := fmt.Sprintf("%v", parentSpan.Context()) + c.Set("UberTraceId", asd) + c.Set("ParentSpanContext", parentSpan.Context()) + + c.Next() + + ext.HTTPStatusCode.Set(parentSpan, uint16(c.Writer.Status())) + + if c.Writer.Status() > 299 { + ext.Error.Set(parentSpan, true) + } + } +} + +//var Tracer opentracing.Tracer + +func NewJaegerTracer(serviceName string) (opentracing.Tracer, io.Closer) { + cfg := &config.Configuration{ + Sampler: &config.SamplerConfig{ + Type: "const", //固定采样 + Param: 1, //1=全采样、0=不采样 + }, + + Reporter: &config.ReporterConfig{ + LogSpans: true, + LocalAgentHostPort: JaegerHostPort, + }, + + ServiceName: serviceName, + } + + tracer, closer, err := cfg.NewTracer() + if err != nil { + return nil, nil + } + opentracing.SetGlobalTracer(tracer) + //Tracer = tracer + return tracer, closer +} diff --git a/middleware/request.go b/middleware/request.go new file mode 100644 index 0000000..efed29c --- /dev/null +++ b/middleware/request.go @@ -0,0 +1,24 @@ +package middleware + +import ( + "github.com/gin-gonic/gin" + "github.com/nacos-group/nacos-sdk-go/inner/uuid" + "log" +) + +// GenRequestId 生成RequestId +func GenRequestId() gin.HandlerFunc { + return func(c *gin.Context) { + requestId := c.Request.Header.Get("X-Request-Id") + if requestId == "" { + u, err := uuid.NewV4() + if err != nil { + log.Printf("生成UUID错误: %v\n", err.Error()) + } else { + requestId = u.String() + } + } + c.Set("X-Request-Id", requestId) + c.Writer.Header().Set("X-Request-Id", requestId) + } +} diff --git a/utils/ip_utils.go b/utils/ip_utils.go new file mode 100644 index 0000000..242ee80 --- /dev/null +++ b/utils/ip_utils.go @@ -0,0 +1,27 @@ +package utils + +import ( + "fmt" + "net" +) + +// GetIps 获取本机IP地址 +func GetIps() []string { + addrs, err := net.InterfaceAddrs() + if err != nil { + return nil + } + var ips []string + for _, address := range addrs { + // 检查ip地址判断是否回环地址 + if ipnet, ok := address.(*net.IPNet); ok && !ipnet.IP.IsLoopback() { + if ipnet.IP.To4() != nil { + ip := ipnet.IP.String() + fmt.Println(ip) + ips = append(ips, ip) + } + } + } + //ipStr := strings.Join(aaaa, ",") + return ips +}