github.com/polarismesh/polaris@v1.17.8/apiserver/httpserver/discover/v1/server.go (about)

     1  /**
     2   * Tencent is pleased to support the open source community by making Polaris available.
     3   *
     4   * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
     5   *
     6   * Licensed under the BSD 3-Clause License (the "License");
     7   * you may not use this file except in compliance with the License.
     8   * You may obtain a copy of the License at
     9   *
    10   * https://opensource.org/licenses/BSD-3-Clause
    11   *
    12   * Unless required by applicable law or agreed to in writing, software distributed
    13   * under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
    14   * CONDITIONS OF ANY KIND, either express or implied. See the License for the
    15   * specific language governing permissions and limitations under the License.
    16   */
    17  
    18  package v1
    19  
    20  import (
    21  	"github.com/emicklei/go-restful/v3"
    22  
    23  	"github.com/polarismesh/polaris/apiserver"
    24  	"github.com/polarismesh/polaris/apiserver/httpserver/docs"
    25  	"github.com/polarismesh/polaris/namespace"
    26  	"github.com/polarismesh/polaris/service"
    27  	"github.com/polarismesh/polaris/service/healthcheck"
    28  )
    29  
    30  type HTTPServerV1 struct {
    31  	namespaceServer   namespace.NamespaceOperateServer
    32  	namingServer      service.DiscoverServer
    33  	healthCheckServer *healthcheck.Server
    34  }
    35  
    36  func NewV1Server(
    37  	namespaceServer namespace.NamespaceOperateServer,
    38  	namingServer service.DiscoverServer,
    39  	healthCheckServer *healthcheck.Server) *HTTPServerV1 {
    40  	return &HTTPServerV1{
    41  		namespaceServer:   namespaceServer,
    42  		namingServer:      namingServer,
    43  		healthCheckServer: healthCheckServer,
    44  	}
    45  }
    46  
    47  const (
    48  	defaultReadAccess    string = "default-read"
    49  	defaultAccess        string = "default"
    50  	serviceAccess        string = "service"
    51  	circuitBreakerAccess string = "circuitbreaker"
    52  	routingAccess        string = "router"
    53  	rateLimitAccess      string = "ratelimit"
    54  )
    55  
    56  // GetNamingConsoleAccessServer 注册管理端接口
    57  func (h *HTTPServerV1) GetNamingConsoleAccessServer(include []string) (*restful.WebService, error) {
    58  	consoleAccess := []string{defaultAccess}
    59  
    60  	ws := new(restful.WebService)
    61  
    62  	ws.Path("/naming/v1").Consumes(restful.MIME_JSON).Produces(restful.MIME_JSON)
    63  
    64  	// 如果为空,则开启全部接口
    65  	if len(include) == 0 {
    66  		include = consoleAccess
    67  	}
    68  	oldInclude := include
    69  
    70  	for _, item := range oldInclude {
    71  		if item == defaultReadAccess {
    72  			include = []string{defaultReadAccess}
    73  			break
    74  		}
    75  	}
    76  
    77  	for _, item := range oldInclude {
    78  		if item == defaultAccess {
    79  			include = consoleAccess
    80  			break
    81  		}
    82  	}
    83  
    84  	for _, item := range include {
    85  		switch item {
    86  		case defaultReadAccess:
    87  			h.addDefaultReadAccess(ws)
    88  		case defaultAccess:
    89  			h.addDefaultAccess(ws)
    90  		case serviceAccess:
    91  			h.addServiceAccess(ws)
    92  		case circuitBreakerAccess:
    93  			h.addCircuitBreakerRuleAccess(ws)
    94  		case routingAccess:
    95  			h.addRoutingRuleAccess(ws)
    96  		case rateLimitAccess:
    97  			h.addRateLimitRuleAccess(ws)
    98  		}
    99  	}
   100  	return ws, nil
   101  }
   102  
   103  // addDefaultReadAccess 增加默认读接口
   104  func (h *HTTPServerV1) addDefaultReadAccess(ws *restful.WebService) {
   105  	// 管理端接口:只包含读接口
   106  	ws.Route(docs.EnrichGetNamespacesApiDocs(ws.GET("/namespaces").To(h.GetNamespaces)))
   107  	ws.Route(docs.EnrichGetServicesApiDocs(ws.GET("/services").To(h.GetServices)))
   108  	ws.Route(docs.EnrichGetServicesCountApiDocs(ws.GET("/services/count").To(h.GetServicesCount)))
   109  	ws.Route(docs.EnrichGetServiceAliasesApiDocs(ws.GET("/service/aliases").To(h.GetServiceAliases)))
   110  
   111  	ws.Route(docs.EnrichGetInstancesApiDocs(ws.GET("/instances").To(h.GetInstances)))
   112  	ws.Route(docs.EnrichGetInstancesCountApiDocs(ws.GET("/instances/count").To(h.GetInstancesCount)))
   113  	ws.Route(docs.EnrichGetRateLimitsApiDocs(ws.GET("/ratelimits").To(h.GetRateLimits)))
   114  	ws.Route(docs.EnrichGetCircuitBreakerRulesApiDocs(ws.GET("/circuitbreaker/rules").To(h.GetCircuitBreakerRules)))
   115  	ws.Route(docs.EnrichGetFaultDetectRulesApiDocs(ws.GET("/faultdetectors").To(h.GetFaultDetectRules)))
   116  
   117  	// Deprecate -- start
   118  	ws.Route(ws.GET("/namespace/token").To(h.GetNamespaceToken))
   119  	ws.Route(ws.GET("/service/token").To(h.GetServiceToken))
   120  	ws.Route(ws.POST("/service/owner").To(h.GetServiceOwner))
   121  	ws.Route(ws.GET("/service/circuitbreaker").To(h.GetCircuitBreakerByService))
   122  	ws.Route(ws.GET("/circuitbreaker").To(h.GetCircuitBreaker))
   123  	ws.Route(ws.GET("/circuitbreaker/versions").To(h.GetCircuitBreakerVersions))
   124  	ws.Route(ws.GET("/circuitbreakers/master").To(h.GetMasterCircuitBreakers))
   125  	ws.Route(ws.GET("/circuitbreakers/release").To(h.GetReleaseCircuitBreakers))
   126  	ws.Route(ws.GET("/circuitbreaker/token").To(h.GetCircuitBreakerToken))
   127  	ws.Route(ws.GET("/routings").To(h.GetRoutings))
   128  	// Deprecate -- end
   129  }
   130  
   131  // addDefaultAccess 增加默认接口
   132  func (h *HTTPServerV1) addDefaultAccess(ws *restful.WebService) {
   133  	// 管理端接口:增删改查请求全部操作存储层
   134  	h.addServiceAccess(ws)
   135  	h.addRoutingRuleAccess(ws)
   136  	h.addRateLimitRuleAccess(ws)
   137  	h.addCircuitBreakerRuleAccess(ws)
   138  }
   139  
   140  // addServiceAccess .
   141  func (h *HTTPServerV1) addServiceAccess(ws *restful.WebService) {
   142  	ws.Route(docs.EnrichCreateNamespacesApiDocsOld(ws.POST("/namespaces").To(h.CreateNamespaces)))
   143  	ws.Route(docs.EnrichDeleteNamespacesApiDocsOld(ws.POST("/namespaces/delete").To(h.DeleteNamespaces)))
   144  	ws.Route(docs.EnrichUpdateNamespacesApiDocsOld(ws.PUT("/namespaces").To(h.UpdateNamespaces)))
   145  	ws.Route(docs.EnrichGetNamespacesApiDocsOld(ws.GET("/namespaces").To(h.GetNamespaces)))
   146  	ws.Route(docs.EnrichGetNamespaceTokenApiDocsOld(ws.GET("/namespace/token").To(h.GetNamespaceToken)))
   147  	ws.Route(docs.EnrichUpdateNamespaceTokenApiDocsOld(ws.PUT("/namespace/token").To(h.UpdateNamespaceToken)))
   148  
   149  	ws.Route(docs.EnrichCreateServicesApiDocs(ws.POST("/services").To(h.CreateServices)))
   150  	ws.Route(docs.EnrichDeleteServicesApiDocs(ws.POST("/services/delete").To(h.DeleteServices)))
   151  	ws.Route(docs.EnrichUpdateServicesApiDocs(ws.PUT("/services").To(h.UpdateServices)))
   152  	ws.Route(docs.EnrichGetServicesApiDocs(ws.GET("/services").To(h.GetServices)))
   153  	ws.Route(docs.EnrichGetAllServicesApiDocs(ws.GET("/services/all").To(h.GetAllServices)))
   154  	ws.Route(docs.EnrichGetServicesCountApiDocs(ws.GET("/services/count").To(h.GetServicesCount)))
   155  	ws.Route(docs.EnrichGetServiceTokenApiDocs(ws.GET("/service/token").To(h.GetServiceToken)))
   156  	ws.Route(docs.EnrichUpdateServiceTokenApiDocs(ws.PUT("/service/token").To(h.UpdateServiceToken)))
   157  	ws.Route(docs.EnrichCreateServiceAliasApiDocs(ws.POST("/service/alias").To(h.CreateServiceAlias)))
   158  	ws.Route(docs.EnrichUpdateServiceAliasApiDocs(ws.PUT("/service/alias").To(h.UpdateServiceAlias)))
   159  	ws.Route(docs.EnrichGetServiceAliasesApiDocs(ws.GET("/service/aliases").To(h.GetServiceAliases)))
   160  	ws.Route(docs.EnrichDeleteServiceAliasesApiDocs(ws.POST("/service/aliases/delete").To(h.DeleteServiceAliases)))
   161  
   162  	ws.Route(docs.EnrichCreateInstancesApiDocs(ws.POST("/instances").To(h.CreateInstances)))
   163  	ws.Route(docs.EnrichDeleteInstancesApiDocs(ws.POST("/instances/delete").To(h.DeleteInstances)))
   164  	ws.Route(docs.EnrichDeleteInstancesByHostApiDocs(
   165  		ws.POST("/instances/delete/host").To(h.DeleteInstancesByHost)))
   166  	ws.Route(docs.EnrichUpdateInstancesApiDocs(ws.PUT("/instances").To(h.UpdateInstances)))
   167  	ws.Route(docs.EnrichUpdateInstancesIsolateApiDocs(
   168  		ws.PUT("/instances/isolate/host").To(h.UpdateInstancesIsolate)))
   169  	ws.Route(docs.EnrichGetInstancesApiDocs(ws.GET("/instances").To(h.GetInstances)))
   170  	ws.Route(docs.EnrichGetInstancesCountApiDocs(ws.GET("/instances/count").To(h.GetInstancesCount)))
   171  	ws.Route(docs.EnrichGetInstanceLabelsApiDocs(ws.GET("/instances/labels").To(h.GetInstanceLabels)))
   172  
   173  	ws.Route(ws.POST("/service/owner").To(h.GetServiceOwner))
   174  }
   175  
   176  // addRoutingRuleAccess 增加默认接口
   177  func (h *HTTPServerV1) addRoutingRuleAccess(ws *restful.WebService) {
   178  	// Deprecate -- start
   179  	ws.Route(ws.POST("/routings").To(h.CreateRoutings))
   180  	ws.Route(ws.POST("/routings/delete").To(h.DeleteRoutings))
   181  	ws.Route(ws.PUT("/routings").To(h.UpdateRoutings))
   182  	ws.Route(ws.GET("/routings").To(h.GetRoutings))
   183  	// Deprecate -- end
   184  }
   185  
   186  func (h *HTTPServerV1) addRateLimitRuleAccess(ws *restful.WebService) {
   187  	ws.Route(docs.EnrichCreateRateLimitsApiDocs(ws.POST("/ratelimits").To(h.CreateRateLimits)))
   188  	ws.Route(docs.EnrichDeleteRateLimitsApiDocs(ws.POST("/ratelimits/delete").To(h.DeleteRateLimits)))
   189  	ws.Route(docs.EnrichUpdateRateLimitsApiDocs(ws.PUT("/ratelimits").To(h.UpdateRateLimits)))
   190  	ws.Route(docs.EnrichGetRateLimitsApiDocs(ws.GET("/ratelimits").To(h.GetRateLimits)))
   191  	ws.Route(docs.EnrichEnableRateLimitsApiDocs(ws.PUT("/ratelimits/enable").To(h.EnableRateLimits)))
   192  }
   193  
   194  func (h *HTTPServerV1) addCircuitBreakerRuleAccess(ws *restful.WebService) {
   195  	// Deprecate -- start
   196  	ws.Route(ws.POST("/circuitbreakers").To(h.CreateCircuitBreakers))
   197  	ws.Route(ws.POST("/circuitbreakers/version").To(h.CreateCircuitBreakerVersions))
   198  	ws.Route(ws.POST("/circuitbreakers/delete").To(h.DeleteCircuitBreakers))
   199  	ws.Route(ws.PUT("/circuitbreakers").To(h.UpdateCircuitBreakers))
   200  	ws.Route(ws.POST("/circuitbreakers/release").To(h.ReleaseCircuitBreakers))
   201  	ws.Route(ws.POST("/circuitbreakers/unbind").To(h.UnBindCircuitBreakers))
   202  	ws.Route(ws.GET("/circuitbreaker").To(h.GetCircuitBreaker))
   203  	ws.Route(ws.GET("/circuitbreaker/versions").To(h.GetCircuitBreakerVersions))
   204  	ws.Route(ws.GET("/circuitbreakers/master").To(h.GetMasterCircuitBreakers))
   205  	ws.Route(ws.GET("/circuitbreakers/release").To(h.GetReleaseCircuitBreakers))
   206  	ws.Route(ws.GET("/circuitbreaker/token").To(h.GetCircuitBreakerToken))
   207  	// Deprecate -- end
   208  
   209  	ws.Route(docs.EnrichGetCircuitBreakerRulesApiDocs(
   210  		ws.GET("/circuitbreaker/rules").To(h.GetCircuitBreakerRules)))
   211  	ws.Route(docs.EnrichCreateCircuitBreakerRulesApiDocs(
   212  		ws.POST("/circuitbreaker/rules").To(h.CreateCircuitBreakerRules)))
   213  	ws.Route(docs.EnrichUpdateCircuitBreakerRulesApiDocs(
   214  		ws.PUT("/circuitbreaker/rules").To(h.UpdateCircuitBreakerRules)))
   215  	ws.Route(docs.EnrichDeleteCircuitBreakerRulesApiDocs(
   216  		ws.POST("/circuitbreaker/rules/delete").To(h.DeleteCircuitBreakerRules)))
   217  	ws.Route(docs.EnrichEnableCircuitBreakerRulesApiDocs(
   218  		ws.PUT("/circuitbreaker/rules/enable").To(h.EnableCircuitBreakerRules)))
   219  	ws.Route(docs.EnrichGetFaultDetectRulesApiDocs(ws.GET("/faultdetectors").To(h.GetFaultDetectRules)))
   220  	ws.Route(docs.EnrichCreateFaultDetectRulesApiDocs(ws.POST("/faultdetectors").To(h.CreateFaultDetectRules)))
   221  	ws.Route(docs.EnrichUpdateFaultDetectRulesApiDocs(ws.PUT("/faultdetectors").To(h.UpdateFaultDetectRules)))
   222  	ws.Route(docs.EnrichDeleteFaultDetectRulesApiDocs(
   223  		ws.POST("/faultdetectors/delete").To(h.DeleteFaultDetectRules)))
   224  }
   225  
   226  // GetClientAccessServer get client access server
   227  func (h *HTTPServerV1) GetClientAccessServer(ws *restful.WebService, include []string) error {
   228  	clientAccess := []string{apiserver.DiscoverAccess, apiserver.RegisterAccess, apiserver.HealthcheckAccess}
   229  
   230  	// 如果为空,则开启全部接口
   231  	if len(include) == 0 {
   232  		include = clientAccess
   233  	}
   234  
   235  	// 客户端接口:增删改请求操作存储层,查请求访问缓存
   236  	for _, item := range include {
   237  		switch item {
   238  		case apiserver.DiscoverAccess:
   239  			h.addDiscoverAccess(ws)
   240  		case apiserver.RegisterAccess:
   241  			h.addRegisterAccess(ws)
   242  		case apiserver.HealthcheckAccess:
   243  			h.addHealthCheckAccess(ws)
   244  		}
   245  	}
   246  	return nil
   247  }
   248  
   249  // addDiscoverAccess 增加服务发现接口
   250  func (h *HTTPServerV1) addDiscoverAccess(ws *restful.WebService) {
   251  	ws.Route(docs.EnrichReportClientApiDocs(ws.POST("/ReportClient").To(h.ReportClient)))
   252  	ws.Route(docs.EnrichDiscoverApiDocs(ws.POST("/Discover").To(h.Discover)))
   253  }
   254  
   255  // addRegisterAccess 增加注册/反注册接口
   256  func (h *HTTPServerV1) addRegisterAccess(ws *restful.WebService) {
   257  	ws.Route(docs.EnrichRegisterInstanceApiDocs(ws.POST("/RegisterInstance").To(h.RegisterInstance)))
   258  	ws.Route(docs.EnrichDeregisterInstanceApiDocs(ws.POST("/DeregisterInstance").To(h.DeregisterInstance)))
   259  }
   260  
   261  // addHealthCheckAccess 增加健康检查接口
   262  func (h *HTTPServerV1) addHealthCheckAccess(ws *restful.WebService) {
   263  	ws.Route(docs.EnrichHeartbeatApiDocs(ws.POST("/Heartbeat").To(h.Heartbeat)))
   264  }