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 }