diff --git a/novel-author/author-service/pom.xml b/novel-author/author-service/pom.xml index 7cfd111..559048b 100644 --- a/novel-author/author-service/pom.xml +++ b/novel-author/author-service/pom.xml @@ -17,14 +17,6 @@ author-api - - org.springframework.cloud - spring-cloud-starter-alibaba-nacos-discovery - - - org.springframework.cloud - spring-cloud-starter-alibaba-nacos-config - org.springframework.cloud diff --git a/novel-book/book-service/pom.xml b/novel-book/book-service/pom.xml index 2c986d9..6129a29 100644 --- a/novel-book/book-service/pom.xml +++ b/novel-book/book-service/pom.xml @@ -22,14 +22,6 @@ user-api - - org.springframework.cloud - spring-cloud-starter-alibaba-nacos-discovery - - - org.springframework.cloud - spring-cloud-starter-alibaba-nacos-config - org.springframework.cloud diff --git a/novel-common/pom.xml b/novel-common/pom.xml index 0ad3b6c..5b9bc66 100644 --- a/novel-common/pom.xml +++ b/novel-common/pom.xml @@ -14,11 +14,11 @@ - org.springframework.cloud + com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery - org.springframework.cloud + com.alibaba.cloud spring-cloud-starter-alibaba-nacos-config diff --git a/novel-file/pom.xml b/novel-file/pom.xml index 3021f33..d4757e4 100644 --- a/novel-file/pom.xml +++ b/novel-file/pom.xml @@ -32,14 +32,6 @@ - - org.springframework.cloud - spring-cloud-starter-alibaba-nacos-discovery - - - org.springframework.cloud - spring-cloud-starter-alibaba-nacos-config - org.springframework.cloud diff --git a/novel-gateway/pom.xml b/novel-gateway/pom.xml index 7352baa..9d8de25 100644 --- a/novel-gateway/pom.xml +++ b/novel-gateway/pom.xml @@ -13,11 +13,11 @@ - org.springframework.cloud + com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery - org.springframework.cloud + com.alibaba.cloud spring-cloud-starter-alibaba-nacos-config @@ -30,6 +30,15 @@ joda-time + + com.alibaba.cloud + spring-cloud-starter-alibaba-sentinel + + + + com.alibaba.cloud + spring-cloud-alibaba-sentinel-gateway + diff --git a/novel-gateway/src/main/java/com/java2nb/novel/gateway/config/GatewayConfiguration.java b/novel-gateway/src/main/java/com/java2nb/novel/gateway/config/GatewayConfiguration.java new file mode 100644 index 0000000..b87e6c6 --- /dev/null +++ b/novel-gateway/src/main/java/com/java2nb/novel/gateway/config/GatewayConfiguration.java @@ -0,0 +1,128 @@ +package com.java2nb.novel.gateway.config; + +import com.alibaba.csp.sentinel.adapter.gateway.common.SentinelGatewayConstants; +import com.alibaba.csp.sentinel.adapter.gateway.common.api.ApiDefinition; +import com.alibaba.csp.sentinel.adapter.gateway.common.api.ApiPathPredicateItem; +import com.alibaba.csp.sentinel.adapter.gateway.common.api.ApiPredicateItem; +import com.alibaba.csp.sentinel.adapter.gateway.common.api.GatewayApiDefinitionManager; +import com.alibaba.csp.sentinel.adapter.gateway.common.rule.GatewayFlowRule; +import com.alibaba.csp.sentinel.adapter.gateway.common.rule.GatewayParamFlowItem; +import com.alibaba.csp.sentinel.adapter.gateway.common.rule.GatewayRuleManager; +import com.alibaba.csp.sentinel.adapter.gateway.sc.SentinelGatewayFilter; +import com.alibaba.csp.sentinel.adapter.gateway.sc.exception.SentinelGatewayBlockExceptionHandler; +import com.alibaba.csp.sentinel.slots.system.SystemRule; +import com.alibaba.csp.sentinel.slots.system.SystemRuleManager; +import org.springframework.beans.factory.ObjectProvider; +import org.springframework.cloud.gateway.filter.GlobalFilter; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.http.codec.ServerCodecConfigurer; +import org.springframework.web.reactive.result.view.ViewResolver; + +import javax.annotation.PostConstruct; +import java.util.*; + +/** + * 网关限流配置 + * @author xiongxiaoyang + * @version 1.0 + * @since 2020/6/7 + */ +@Configuration +public class GatewayConfiguration { + + private final List viewResolvers; + private final ServerCodecConfigurer serverCodecConfigurer; + + public GatewayConfiguration(ObjectProvider> viewResolversProvider, + ServerCodecConfigurer serverCodecConfigurer) { + this.viewResolvers = viewResolversProvider.getIfAvailable(Collections::emptyList); + this.serverCodecConfigurer = serverCodecConfigurer; + } + + @Bean + @Order(Ordered.HIGHEST_PRECEDENCE) + public SentinelGatewayBlockExceptionHandler sentinelGatewayBlockExceptionHandler() { + // Register the block exception handler for Spring Cloud Gateway. + return new SentinelGatewayBlockExceptionHandler(viewResolvers, serverCodecConfigurer); + } + + @Bean + @Order(Ordered.HIGHEST_PRECEDENCE) + public GlobalFilter sentinelGatewayFilter() { + return new SentinelGatewayFilter(); + } + + @PostConstruct + public void doInit() { + // initSystemRule(); + initCustomizedApis(); + initGatewayRules(); + } + + private void initCustomizedApis() { + Set definitions = new HashSet<>(); + ApiDefinition api1 = new ApiDefinition("customized_api") + .setPredicateItems(new HashSet() {{ + add(new ApiPathPredicateItem().setPattern("/api/**") + .setMatchStrategy(SentinelGatewayConstants.URL_MATCH_STRATEGY_PREFIX)); + }}); + ApiDefinition api2 = new ApiDefinition("book_content_api") + .setPredicateItems(new HashSet() {{ + add(new ApiPathPredicateItem().setPattern("/api/book/queryBookContent**") + .setMatchStrategy(SentinelGatewayConstants.URL_MATCH_STRATEGY_PREFIX)); + }}); + definitions.add(api1); + definitions.add(api2); + GatewayApiDefinitionManager.loadApiDefinitions(definitions); + } + + /** + * 系统自适应限流规则 + * */ + private void initSystemRule() { + List rules = new ArrayList<>(); + SystemRule rule = new SystemRule(); + // max load is 3 + rule.setHighestSystemLoad(3.0); + // max cpu usage is 60% + rule.setHighestCpuUsage(0.6); + // max avg rt of all request is 10 ms + rule.setAvgRt(10); + // max total qps is 20 + rule.setQps(20); + // max parallel working thread is 10 + rule.setMaxThread(10); + + rules.add(rule); + SystemRuleManager.loadRules(Collections.singletonList(rule)); + } + + /** + * 自定义网关限流规则(反爬虫机制) + * 1.对所有api接口通过IP进行限流,每个IP,2秒钟内请求数量大于10,即视为爬虫 + * 2.对小说内容接口访问进行限流,每个IP,1秒钟请求数量大于1,则视为爬虫 + * */ + private void initGatewayRules() { + Set rules = new HashSet<>(); + rules.add(new GatewayFlowRule("customized_api") + .setResourceMode(SentinelGatewayConstants.RESOURCE_MODE_CUSTOM_API_NAME) + .setCount(10) + .setIntervalSec(2) + .setParamItem(new GatewayParamFlowItem() + .setParseStrategy(SentinelGatewayConstants.PARAM_PARSE_STRATEGY_CLIENT_IP) + ) + ); + rules.add(new GatewayFlowRule("book_content_api") + .setResourceMode(SentinelGatewayConstants.RESOURCE_MODE_CUSTOM_API_NAME) + .setCount(1) + .setIntervalSec(1) + .setParamItem(new GatewayParamFlowItem() + .setParseStrategy(SentinelGatewayConstants.PARAM_PARSE_STRATEGY_CLIENT_IP) + ) + ); + GatewayRuleManager.loadRules(rules); + } +} diff --git a/novel-gateway/src/main/resources/bootstrap.yml b/novel-gateway/src/main/resources/bootstrap.yml index fad7bce..c42e031 100644 --- a/novel-gateway/src/main/resources/bootstrap.yml +++ b/novel-gateway/src/main/resources/bootstrap.yml @@ -1,3 +1,4 @@ + spring: application: name: novel-gateway @@ -8,3 +9,6 @@ spring: file-extension: yml group: ${spring.application.name} namespace: 3960c71a-62ac-4b8f-8c30-bba8e8143a0c + + main: + allow-bean-definition-overriding: true \ No newline at end of file diff --git a/novel-home/pom.xml b/novel-home/pom.xml index b9f548e..7ecba48 100644 --- a/novel-home/pom.xml +++ b/novel-home/pom.xml @@ -21,14 +21,6 @@ news-api - - org.springframework.cloud - spring-cloud-starter-alibaba-nacos-discovery - - - org.springframework.cloud - spring-cloud-starter-alibaba-nacos-config - org.springframework.cloud diff --git a/novel-monitor/pom.xml b/novel-monitor/pom.xml index e234692..932435b 100644 --- a/novel-monitor/pom.xml +++ b/novel-monitor/pom.xml @@ -17,11 +17,11 @@ spring-boot-starter-web - org.springframework.cloud + com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery - org.springframework.cloud + com.alibaba.cloud spring-cloud-starter-alibaba-nacos-config diff --git a/novel-news/news-service/pom.xml b/novel-news/news-service/pom.xml index 1dc90fa..288d33a 100644 --- a/novel-news/news-service/pom.xml +++ b/novel-news/news-service/pom.xml @@ -18,14 +18,6 @@ news-api - - org.springframework.cloud - spring-cloud-starter-alibaba-nacos-discovery - - - org.springframework.cloud - spring-cloud-starter-alibaba-nacos-config - org.springframework.cloud diff --git a/novel-pay/pay-service/pom.xml b/novel-pay/pay-service/pom.xml index 1d9d65f..b0b8898 100644 --- a/novel-pay/pay-service/pom.xml +++ b/novel-pay/pay-service/pom.xml @@ -17,14 +17,6 @@ pay-api - - org.springframework.cloud - spring-cloud-starter-alibaba-nacos-discovery - - - org.springframework.cloud - spring-cloud-starter-alibaba-nacos-config - org.springframework.cloud diff --git a/novel-search/pom.xml b/novel-search/pom.xml index f0db430..259877c 100644 --- a/novel-search/pom.xml +++ b/novel-search/pom.xml @@ -17,14 +17,6 @@ book-api - - org.springframework.cloud - spring-cloud-starter-alibaba-nacos-discovery - - - org.springframework.cloud - spring-cloud-starter-alibaba-nacos-config - org.springframework.cloud diff --git a/novel-user/user-service/pom.xml b/novel-user/user-service/pom.xml index 36de874..0764671 100644 --- a/novel-user/user-service/pom.xml +++ b/novel-user/user-service/pom.xml @@ -22,14 +22,6 @@ book-api - - org.springframework.cloud - spring-cloud-starter-alibaba-nacos-discovery - - - org.springframework.cloud - spring-cloud-starter-alibaba-nacos-config - org.springframework.cloud diff --git a/pom.xml b/pom.xml index c7fd2e9..fed144d 100644 --- a/pom.xml +++ b/pom.xml @@ -39,6 +39,7 @@ UTF-8 1.8 Hoxton.SR4 + 2.1.0.RELEASE 0.2.2.RELEASE 2.7.0 true @@ -132,19 +133,14 @@ import - - org.springframework.cloud - spring-cloud-starter-alibaba-nacos-discovery - ${nacos.version} + com.alibaba.cloud + spring-cloud-alibaba-dependencies + ${spring-cloud-alibaba.version} + pom + import - - - org.springframework.cloud - spring-cloud-starter-alibaba-nacos-config - ${nacos.version} -