configuration.go 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. package configuration
  2. import (
  3. "git.sxidc.com/go-framework/baize/framework/core/api"
  4. "git.sxidc.com/go-framework/baize/framework/gateway"
  5. "git.sxidc.com/go-tools/utils/strutils"
  6. "git.sxidc.com/service-supports/fserr"
  7. "github.com/gin-gonic/gin"
  8. "net/http"
  9. "net/url"
  10. "sync"
  11. )
  12. type Option func(options *Options)
  13. type Options struct {
  14. serviceApiVersion string
  15. }
  16. func WithServiceApiVersion(serviceApiVersion string) Option {
  17. return func(options *Options) {
  18. options.serviceApiVersion = serviceApiVersion
  19. }
  20. }
  21. var serviceBaseUrlMap sync.Map
  22. func RegisterService(serviceShortName string, baseUrl string) {
  23. serviceBaseUrlMap.Store(serviceShortName, baseUrl)
  24. }
  25. func BuildGateway(gw *gateway.Gateway, opts ...Option) {
  26. options := new(Options)
  27. for _, opt := range opts {
  28. opt(options)
  29. }
  30. builder := gw.NewBuilder(api.RouterPrefix, "")
  31. // 创建
  32. builder.
  33. Url(http.MethodPost, "/configuration/create").
  34. Post(gateway.NewPostRequest("",
  35. gateway.PostRequestWithUrlTransferFunc(
  36. func(c *api.Context, _ string, historyRequest []gateway.BuilderRequest, resultMap map[string]any) (string, error) {
  37. jsonBody, err := c.GetJsonBody()
  38. if err != nil {
  39. return "", err
  40. }
  41. serviceShortName, ok := jsonBody.Get("serviceShortName").(string)
  42. if !ok {
  43. return "", fserr.New("没有传递服务名缩写或服务名缩写不是string类型")
  44. }
  45. jsonBody.Delete("serviceShortName")
  46. serviceBaseUrl, loaded := serviceBaseUrlMap.Load(serviceShortName)
  47. if !loaded {
  48. return "", fserr.New("没有注册对应的服务: " + serviceShortName)
  49. }
  50. var serviceUrl string
  51. if strutils.IsStringEmpty(options.serviceApiVersion) {
  52. innerServiceUrl, err := url.JoinPath(serviceBaseUrl.(string), serviceShortName, "/api", "/configuration/create")
  53. if err != nil {
  54. return "", err
  55. }
  56. serviceUrl = innerServiceUrl
  57. } else {
  58. innerServiceUrl, err := url.JoinPath(serviceBaseUrl.(string), serviceShortName, "/api", options.serviceApiVersion, "/configuration/create")
  59. if err != nil {
  60. return "", err
  61. }
  62. serviceUrl = innerServiceUrl
  63. }
  64. return serviceUrl, nil
  65. })), nil).
  66. Build()
  67. // 删除
  68. builder.
  69. Url(http.MethodPost, "/configuration/delete").
  70. Post(gateway.NewPostRequest("",
  71. gateway.PostRequestWithUrlTransferFunc(
  72. func(c *api.Context, _ string, historyRequest []gateway.BuilderRequest, resultMap map[string]any) (string, error) {
  73. jsonBody, err := c.GetJsonBody()
  74. if err != nil {
  75. return "", err
  76. }
  77. serviceShortName, ok := jsonBody.Get("serviceShortName").(string)
  78. if !ok {
  79. return "", fserr.New("没有传递服务名缩写或服务名缩写不是string类型")
  80. }
  81. jsonBody.Delete("serviceShortName")
  82. serviceBaseUrl, loaded := serviceBaseUrlMap.Load(serviceShortName)
  83. if !loaded {
  84. return "", fserr.New("没有注册对应的服务: " + serviceShortName)
  85. }
  86. var serviceUrl string
  87. if strutils.IsStringEmpty(options.serviceApiVersion) {
  88. innerServiceUrl, err := url.JoinPath(serviceBaseUrl.(string), serviceShortName, "/api", "/configuration/delete")
  89. if err != nil {
  90. return "", err
  91. }
  92. serviceUrl = innerServiceUrl
  93. } else {
  94. innerServiceUrl, err := url.JoinPath(serviceBaseUrl.(string), serviceShortName, "/api", options.serviceApiVersion, "/configuration/delete")
  95. if err != nil {
  96. return "", err
  97. }
  98. serviceUrl = innerServiceUrl
  99. }
  100. return serviceUrl, nil
  101. })), nil).
  102. Build()
  103. // 查询
  104. builder.
  105. Url(http.MethodGet, "/configuration/values").
  106. Get(gateway.NewGetRequest("",
  107. gateway.GetRequestWithUrlTransferFunc(
  108. func(c *api.Context, _ string, historyRequest []gateway.BuilderRequest, resultMap map[string]any) (string, error) {
  109. queryParams := c.GetQueryParams()
  110. serviceShortName := queryParams.Get("serviceShortName")
  111. if strutils.IsStringEmpty(serviceShortName) {
  112. return "", fserr.New("没有传递服务名缩写")
  113. }
  114. queryParams.Delete("serviceShortName")
  115. serviceBaseUrl, loaded := serviceBaseUrlMap.Load(serviceShortName)
  116. if !loaded {
  117. return "", fserr.New("没有注册对应的服务: " + serviceShortName)
  118. }
  119. var serviceUrl string
  120. if strutils.IsStringEmpty(options.serviceApiVersion) {
  121. innerServiceUrl, err := url.JoinPath(serviceBaseUrl.(string), serviceShortName, "/api", "/configuration/values")
  122. if err != nil {
  123. return "", err
  124. }
  125. serviceUrl = innerServiceUrl
  126. } else {
  127. innerServiceUrl, err := url.JoinPath(serviceBaseUrl.(string), serviceShortName, "/api", options.serviceApiVersion, "/configuration/values")
  128. if err != nil {
  129. return "", err
  130. }
  131. serviceUrl = innerServiceUrl
  132. }
  133. return serviceUrl, nil
  134. })), nil).
  135. Build()
  136. // 查询注册的服务
  137. builder.
  138. Url(http.MethodGet, "/configuration/registered/services").
  139. Local(func(c *api.Context) {
  140. serviceShortNames := make([]string, 0)
  141. serviceBaseUrlMap.Range(func(key any, value any) bool {
  142. serviceShortNames = append(serviceShortNames, key.(string))
  143. return true
  144. })
  145. c.JSON(http.StatusOK, gin.H{
  146. "services": serviceShortNames,
  147. })
  148. })
  149. }