diff --git a/web-framework/go/gin/publish.yaml b/web-framework/go/gin/publish.yaml index cc24e7d58..1172c48b2 100644 --- a/web-framework/go/gin/publish.yaml +++ b/web-framework/go/gin/publish.yaml @@ -3,7 +3,7 @@ Type: Project Name: start-gin-cap Provider: - 阿里云 -Version: 0.0.5 +Version: dev Description: 本案例展示了如何将 Gin,Go 语言社区中倍受追捧的轻量级 Web 框架,迅速构建并部署至云原生应用开发平台(CAP)。Gin 凭借其高效的处理能力、极简设计及高度灵活性,赢得了众多 Go 开发者的芳心,成为快速开发高质量 Web 应用和服务的首选武器。 HomePage: https://github.com/devsapp/start-web-framework/tree/dipper/web-framework/go/gin Organization: 阿里云函数计算(FC) @@ -12,6 +12,7 @@ Tags: - Web框架 - gin - Custom Runtime + - Develop Category: Web框架 Service: 函数计算: @@ -26,6 +27,7 @@ Parameters: required: # 必填项 - region - functionName + - roleArn properties: region: title: 地域 @@ -58,3 +60,17 @@ Parameters: default: gin-${default-suffix} pattern: "^[a-zA-Z_][a-zA-Z0-9-_]{0,127}$" description: 函数名称,只能包含字母、数字、下划线和中划线。不能以数字、中划线开头。长度在 1-128 之间 + roleArn: + title: 服务角色ARN + type: string + default: "AliyunFCDefaultRole" + pattern: "^acs:ram::[0-9]*:role/.*$" + description: "函数计算访问其他云服务时使用的服务角色,需要填写具体的角色ARN,格式为acs:ram::$account-id>:role/$role-name。例如:acs:ram::14310000000:role/aliyunfcdefaultrole。 + \n如果您没有特殊要求,可以使用函数计算提供的默认的服务角色,即AliyunFCDefaultRole。如果您首次使用函数计算,可以访问 https://fcnext.console.aliyun.com 进行授权。 + \n详细文档参考 https://help.aliyun.com/document_detail/181589.html?spm=5176.fcnext.help.dexternal.7bea78c8sVHoRf#section-o93-dbr-z6o" + x-role: + name: AliyunFCDefaultRole + service: fc + authorities: + - AliyunOSSFullAccess + - AliyunFCDefaultRolePolicy diff --git a/web-framework/go/gin/src/build.yaml b/web-framework/go/gin/src/build.yaml index 3d96e5f56..bbacec8f5 100644 --- a/web-framework/go/gin/src/build.yaml +++ b/web-framework/go/gin/src/build.yaml @@ -1,7 +1,9 @@ start_gin: default: languages: - - go1.8 + - go1.18 steps: - - run: GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o target/main - path: ./code \ No newline at end of file + - run: go mod tidy + path: ./myapp + - run: GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o main + path: ./myapp \ No newline at end of file diff --git a/web-framework/go/gin/src/code/go.mod b/web-framework/go/gin/src/code/go.mod deleted file mode 100644 index 24d0beb4d..000000000 --- a/web-framework/go/gin/src/code/go.mod +++ /dev/null @@ -1,26 +0,0 @@ -module example.com/m - -go 1.18 - -require github.com/gin-gonic/gin v1.8.2 - -require ( - github.com/gin-contrib/sse v0.1.0 // indirect - github.com/go-playground/locales v0.14.0 // indirect - github.com/go-playground/universal-translator v0.18.0 // indirect - github.com/go-playground/validator/v10 v10.11.1 // indirect - github.com/goccy/go-json v0.9.11 // indirect - github.com/json-iterator/go v1.1.12 // indirect - github.com/leodido/go-urn v1.2.1 // indirect - github.com/mattn/go-isatty v0.0.16 // indirect - github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect - github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/pelletier/go-toml/v2 v2.0.6 // indirect - github.com/ugorji/go/codec v1.2.7 // indirect - golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3 // indirect - golang.org/x/net v0.4.0 // indirect - golang.org/x/sys v0.3.0 // indirect - golang.org/x/text v0.5.0 // indirect - google.golang.org/protobuf v1.28.1 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect -) diff --git a/web-framework/go/gin/src/code/go.sum b/web-framework/go/gin/src/code/go.sum deleted file mode 100644 index 7aee98dfc..000000000 --- a/web-framework/go/gin/src/code/go.sum +++ /dev/null @@ -1,95 +0,0 @@ -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/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.8.2 h1:UzKToD9/PoFj/V4rvlKqTRKnQYyz8Sc1MJlv4JHPtvY= -github.com/gin-gonic/gin v1.8.2/go.mod h1:qw5AYuDrzRTnhvusDsrov+fDIxp9Dleuu12h8nfB398= -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.14.0 h1:u50s323jtVGugKlcYeyzC0etD1HifMjqmJqb8WugfUU= -github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs= -github.com/go-playground/universal-translator v0.18.0 h1:82dyy6p4OuJq4/CByFNOn/jYrnRPArHwAcmLoJZxyho= -github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA= -github.com/go-playground/validator/v10 v10.11.1 h1:prmOlTVv+YjZjmRmNSF3VmspqJIxJWXmqUsHwfTRRkQ= -github.com/go-playground/validator/v10 v10.11.1/go.mod h1:i+3WkQ1FvaUjjxh1kSvIA4dMGDBiPU55YFDl0WbKdWU= -github.com/goccy/go-json v0.9.11 h1:/pAaQDLHEoCq/5FFmSKBswWmK6H0e8g4159Kc/X/nqk= -github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= -github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= -github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -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.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w= -github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= -github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= -github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/pelletier/go-toml/v2 v2.0.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvIwycIU= -github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8= -github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6M= -github.com/ugorji/go/codec v1.2.7 h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0= -github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY= -golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3 h1:0es+/5331RGQPcXlMfP+WrnIIS6dNnNRe0WB02W0F4M= -golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.4.0 h1:Q5QPcMlvfxFTAPV0+07Xz/MpK9NTXu2VDUuy0FeMfaU= -golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.3.0 h1:w8ZOecv6NaNa/zC8944JTU3vz4u6Lagfk4RPQxv92NQ= -golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.5.0 h1:OLmvp0KP+FVG99Ct/qFiL/Fhk4zp4QQnZ7b2U+5piUM= -golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= -google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/web-framework/go/gin/src/code/main.go b/web-framework/go/gin/src/code/main.go deleted file mode 100644 index 3683685bf..000000000 --- a/web-framework/go/gin/src/code/main.go +++ /dev/null @@ -1,28 +0,0 @@ -package main - -import ( - "github.com/gin-gonic/gin" -) - -func main() { - r := gin.Default() - r.GET("/ping", func(c *gin.Context) { - c.JSON(200, gin.H{ - "message": "pong", - }) - }) - r.GET("/", func(c *gin.Context) { - queryParams := c.Request.URL.Query() - headers := c.Request.Header - path := c.Request.URL.Path - - c.JSON(200, gin.H{ - "message": "hello world", - "query": queryParams, - "headers": headers, - "path": path, - }) - }) - // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080") - r.Run() -} diff --git a/web-framework/go/gin/src/myapp/.fcignore b/web-framework/go/gin/src/myapp/.fcignore new file mode 100644 index 000000000..b277fdeb1 --- /dev/null +++ b/web-framework/go/gin/src/myapp/.fcignore @@ -0,0 +1,8 @@ +go.mod +go.sum +main.go +vendor/ +src/ +pkg/ +bin/ +.fcignore \ No newline at end of file diff --git a/web-framework/go/gin/src/myapp/assets/css/style.css b/web-framework/go/gin/src/myapp/assets/css/style.css new file mode 100644 index 000000000..b085936ca --- /dev/null +++ b/web-framework/go/gin/src/myapp/assets/css/style.css @@ -0,0 +1,7 @@ +body { + font-family: Arial, sans-serif; +} + +h1 { + color: #333; +} \ No newline at end of file diff --git a/web-framework/go/gin/src/myapp/go.mod b/web-framework/go/gin/src/myapp/go.mod new file mode 100644 index 000000000..5b133321d --- /dev/null +++ b/web-framework/go/gin/src/myapp/go.mod @@ -0,0 +1,41 @@ +module myapp + +go 1.18 + +require ( + github.com/aliyun/aliyun-oss-go-sdk v2.2.6+incompatible + github.com/gin-gonic/gin v1.10.0 + github.com/google/uuid v1.6.0 + github.com/pkg/errors v0.9.1 + github.com/sirupsen/logrus v1.9.3 +) + +require ( + github.com/bytedance/sonic v1.11.8 // indirect + github.com/bytedance/sonic/loader v0.1.1 // indirect + github.com/cloudwego/base64x v0.1.4 // indirect + github.com/cloudwego/iasm v0.2.0 // indirect + github.com/gabriel-vasile/mimetype v1.4.4 // indirect + github.com/gin-contrib/sse v0.1.0 // indirect + github.com/go-playground/locales v0.14.1 // indirect + github.com/go-playground/universal-translator v0.18.1 // indirect + github.com/go-playground/validator/v10 v10.21.0 // indirect + github.com/goccy/go-json v0.10.3 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/cpuid/v2 v2.2.7 // indirect + github.com/leodido/go-urn v1.4.0 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/pelletier/go-toml/v2 v2.2.2 // indirect + github.com/twitchyliquid64/golang-asm v0.15.1 // indirect + github.com/ugorji/go/codec v1.2.12 // indirect + golang.org/x/arch v0.8.0 // indirect + golang.org/x/crypto v0.23.0 // indirect + golang.org/x/net v0.25.0 // indirect + golang.org/x/sys v0.20.0 // indirect + golang.org/x/text v0.15.0 // indirect + golang.org/x/time v0.5.0 // indirect + google.golang.org/protobuf v1.34.1 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/web-framework/go/gin/src/myapp/go.sum b/web-framework/go/gin/src/myapp/go.sum new file mode 100644 index 000000000..a209bdb3c --- /dev/null +++ b/web-framework/go/gin/src/myapp/go.sum @@ -0,0 +1,97 @@ +github.com/aliyun/aliyun-oss-go-sdk v2.2.6+incompatible h1:KXeJoM1wo9I/6xPTyt6qCxoSZnmASiAjlrr0dyTUKt8= +github.com/aliyun/aliyun-oss-go-sdk v2.2.6+incompatible/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8= +github.com/bytedance/sonic v1.11.8 h1:Zw/j1KfiS+OYTi9lyB3bb0CFxPJVkM17k1wyDG32LRA= +github.com/bytedance/sonic v1.11.8/go.mod h1:LysEHSvpvDySVdC2f87zGWf6CIKJcAvqab1ZaiQtds4= +github.com/bytedance/sonic/loader v0.1.1 h1:c+e5Pt1k/cy5wMveRDyk2X4B9hF4g7an8N3zCYjJFNM= +github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= +github.com/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/0Y= +github.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w= +github.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg= +github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY= +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/gabriel-vasile/mimetype v1.4.4 h1:QjV6pZ7/XZ7ryI2KuyeEDE8wnh7fHP9YnQy+R0LnH8I= +github.com/gabriel-vasile/mimetype v1.4.4/go.mod h1:JwLei5XPtWdGiMFB5Pjle1oEeoSeEuJfJE+TtfvdB/s= +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.10.0 h1:nTuyha1TYqgedzytsKYqna+DfLos46nTv2ygFy86HFU= +github.com/gin-gonic/gin v1.10.0/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y= +github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= +github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= +github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= +github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= +github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= +github.com/go-playground/validator/v10 v10.21.0 h1:4fZA11ovvtkdgaeev9RGWPgc1uj3H8W+rNYyH/ySBb0= +github.com/go-playground/validator/v10 v10.21.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= +github.com/goccy/go-json v0.10.3 h1:KZ5WoDbxAIgm2HNbYckL0se1fHD6rz5j4ywS6ebzDqA= +github.com/goccy/go-json v0.10.3/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= +github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM= +github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= +github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= +github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= +github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +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/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +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= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= +github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= +github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE= +github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= +golang.org/x/arch v0.8.0 h1:3wRIsP3pM4yUptoR96otTUOXI367OS0+c9eeRi9doIc= +golang.org/x/arch v0.8.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys= +golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= +golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= +golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= +golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= +golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= +google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= +google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= diff --git a/web-framework/go/gin/src/myapp/main.go b/web-framework/go/gin/src/myapp/main.go new file mode 100644 index 000000000..53e7ce768 --- /dev/null +++ b/web-framework/go/gin/src/myapp/main.go @@ -0,0 +1,25 @@ +package main + +import ( + "github.com/gin-gonic/gin" + + "myapp/pkg/logging" + "myapp/src/routes" +) + +func main() { + router := gin.Default() + router.Use(logging.RequestIDMiddleware()) + + // 设置静态文件路径 + router.Static("/assets", "./assets") + + // 加载视图文件 + router.LoadHTMLGlob("views/*") + + // 初始化路由 + routes.InitRoutes(router) + + // 运行服务器 + router.Run(":8080") // 监听并在 0.0.0.0:8080 上启动服务 +} diff --git a/web-framework/go/gin/src/myapp/pkg/constant/system.go b/web-framework/go/gin/src/myapp/pkg/constant/system.go new file mode 100644 index 000000000..73d520d76 --- /dev/null +++ b/web-framework/go/gin/src/myapp/pkg/constant/system.go @@ -0,0 +1,9 @@ +package constant + +const ( + RequestID = "RequestID" + FC_REGION = "FC_REGION" + ALIBABA_CLOUD_ACCESS_KEY_ID = "ALIBABA_CLOUD_ACCESS_KEY_ID" + ALIBABA_CLOUD_ACCESS_KEY_SECRET = "ALIBABA_CLOUD_ACCESS_KEY_SECRET" + ALIBABA_CLOUD_SECURITY_TOKEN = "ALIBABA_CLOUD_SECURITY_TOKEN" +) diff --git a/web-framework/go/gin/src/myapp/pkg/logging/config.go b/web-framework/go/gin/src/myapp/pkg/logging/config.go new file mode 100644 index 000000000..5187df53a --- /dev/null +++ b/web-framework/go/gin/src/myapp/pkg/logging/config.go @@ -0,0 +1,43 @@ +package logging + +import ( + "fmt" + "os" + "time" + + "github.com/sirupsen/logrus" + + "myapp/pkg/constant" +) + +type customFormatter struct{} + +func (f *customFormatter) Format(entry *logrus.Entry) ([]byte, error) { + timestamp := entry.Time.Format(time.RFC3339) + message := entry.Message + level := entry.Level.String() + requestID, ok := entry.Data[constant.RequestID] + if !ok { + requestID, ok = entry.Context.Value(constant.RequestID).(string) + if !ok { + requestID = "" + } + } + + // 注意:获取调用者的代码路径需开启logrus的ReportCaller,这会有性能开销 + caller := "unknown" + if entry.HasCaller() { + caller = fmt.Sprintf("%s:%d", entry.Caller.File, entry.Caller.Line) + } + + log := fmt.Sprintf("%s - %s - %s - %s: %s\n", timestamp, requestID, level, caller, message) + return []byte(log), nil +} + +func init() { + formatter := &customFormatter{} + logrus.SetFormatter(formatter) + logrus.SetReportCaller(true) + logrus.SetLevel(logrus.InfoLevel) + logrus.SetOutput(os.Stdout) +} diff --git a/web-framework/go/gin/src/myapp/pkg/logging/logging_middleware.go b/web-framework/go/gin/src/myapp/pkg/logging/logging_middleware.go new file mode 100644 index 000000000..a3b8c5ae7 --- /dev/null +++ b/web-framework/go/gin/src/myapp/pkg/logging/logging_middleware.go @@ -0,0 +1,24 @@ +package logging + +import ( + "strings" + + "github.com/gin-gonic/gin" + "github.com/google/uuid" + + "myapp/pkg/constant" +) + +func RequestIDMiddleware() gin.HandlerFunc { + return func(c *gin.Context) { + requestID := c.GetHeader("X-Fc-Request-Id") + if requestID == "" { + // 随机生成request-id,这里使用简单的示例,建议使用更复杂的生成方式 + requestID = strings.ToLower(uuid.New().String()) + } + // 将request-id设置到Gin的Context中,方便后续的handler获取 + c.Set(constant.RequestID, requestID) + c.Header("X-Fc-Request-Id", requestID) + c.Next() + } +} diff --git a/web-framework/go/gin/src/myapp/pkg/services/oss.go b/web-framework/go/gin/src/myapp/pkg/services/oss.go new file mode 100644 index 000000000..971bea0f6 --- /dev/null +++ b/web-framework/go/gin/src/myapp/pkg/services/oss.go @@ -0,0 +1,39 @@ +package services + +import ( + "os" + + "github.com/aliyun/aliyun-oss-go-sdk/oss" + + "myapp/pkg/constant" +) + +type OssService struct { + ossClient *oss.Client +} + +func NewOSSServiceFromEnv() *OssService { + regionID := os.Getenv(constant.FC_REGION) + accessKeyID := os.Getenv(constant.ALIBABA_CLOUD_ACCESS_KEY_ID) + accessKeySecret := os.Getenv(constant.ALIBABA_CLOUD_ACCESS_KEY_SECRET) + securityToken := os.Getenv(constant.ALIBABA_CLOUD_SECURITY_TOKEN) + endpoint := "oss-" + regionID + "-internal.aliyuncs.com" + + ossClient, err := oss.New(endpoint, accessKeyID, accessKeySecret, func(client *oss.Client) { + client.Config.SecurityToken = securityToken + }) + if err != nil { + panic(err) + } + return &OssService{ + ossClient: ossClient, + } +} + +func (s *OssService) ListBuckets() ([]oss.BucketProperties, error) { + res, err := s.ossClient.ListBuckets() + if err != nil { + return nil, err + } + return res.Buckets, nil +} diff --git a/web-framework/go/gin/src/myapp/src/controllers/debug.go b/web-framework/go/gin/src/myapp/src/controllers/debug.go new file mode 100644 index 000000000..661c23080 --- /dev/null +++ b/web-framework/go/gin/src/myapp/src/controllers/debug.go @@ -0,0 +1,53 @@ +package controllers + +import ( + "os" + "strings" + + "github.com/gin-gonic/gin" + logger "github.com/sirupsen/logrus" + + "myapp/pkg/constant" +) + +func SetupDebugRouters(e *gin.Engine) { + g := e.Group("/debug") + g.Any("/displayHttpContext", DebugAPI) +} + +func DebugAPI(c *gin.Context) { + env := getEnvAsMap() + if env[constant.ALIBABA_CLOUD_ACCESS_KEY_ID] != "" { + env[constant.ALIBABA_CLOUD_ACCESS_KEY_ID] = "encrypted" + } + if env[constant.ALIBABA_CLOUD_ACCESS_KEY_SECRET] != "" { + env[constant.ALIBABA_CLOUD_ACCESS_KEY_SECRET] = "encrypted" + } + if env[constant.ALIBABA_CLOUD_SECURITY_TOKEN] != "" { + env[constant.ALIBABA_CLOUD_SECURITY_TOKEN] = "encrypted" + } + result := gin.H{ + "path": c.Request.URL.Path, + "body": "", // Gin中读取请求体要用c.Request.Body,且只能读取一次 + "method": c.Request.Method, + "queries": c.Request.URL.Query(), + "headers": c.Request.Header, + "env": env, // Go的环境变量是通过os包获取的 + } + + logger.WithContext(c).Infof("receive request: %#v", result) // 使用Go的内置日志库,但可以选择更强大的库如logrus + c.JSON(200, result) +} + +func getEnvAsMap() map[string]string { + envs := os.Environ() + envMap := make(map[string]string, len(envs)) + + for _, env := range envs { + pair := strings.SplitN(env, "=", 2) // 仅分割第一个"=",以确保值中的"="不会被分割 + if len(pair) == 2 { + envMap[pair[0]] = pair[1] + } + } + return envMap +} diff --git a/web-framework/go/gin/src/myapp/src/controllers/oss.go b/web-framework/go/gin/src/myapp/src/controllers/oss.go new file mode 100644 index 000000000..7e4bda499 --- /dev/null +++ b/web-framework/go/gin/src/myapp/src/controllers/oss.go @@ -0,0 +1,33 @@ +package controllers + +import ( + logger "github.com/sirupsen/logrus" + + "myapp/pkg/services" + + "github.com/gin-gonic/gin" + "github.com/pkg/errors" +) + +func SetupOSSRouters(e *gin.Engine) { + g := e.Group("/oss") + f := &OSSFunc{ + ossService: services.NewOSSServiceFromEnv(), + } + g.GET("/listBuckets", f.ListBuckets) +} + +type OSSFunc struct { + ossService *services.OssService +} + +func (s *OSSFunc) ListBuckets(c *gin.Context) { + result, err := s.ossService.ListBuckets() + if err != nil { + logger.WithContext(c).Errorf("failed to list buckets: %v", err) + c.JSON(500, gin.H{ + "error": errors.Wrapf(err, "failed to list buckets").Error(), + }) + } + c.JSON(200, result) +} diff --git a/web-framework/go/gin/src/myapp/src/controllers/welcome.go b/web-framework/go/gin/src/myapp/src/controllers/welcome.go new file mode 100644 index 000000000..4e743a228 --- /dev/null +++ b/web-framework/go/gin/src/myapp/src/controllers/welcome.go @@ -0,0 +1,16 @@ +package controllers + +import ( + "github.com/gin-gonic/gin" +) + +func SetupWelcomeRouters(e *gin.Engine) { + e.GET("/", RenderWelcomePage) +} + +// RenderWelcomePage 渲染首页 +func RenderWelcomePage(c *gin.Context) { + c.HTML(200, "index.html", gin.H{ + "title": "CAP Gin Demo - Powered By CAP", + }) +} diff --git a/web-framework/go/gin/src/myapp/src/routes/routes.go b/web-framework/go/gin/src/myapp/src/routes/routes.go new file mode 100644 index 000000000..5d9777dbe --- /dev/null +++ b/web-framework/go/gin/src/myapp/src/routes/routes.go @@ -0,0 +1,22 @@ +package routes + +import ( + "myapp/src/controllers" + + "github.com/gin-gonic/gin" +) + +type RouterOptions func(router *gin.Engine) + +var opts = []RouterOptions{ + controllers.SetupDebugRouters, + controllers.SetupWelcomeRouters, + controllers.SetupOSSRouters, +} + +// InitRoutes 初始化路由规则 +func InitRoutes(router *gin.Engine) { + for _, opt := range opts { + opt(router) + } +} diff --git a/web-framework/go/gin/src/myapp/views/index.html b/web-framework/go/gin/src/myapp/views/index.html new file mode 100644 index 000000000..7cfa77355 --- /dev/null +++ b/web-framework/go/gin/src/myapp/views/index.html @@ -0,0 +1,22 @@ + + + + + {{ .title }} + + + +
+
+

Devsapp

+

这是一个 Gin 项目

+ 通过云原生应用平台进行部署,并展示如何操作云资源(OSS) +

修改代码提交后即可自动构建、部署
+ Serverless Devs 钉钉交流群:33947367


+ + 获取OSS Bucket列表
+ 获取HTTP上下文 +
+
+ + \ No newline at end of file diff --git a/web-framework/go/gin/src/s.yaml b/web-framework/go/gin/src/s.yaml index 75c5b73cb..78ff85526 100644 --- a/web-framework/go/gin/src/s.yaml +++ b/web-framework/go/gin/src/s.yaml @@ -10,9 +10,9 @@ resources: actions: pre-deploy: - run: >- - GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o target/main + GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o main main.go - path: ./code + path: ./myapp props: region: ${vars.region} description: gin function @@ -27,7 +27,8 @@ resources: - /code/main port: 8080 functionName: "{{ functionName }}" - code: ./code/target + code: ./myapp + role: "{{ roleArn }}" logConfig: auto triggers: - triggerName: httpTrigger