This is an automated email from the ASF dual-hosted git repository. liuhongyu pushed a commit to branch feat/refactor in repository https://gitbox.apache.org/repos/asf/shenyu.git
commit 8e82cd5866daaf939ed96530f6515ce1fe594e5a Author: liuhy <[email protected]> AuthorDate: Sun Jan 4 09:45:03 2026 +0800 refactor: optimize gateway dependencies and performance - Remove unused plugins and dependencies in shenyu-bootstrap to reduce artifact size - Configure spring-boot-maven-plugin to ensure executable jar generation - Optimize logging in ShenyuPlugin and ShenyuWebHandler to reduce overhead - Update application.yml to use HTTP register type and WebSocket sync 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <[email protected]> --- shenyu-bootstrap/pom.xml | 270 +++------------------ .../src/main/resources/application.yml | 8 +- .../org/apache/shenyu/plugin/api/ShenyuPlugin.java | 16 +- .../shenyu/web/handler/ShenyuWebHandler.java | 19 +- 4 files changed, 63 insertions(+), 250 deletions(-) diff --git a/shenyu-bootstrap/pom.xml b/shenyu-bootstrap/pom.xml index abe6c1598f..ce68b29cbc 100644 --- a/shenyu-bootstrap/pom.xml +++ b/shenyu-bootstrap/pom.xml @@ -217,20 +217,6 @@ </dependency> <!--shenyu grpc plugin end--> - <!--shenyu tars plugin start--> - <dependency> - <groupId>org.apache.shenyu</groupId> - <artifactId>shenyu-spring-boot-starter-plugin-tars</artifactId> - <version>${project.version}</version> - </dependency> - - <dependency> - <groupId>com.tencent.tars</groupId> - <artifactId>tars-client</artifactId> - <version>1.7.2</version> - </dependency> - <!--shenyu tars plugin end--> - <!--Tcp Plugin Start--> <dependency> <groupId>org.apache.shenyu</groupId> @@ -239,231 +225,14 @@ </dependency> <!--Tcp Plugin end--> - <!--Ai proxy Plugin Start--> - <dependency> - <groupId>org.apache.shenyu</groupId> - <artifactId>shenyu-spring-boot-starter-plugin-ai-proxy</artifactId> - <version>${project.version}</version> - </dependency> - <!--Ai proxy Plugin end--> - - <!--Ai prompt Plugin Start--> - <dependency> - <groupId>org.apache.shenyu</groupId> - <artifactId>shenyu-spring-boot-starter-plugin-ai-prompt</artifactId> - <version>${project.version}</version> - </dependency> - <!--Ai prompt Plugin end--> - - <!--Ai token limiter Plugin Start--> - <dependency> - <groupId>org.apache.shenyu</groupId> - <artifactId>shenyu-spring-boot-starter-plugin-ai-token-limiter</artifactId> - <version>${project.version}</version> - </dependency> - <!--Ai token limiter Plugin end--> - - <!--Ai request transformer Plugin Start--> - <dependency> - <groupId>org.apache.shenyu</groupId> - <artifactId>shenyu-spring-boot-starter-plugin-ai-request-transformer</artifactId> - <version>${project.version}</version> - </dependency> - <!--Ai request transformer Plugin end--> - - <!--Ai response transformer Plugin Start--> - <dependency> - <groupId>org.apache.shenyu</groupId> - <artifactId>shenyu-spring-boot-starter-plugin-ai-response-transformer</artifactId> - <version>${project.version}</version> - </dependency> - <!--Ai response transformer Plugin end--> - - <!--Mcp Server Plugin Start--> - <dependency> - <groupId>org.apache.shenyu</groupId> - <artifactId>shenyu-spring-boot-starter-plugin-mcp-server</artifactId> - <version>${project.version}</version> - </dependency> - <!--Mcp Server Plugin end--> - - <!--shenyu sofa plugin start--> - <dependency> - <groupId>com.alipay.sofa</groupId> - <artifactId>sofa-rpc-all</artifactId> - <exclusions> - <exclusion> - <groupId>net.jcip</groupId> - <artifactId>jcip-annotations</artifactId> - </exclusion> - <exclusion> - <groupId>io.grpc</groupId> - <artifactId>grpc-core</artifactId> - </exclusion> - <exclusion> - <artifactId>commons-io</artifactId> - <groupId>commons-io</groupId> - </exclusion> - <exclusion> - <artifactId>okio</artifactId> - <groupId>com.squareup.okio</groupId> - </exclusion> - <exclusion> - <artifactId>sofa-common-tools</artifactId> - <groupId>com.alipay.sofa.common</groupId> - </exclusion> - </exclusions> - </dependency> - <dependency> - <groupId>com.alipay.sofa.common</groupId> - <artifactId>sofa-common-tools</artifactId> - <version>${sofa-common-tools.version}</version> - <exclusions> - <exclusion> - <artifactId>guava</artifactId> - <groupId>com.google.guava</groupId> - </exclusion> - </exclusions> - </dependency> - <dependency> - <groupId>org.apache.shenyu</groupId> - <artifactId>shenyu-spring-boot-starter-plugin-sofa</artifactId> - <version>${project.version}</version> - </dependency> - <!--shenyu sofa plugin end--> - - <dependency> - <groupId>com.alibaba.cloud</groupId> - <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> - <version>${nacos-discovery.version}</version> - <exclusions> - <exclusion> - <groupId>org.springframework.cloud</groupId> - <artifactId>spring-cloud-loadbalancer</artifactId> - </exclusion> - </exclusions> - </dependency> - -<!-- <dependency>--> -<!-- <groupId>org.springframework.cloud</groupId>--> -<!-- <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>--> -<!-- <version>${eureka-client.version}</version>--> -<!-- <exclusions>--> -<!-- <exclusion>--> -<!-- <groupId>org.springframework.cloud</groupId>--> -<!-- <artifactId>spring-cloud-starter-loadbalancer</artifactId>--> -<!-- </exclusion>--> -<!-- </exclusions>--> -<!-- </dependency>--> - - <dependency> - <groupId>org.springframework.cloud</groupId> - <artifactId>spring-cloud-commons</artifactId> - <version>${spring-cloud-commons.version}</version> - </dependency> - <!--shenyu springCloud plugin end--> - - <!--shenyu key-auth plugin start--> - <dependency> - <groupId>org.apache.shenyu</groupId> - <artifactId>shenyu-spring-boot-starter-plugin-key-auth</artifactId> - <version>${project.version}</version> - </dependency> - <!--shenyu key-auth plugin end --> - - <!--shenyu mock plugin start--> - <dependency> - <groupId>org.apache.shenyu</groupId> - <artifactId>shenyu-spring-boot-starter-plugin-mock</artifactId> - <version>${project.version}</version> - </dependency> - <!--shenyu mock plugin end--> - - <!--shenyu apache dubbo plugin start--> - <dependency> - <groupId>org.apache.shenyu</groupId> - <artifactId>shenyu-spring-boot-starter-plugin-apache-dubbo</artifactId> - <version>${project.version}</version> - </dependency> - <dependency> - <groupId>org.apache.dubbo</groupId> - <artifactId>dubbo</artifactId> - <version>${apache.dubbo.version}</version> - </dependency> - <!-- Dubbo Nacos registry dependency --> - <!-- <dependency> - <groupId>org.apache.dubbo</groupId> - <artifactId>dubbo-registry-nacos</artifactId> - <version>2.7.15</version> - </dependency> - <dependency> - <groupId>com.alibaba.nacos</groupId> - <artifactId>nacos-client</artifactId> - <version>2.0.4</version> - </dependency>--> - <!-- Dubbo zookeeper registry dependency start --> - <dependency> - <groupId>org.apache.dubbo</groupId> - <artifactId>dubbo-dependencies-zookeeper</artifactId> - <version>${apache.dubbo.version}</version> - <exclusions> - <exclusion> - <artifactId>slf4j-log4j12</artifactId> - <groupId>org.slf4j</groupId> - </exclusion> - </exclusions> - <type>pom</type> - </dependency> - <!-- Dubbo zookeeper registry dependency end --> - <!-- shenyu apache dubbo plugin end--> - - <!--shenyu motan plugin start--> - <!--If you plan to use the motan plugin and want to use the hessian serialization, - please check the sofa plugin related dependencies.In particular, the reliance on sofa-hessian should be excluded. - Because sofa-hessian and caucho-hessian can cause class loading conflicts and cause some unexpected problems--> - <dependency> - <groupId>com.weibo</groupId> - <artifactId>motan-core</artifactId> - <version>${motan.version}</version> - </dependency> - <dependency> - <groupId>com.weibo</groupId> - <artifactId>motan-transport-netty4</artifactId> - <version>${motan.version}</version> - </dependency> - <dependency> - <groupId>com.weibo</groupId> - <artifactId>motan-registry-zookeeper</artifactId> - <version>${motan.version}</version> - <exclusions> - <exclusion> - <groupId>log4j</groupId> - <artifactId>log4j</artifactId> - </exclusion> - <exclusion> - <groupId>org.slf4j</groupId> - <artifactId>slf4j-log4j12</artifactId> - </exclusion> - </exclusions> - </dependency> - <dependency> - <groupId>com.weibo</groupId> - <artifactId>motan-springsupport</artifactId> - <version>${motan.version}</version> - </dependency> - <dependency> - <groupId>org.apache.shenyu</groupId> - <artifactId>shenyu-spring-boot-starter-plugin-motan</artifactId> - <version>${project.version}</version> - </dependency> - <!--shenyu motan plugin end--> - <!--shenyu data sync start use zookeeper--> + <!-- <dependency> <groupId>org.apache.shenyu</groupId> <artifactId>shenyu-spring-boot-starter-sync-data-zookeeper</artifactId> <version>${project.version}</version> </dependency> + --> <!--shenyu data sync start use websocket--> <dependency> @@ -480,13 +249,17 @@ </dependency> <!--shenyu data sync start use nacos--> + <!-- <dependency> <groupId>org.apache.shenyu</groupId> <artifactId>shenyu-spring-boot-starter-sync-data-nacos</artifactId> <version>${project.version}</version> </dependency> + --> + <!--shenyu data sync start use etcd--> + <!-- <dependency> <groupId>org.apache.shenyu</groupId> <artifactId>shenyu-spring-boot-starter-sync-data-etcd</artifactId> @@ -502,98 +275,121 @@ </exclusion> </exclusions> </dependency> + --> <!--shenyu debug plugin end--> <!--shenyu data sync start use consul--> + <!-- <dependency> <groupId>org.apache.shenyu</groupId> <artifactId>shenyu-spring-boot-starter-sync-data-consul</artifactId> <version>${project.version}</version> </dependency> + --> <!--shenyu registry start--> <!--shenyu data sync start use polaris--> + <!-- <dependency> <groupId>org.apache.shenyu</groupId> <artifactId>shenyu-spring-boot-starter-sync-data-polaris</artifactId> <version>${project.version}</version> </dependency> + --> <!--shenyu instance start--> <!--shenyu registry end--> <!--shenyu logging-rocketmq plugin start--> + <!-- <dependency> <groupId>org.apache.shenyu</groupId> <artifactId>shenyu-spring-boot-starter-plugin-logging-rocketmq</artifactId> <version>${project.version}</version> </dependency> + --> <!--shenyu logging-rocketmq plugin end--> <!--shenyu logging-kafka plugin start--> + <!-- <dependency> <groupId>org.apache.shenyu</groupId> <artifactId>shenyu-spring-boot-starter-plugin-logging-kafka</artifactId> <version>${project.version}</version> </dependency> + --> <!--shenyu logging-kafka plugin end--> <!--shenyu logging-rabbitmq plugin start--> + <!-- <dependency> <groupId>org.apache.shenyu</groupId> <artifactId>shenyu-spring-boot-starter-plugin-logging-rabbitmq</artifactId> <version>${project.version}</version> </dependency> + --> <!--shenyu logging-rabbitmq plugin end--> <!--shenyu logging-elasticsearch plugin start--> + <!-- <dependency> <groupId>org.apache.shenyu</groupId> <artifactId>shenyu-spring-boot-starter-plugin-logging-elasticsearch</artifactId> <version>${project.version}</version> </dependency> + --> <!--shenyu logging-elasticsearch plugin end--> <!-- shenyu logging-aliyunsls plugin start --> + <!-- <dependency> <groupId>org.apache.shenyu</groupId> <artifactId>shenyu-spring-boot-starter-plugin-logging-aliyun-sls</artifactId> <version>${project.version}</version> </dependency> + --> <!-- shenyu logging-aliyunsls plugin end --> <!-- shenyu logging-pulsar plugin start --> + <!-- <dependency> <groupId>org.apache.shenyu</groupId> <artifactId>shenyu-spring-boot-starter-plugin-logging-pulsar</artifactId> <version>${project.version}</version> </dependency> + --> <!-- shenyu logging-pulsar plugin end --> <!-- shenyu logging-tencentcls plugin start --> + <!-- <dependency> <groupId>org.apache.shenyu</groupId> <artifactId>shenyu-spring-boot-starter-plugin-logging-tencent-cls</artifactId> <version>${project.version}</version> </dependency> + --> <!-- shenyu logging-tencentcls plugin end --> <!-- shenyu logging-huaweilts plugin start --> + <!-- <dependency> <groupId>org.apache.shenyu</groupId> <artifactId>shenyu-spring-boot-starter-plugin-logging-huawei-lts</artifactId> <version>${project.version}</version> </dependency> + --> <!-- shenyu logging-huaweilts plugin end --> <!-- shenyu logging-clickhouse plugin start --> + <!-- <dependency> <groupId>org.apache.shenyu</groupId> <artifactId>shenyu-spring-boot-starter-plugin-logging-clickhouse</artifactId> <version>${project.version}</version> </dependency> + --> <!-- shenyu logging-clickhouse plugin end --> <!-- shenyu kubernetes controller starter --> @@ -641,6 +437,14 @@ <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>${spring-boot.version}</version> + <executions> + <execution> + <phase>package</phase> + <goals> + <goal>repackage</goal> + </goals> + </execution> + </executions> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> diff --git a/shenyu-bootstrap/src/main/resources/application.yml b/shenyu-bootstrap/src/main/resources/application.yml index 4655938bde..2a52beee8c 100644 --- a/shenyu-bootstrap/src/main/resources/application.yml +++ b/shenyu-bootstrap/src/main/resources/application.yml @@ -108,7 +108,7 @@ shenyu: # set to false, user can custom the netty tcp server config. webServerFactoryEnabled: true selectCount: 1 - workerCount: 8 + # workerCount: 8 accessLog: false serverSocketChannel: soBackLog: 128 @@ -194,9 +194,9 @@ shenyu: # workerCount: 8 # daemon: true register: - enabled: false - registerType: zookeeper #etcd #consul - serverLists: localhost:2181 #http://localhost:2379 #localhost:8848 + enabled: true + registerType: http + serverLists: http://localhost:9095 props: cross: enabled: true diff --git a/shenyu-plugin/shenyu-plugin-api/src/main/java/org/apache/shenyu/plugin/api/ShenyuPlugin.java b/shenyu-plugin/shenyu-plugin-api/src/main/java/org/apache/shenyu/plugin/api/ShenyuPlugin.java index 22cfe72963..e96b65e48b 100644 --- a/shenyu-plugin/shenyu-plugin-api/src/main/java/org/apache/shenyu/plugin/api/ShenyuPlugin.java +++ b/shenyu-plugin/shenyu-plugin-api/src/main/java/org/apache/shenyu/plugin/api/ShenyuPlugin.java @@ -138,7 +138,9 @@ public interface ShenyuPlugin { * @param exchange context */ default void before(ServerWebExchange exchange) { - exchange.getAttributes().put(Constants.PLUGIN_START_TIME + named(), System.currentTimeMillis()); + if (LOG.isDebugEnabled()) { + exchange.getAttributes().put(Constants.PLUGIN_START_TIME + named(), System.currentTimeMillis()); + } } /** @@ -147,10 +149,14 @@ public interface ShenyuPlugin { * @param exchange context */ default void after(ServerWebExchange exchange) { - long currentTimeMillis = System.currentTimeMillis(); - long startTime = (long) exchange.getAttributes().get(Constants.PLUGIN_START_TIME + named()); - LOG.debug("shenyu traceId:{}, plugin named:{}, cost:{}", exchange.getLogPrefix(), named(), currentTimeMillis - startTime); - exchange.getAttributes().remove(Constants.PLUGIN_START_TIME + named()); + if (LOG.isDebugEnabled()) { + long currentTimeMillis = System.currentTimeMillis(); + Object startTime = exchange.getAttributes().get(Constants.PLUGIN_START_TIME + named()); + if (Objects.nonNull(startTime)) { + LOG.debug("shenyu traceId:{}, plugin named:{}, cost:{}", exchange.getLogPrefix(), named(), currentTimeMillis - (long) startTime); + exchange.getAttributes().remove(Constants.PLUGIN_START_TIME + named()); + } + } } } diff --git a/shenyu-web/src/main/java/org/apache/shenyu/web/handler/ShenyuWebHandler.java b/shenyu-web/src/main/java/org/apache/shenyu/web/handler/ShenyuWebHandler.java index 460d113f92..2ac3fb22fa 100644 --- a/shenyu-web/src/main/java/org/apache/shenyu/web/handler/ShenyuWebHandler.java +++ b/shenyu-web/src/main/java/org/apache/shenyu/web/handler/ShenyuWebHandler.java @@ -121,16 +121,19 @@ public final class ShenyuWebHandler implements WebHandler, ApplicationListener<P */ @Override public Mono<Void> handle(@NonNull final ServerWebExchange exchange) { - try { - before(exchange); - Mono<Void> execute = new DefaultShenyuPluginChain(plugins).execute(exchange); - if (scheduled) { - return execute.subscribeOn(scheduler); + Mono<Void> execute = Mono.defer(() -> { + if (LOG.isDebugEnabled()) { + before(exchange); } - return execute; - } finally { - after(exchange); + return new DefaultShenyuPluginChain(plugins).execute(exchange); + }); + if (scheduled) { + execute = execute.subscribeOn(scheduler); + } + if (LOG.isDebugEnabled()) { + execute = execute.doFinally(s -> after(exchange)); } + return execute; } /**
