diff --git a/apollo-portal/src/main/java/com/ctrip/framework/apollo/openapi/filter/ConsumerAuthenticationFilter.java b/apollo-portal/src/main/java/com/ctrip/framework/apollo/openapi/filter/ConsumerAuthenticationFilter.java index 1a7b1f909cf..1aaa8f1d4ec 100644 --- a/apollo-portal/src/main/java/com/ctrip/framework/apollo/openapi/filter/ConsumerAuthenticationFilter.java +++ b/apollo-portal/src/main/java/com/ctrip/framework/apollo/openapi/filter/ConsumerAuthenticationFilter.java @@ -24,6 +24,7 @@ import com.google.common.util.concurrent.RateLimiter; import java.io.IOException; import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; @@ -53,6 +54,7 @@ public class ConsumerAuthenticationFilter implements Filter { private static final int TOO_MANY_REQUESTS = 429; private static final Cache> LIMITER = CacheBuilder.newBuilder() + .expireAfterAccess(1, TimeUnit.HOURS) .maximumSize(RATE_LIMITER_CACHE_MAX_SIZE).build(); public ConsumerAuthenticationFilter(ConsumerAuthUtil consumerAuthUtil, ConsumerAuditUtil consumerAuditUtil) { @@ -108,7 +110,7 @@ public void destroy() { } private ImmutablePair getOrCreateRateLimiterPair(String key, Integer limitCount) { - try{ + try { return LIMITER.get(key, () -> ImmutablePair.of(System.currentTimeMillis(), RateLimiter.create(limitCount))); } catch (ExecutionException e) { diff --git a/apollo-portal/src/main/java/com/ctrip/framework/apollo/openapi/service/ConsumerService.java b/apollo-portal/src/main/java/com/ctrip/framework/apollo/openapi/service/ConsumerService.java index f9b8ed5882c..fc44e76a69d 100644 --- a/apollo-portal/src/main/java/com/ctrip/framework/apollo/openapi/service/ConsumerService.java +++ b/apollo-portal/src/main/java/com/ctrip/framework/apollo/openapi/service/ConsumerService.java @@ -198,7 +198,8 @@ public List assignNamespaceRoleToConsumer(String token, String app private ConsumerInfo convert( Consumer consumer, String token, - boolean allowCreateApplication + boolean allowCreateApplication, + Integer rateLimit ) { ConsumerInfo consumerInfo = new ConsumerInfo(); consumerInfo.setConsumerId(consumer.getId()); @@ -208,6 +209,7 @@ private ConsumerInfo convert( consumerInfo.setOwnerEmail(consumer.getOwnerEmail()); consumerInfo.setOrgId(consumer.getOrgId()); consumerInfo.setOrgName(consumer.getOrgName()); + consumerInfo.setRateLimit(rateLimit); consumerInfo.setToken(token); consumerInfo.setAllowCreateApplication(allowCreateApplication); @@ -223,13 +225,17 @@ public ConsumerInfo getConsumerInfoByAppId(String appId) { if (consumer == null) { return null; } - return convert(consumer, consumerToken.getToken(), isAllowCreateApplication(consumer.getId())); + return convert(consumer, consumerToken.getToken(), isAllowCreateApplication(consumer.getId()), getRateLimit(consumer.getId())); } private boolean isAllowCreateApplication(Long consumerId) { return isAllowCreateApplication(Collections.singletonList(consumerId)).get(0); } + private Integer getRateLimit(Long consumerId) { + return getRateLimit(Collections.singletonList(consumerId)).get(0); + } + private List isAllowCreateApplication(List consumerIdList) { Role createAppRole = getCreateAppRole(); if (createAppRole == null) { @@ -252,6 +258,17 @@ private List isAllowCreateApplication(List consumerIdList) { return list; } + private List getRateLimit(List consumerIdList) { + List list = new ArrayList<>(consumerIdList.size()); + for (Long consumerId : consumerIdList) { + ConsumerToken consumerToken = consumerTokenRepository.findByConsumerId(consumerId); + Integer rateLimit = consumerToken.getRateLimit(); + list.add(rateLimit); + } + + return list; + } + private Role getCreateAppRole() { return rolePermissionService.findRoleByRoleName(CREATE_APPLICATION_ROLE_NAME); } @@ -405,6 +422,7 @@ public List findConsumerInfoList(Pageable page) { List consumerIdList = consumerList.stream() .map(Consumer::getId).collect(Collectors.toList()); List allowCreateApplicationList = isAllowCreateApplication(consumerIdList); + List rateLimitList = getRateLimit(consumerIdList); List consumerInfoList = new ArrayList<>(consumerList.size()); @@ -412,7 +430,7 @@ public List findConsumerInfoList(Pageable page) { Consumer consumer = consumerList.get(i); // without token ConsumerInfo consumerInfo = convert( - consumer, null, allowCreateApplicationList.get(i) + consumer, null, allowCreateApplicationList.get(i), rateLimitList.get(i) ); consumerInfoList.add(consumerInfo); } diff --git a/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/entity/vo/consumer/ConsumerInfo.java b/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/entity/vo/consumer/ConsumerInfo.java index f6779da140c..cb6c7a0cf62 100644 --- a/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/entity/vo/consumer/ConsumerInfo.java +++ b/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/entity/vo/consumer/ConsumerInfo.java @@ -33,6 +33,8 @@ public class ConsumerInfo { private String token; private boolean allowCreateApplication; + private Integer rateLimit; + public String getAppId() { return appId; } @@ -104,4 +106,13 @@ public boolean isAllowCreateApplication() { public void setAllowCreateApplication(boolean allowCreateApplication) { this.allowCreateApplication = allowCreateApplication; } + + public Integer getRateLimit() { + return rateLimit; + } + + public void setRateLimit(Integer rateLimit) { + this.rateLimit = rateLimit; + } + } diff --git a/apollo-portal/src/main/resources/static/open/manage.html b/apollo-portal/src/main/resources/static/open/manage.html index e1545dfa6b1..aba7a3da8d7 100644 --- a/apollo-portal/src/main/resources/static/open/manage.html +++ b/apollo-portal/src/main/resources/static/open/manage.html @@ -62,7 +62,8 @@
{{'Open.Manage.CreateThirdApp' | translate }} {{'Common.AppId' | translate }} {{'Common.AppName' | translate }} {{'Open.Manage.Consumer.AllowCreateApplication' | translate }} - {{'Common.Department' | translate }} + {{'Open.Manage.Consumer.RateLimitValue' | translate }} + {{'Common.Department' | translate }} {{'Common.AppOwner' | translate }}/{{'Common.Email' | translate }} {{'Common.Operation' | translate}} @@ -78,8 +79,9 @@
{{'Open.Manage.CreateThirdApp' | translate }} {{'Open.Manage.Consumer.AllowCreateApplication.No' | translate}} + {{ consumer.rateLimit }} - {{ consumer.orgName + '(' + consumer.orgId + ')' }} + {{ consumer.orgName + '(' + consumer.orgId + ')' }} {{ consumer.ownerName }}/{{ consumer.ownerEmail }}