Skip to content

Commit

Permalink
Merge pull request #14 from lannoy0523/issue_2655
Browse files Browse the repository at this point in the history
feat: 后台增加限流配置页面 #2655
  • Loading branch information
zacYL authored Oct 28, 2024
2 parents 5cbd93c + afa0a00 commit 77eb32e
Show file tree
Hide file tree
Showing 8 changed files with 240 additions and 70 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -50,5 +50,5 @@ data class RateLimitCreatOrUpdateRequest(
// 指定机器上运行
var targets: List<String>? = emptyList(),
// 模块名
var moduleName: List<String>? = null
var moduleName: List<String>
)
Original file line number Diff line number Diff line change
Expand Up @@ -38,10 +38,14 @@ import java.time.Duration
@Document(collection = "rate_limit")
@CompoundIndexes(
CompoundIndex(
name = "rate_limit_idx",
name = "resource_limitDimension_idx",
def = "{'resource': 1,'limitDimension': 1}",
background = true,
unique = true
background = true
),
CompoundIndex(
name = "limitDimension_idx",
def = "{'limitDimension': 1}",
background = true
)
)
data class TRateLimit(
Expand All @@ -63,5 +67,5 @@ data class TRateLimit(
// 指定机器上运行
var targets: List<String> = emptyList(),
// 模块名
var moduleName: List<String>? = null
var moduleName: List<String>
)
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,15 @@ class RateLimitRepository : SimpleMongoDao<TRateLimit>() {
)
}

fun findByResourceAndLimitDimension(resource: String, limitDimension: String) : List<TRateLimit> {
return find(
Query(
Criteria.where(TRateLimit::resource.name).isEqualTo(resource)
.and(TRateLimit::limitDimension.name).isEqualTo(limitDimension)
)
)
}

fun findByModuleNameAndLimitDimension(moduleName: String, limitDimension: String): List<TRateLimit> {
return find(
Query(
Expand All @@ -62,4 +71,18 @@ class RateLimitRepository : SimpleMongoDao<TRateLimit>() {
)
)
}

fun findByModuleNameAndLimitDimensionAndResource(
resource: String,
moduleName: List<String>,
limitDimension: String
): TRateLimit? {
return findOne(
Query(
Criteria.where(TRateLimit::moduleName.name).isEqualTo("$moduleName")
.and(TRateLimit::limitDimension.name).isEqualTo(limitDimension)
.and(TRateLimit::resource.name).isEqualTo(resource)
)
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -115,4 +115,16 @@ class RateLimiterConfigService(
return rateLimitRepository.findByModuleNameAndLimitDimension(moduleName, limitDimension)
}

fun findByResourceAndLimitDimension(resource: String, limitDimension: String): List<TRateLimit> {
return rateLimitRepository.findByResourceAndLimitDimension(resource, limitDimension)
}

fun findByModuleNameAndLimitDimensionAndResource(
resource: String,
moduleName: List<String>,
limitDimension: String
): TRateLimit? {
return rateLimitRepository.findByModuleNameAndLimitDimensionAndResource(resource, moduleName, limitDimension)
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import org.springframework.web.bind.annotation.RestController
import org.springframework.web.bind.annotation.DeleteMapping
import org.springframework.web.bind.annotation.RequestBody
import org.springframework.web.bind.annotation.PathVariable
import org.springframework.web.bind.annotation.RequestParam

@RestController
@RequestMapping("/api/rateLimit")
Expand All @@ -41,38 +42,44 @@ class RateLimitController(
if (!rateLimiterConfigService.checkExist(request.id!!)) {
throw NotFoundException(CommonMessageCode.RESOURCE_NOT_FOUND, request.id!!)
}
rateLimiterConfigService.getById(request.id!!).let {
if (it != null &&
updateCheckResource(it, request) &&
rateLimiterConfigService.checkExist(request)
) {
throw ErrorCodeException(
CommonMessageCode.RESOURCE_EXISTED,
"resource:${request.resource},limitDimension:${request.limitDimension})"
)
}
val tRateLimit = rateLimiterConfigService.findByModuleNameAndLimitDimensionAndResource(
request.resource,
request.moduleName,
request.limitDimension
)
if (tRateLimit == null || !tRateLimit.id.equals(request.id)) {
checkResource(request)
}
rateLimiterConfigService.update(request)
return ResponseBuilder.success()
}

private fun updateCheckResource(tRateLimit: TRateLimit, request: RateLimitCreatOrUpdateRequest): Boolean {
return (tRateLimit.resource != request.resource || tRateLimit.limitDimension != request.limitDimension)
private fun checkResource(request: RateLimitCreatOrUpdateRequest) {
with(request) {
val tRateLimits = rateLimiterConfigService.findByResourceAndLimitDimension(
resource = resource,
limitDimension = limitDimension
)
val modules = ArrayList<String>()
tRateLimits.forEach { tRateLimit -> modules.addAll(tRateLimit.moduleName) }
if (modules.isNotEmpty()) {
modules.retainAll(moduleName)
if (modules.isNotEmpty()) {
throw ErrorCodeException(
CommonMessageCode.RESOURCE_EXISTED,
"resource:$resource,limitDimension:$limitDimension,module:${modules}"
)
}
}
}
}

// 新增
@PostMapping("/create")
fun create(@RequestBody request:RateLimitCreatOrUpdateRequest): Response<Void> {
with(request) {
if (rateLimiterConfigService.checkExist(request)) {
throw ErrorCodeException(
CommonMessageCode.RESOURCE_EXISTED,
"resource:$resource,limitDimension:$limitDimension"
)
}
rateLimiterConfigService.create(request)
return ResponseBuilder.success()
}
checkResource(request)
rateLimiterConfigService.create(request)
return ResponseBuilder.success()
}

// 删除
Expand All @@ -92,4 +99,16 @@ class RateLimitController(
return ResponseBuilder.success(config.rules.toJsonString())
}

// 获取数据库里面的模块名
@PostMapping("/getExistModule")
fun getExistModule(@RequestParam resource:String,@RequestParam limitDimension:String): Response<List<String>> {
val tRateLimits = rateLimiterConfigService.findByResourceAndLimitDimension(
resource = resource,
limitDimension = limitDimension
)
val modules = ArrayList<String>()
tRateLimits.forEach { tRateLimit -> modules.addAll(tRateLimit.moduleName) }
return ResponseBuilder.success(modules)
}

}
11 changes: 11 additions & 0 deletions src/frontend/devops-op/src/api/rateLimit.js
Original file line number Diff line number Diff line change
Expand Up @@ -38,3 +38,14 @@ export function getRateLimitConfig() {
method: 'get'
})
}

export function getExistModule(resource, limitDimension) {
return request({
url: `${PREFIX_SERVICES}/getExistModule`,
method: 'post',
params: {
resource: resource,
limitDimension: limitDimension
}
})
}
Loading

0 comments on commit 77eb32e

Please sign in to comment.