Compare commits

...

216 Commits

Author SHA1 Message Date
Rawven 4b79a5facc
refactor/dubbo-security grpc dependency replace (#14004)
* refactor(): Replace grpc by triple

* refactor(): delete useless code

* refactor(): fix code style & fix bug

* fix(): pom & code style

* fix(): inappropriate change

* fix(): error use volatile
2024-04-02 14:28:42 +08:00
hjyp 9926a93223
【xds】init xds (#13747) 2024-03-22 17:14:48 +08:00
有点小邪恶 b338e20190
Fix telnet ctrl+c issue #13812 (#13921)
* Fix telnet ctrl+c issue #13812

* fix formatting issue

* add unit test for CtrlCHandler.java

---------

Co-authored-by: hengyouhai <hengyouhai@tuhu.cn>
2024-03-22 10:23:34 +08:00
Albumen Kevin 944be946ac Merge branch 'apache-3.2' into apache-3.3
# Conflicts:
#	dubbo-dependencies-bom/pom.xml
#	pom.xml
2024-03-22 10:22:35 +08:00
Ken Liu 0cce4c8afe
fix telnet qos command (#13951) 2024-03-20 10:24:44 +08:00
Albumen Kevin d5c484a643 Fix compile failure 2024-03-14 17:31:49 +08:00
Albumen Kevin 0f8be9ec93 Fix compile failure 2024-03-14 16:53:04 +08:00
Albumen Kevin 9b3a32f8d6 Merge branch 'apache-3.2' into apache-3.3
# Conflicts:
#	dubbo-distribution/dubbo-apache-release/pom.xml
#	dubbo-spring-boot/pom.xml
2024-03-14 15:00:30 +08:00
TomlongTK 1145b4015b
Remove bytebuddy implementation (#13916) 2024-03-14 14:36:34 +08:00
TomlongTK cf53c38179
Add application name on http1 and http2 (#13906) 2024-03-12 14:15:42 +08:00
Albumen Kevin da2dd6d2a1 Merge branch 'apache-3.2' into apache-3.3
# Conflicts:
#	README.md
#	dubbo-container/dubbo-container-api/src/main/java/org/apache/dubbo/container/Main.java
2024-03-12 11:36:55 +08:00
TomlongTK cb92fcc19e
Fix obtaining remote application name on the server side (#13811) 2024-03-08 10:01:18 +08:00
conghuhu b14e5e3a12
fix: fix observationsender error & feat: add DubboTracingObservationHandler (#13818) 2024-03-07 09:33:40 +08:00
Albumen Kevin 9b3073c2f4 Merge branch 'apache-3.2' into apache-3.3
# Conflicts:
#	dubbo-dependencies-bom/pom.xml
2024-03-06 11:11:38 +08:00
Albumen Kevin 76390eed4e Merge branch 'apache-3.2' into apache-3.3
# Conflicts:
#	dubbo-dependencies-bom/pom.xml
#	dubbo-spring-boot/pom.xml
2024-03-05 09:47:49 +08:00
huazhongming 3f2e0e18c9
Fix AotUtils NPE (#13825)
Signed-off-by: crazyhzm <crazyhzm@gmail.com>
2024-03-05 09:46:25 +08:00
Achilles 22b3c29b08
Fix bytesToInt parse error (#13808)
Co-authored-by: 陈浩宇 <jingfeng.xjf@alibaba-inc.com>
2024-03-01 14:23:54 +08:00
huazhongming 1dd289d405
Fix AotUtils StackOverflowError (#13710)
* Fix AotUtils StackOverflowError

Signed-off-by: crazyhzm <crazyhzm@gmail.com>

* Fix ut

Signed-off-by: crazyhzm <crazyhzm@gmail.com>

---------

Signed-off-by: crazyhzm <crazyhzm@gmail.com>
2024-02-29 19:16:43 +08:00
Sean Yang 0fa88a1180
Fix compilation error of YamlCodec in jdk1.8 (#13791) 2024-02-26 16:39:14 +08:00
Sean Yang 044a775373
fix(rest): Fix rest convert error (#13783) 2024-02-26 10:05:51 +08:00
Albumen Kevin 97d5563990 Fix ut failure 2024-02-23 15:17:10 +08:00
Albumen Kevin 70b1ecb662 Merge branch 'apache-3.2' into apache-3.3
# Conflicts:
#	dubbo-dependencies-bom/pom.xml
2024-02-20 11:27:00 +08:00
Albumen Kevin e2ea0046d2 Fix javadoc failure 2024-02-04 17:47:02 +08:00
Albumen Kevin d5b7941c63 Fix spotless style 2024-02-04 17:27:38 +08:00
Albumen Kevin a1bfa7b8f7 Fix style 2024-02-04 17:26:53 +08:00
Albumen Kevin ce570dd932 Merge branch 'apache-3.2' into apache-3.3
# Conflicts:
#	README.md
#	dubbo-build-tools/pom.xml
#	dubbo-common/src/main/java/org/apache/dubbo/config/AbstractInterfaceConfig.java
#	dubbo-common/src/main/java/org/apache/dubbo/config/MetricsConfig.java
#	dubbo-dependencies-bom/pom.xml
#	dubbo-dependencies/dubbo-dependencies-zookeeper-curator5/pom.xml
#	dubbo-dependencies/dubbo-dependencies-zookeeper/pom.xml
#	dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/api/pu/AbstractPortUnificationServer.java
#	dubbo-remoting/dubbo-remoting-netty4/src/main/java/org/apache/dubbo/remoting/transport/netty4/NettyPortUnificationServerHandler.java
#	pom.xml
2024-02-04 17:25:16 +08:00
Sean Yang 2dde7ac09e
feat(triple): Dubbo triple&rest protocol convergense (#13607) 2024-02-01 14:00:16 +08:00
namelessssssssssss e60f24cb7f
Fix potential npe of CodecUtils (#13695) 2024-01-30 15:06:13 +08:00
Albumen Kevin 9211a91d1c Fix conflicts 2024-01-19 15:19:48 +08:00
Albumen Kevin c38fa0ac8b Merge branch 'apache-3.2' into apache-3.3
# Conflicts:
#	.editorconfig
#	dubbo-build-tools/pom.xml
#	dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/support/MergeableClusterInvoker.java
#	dubbo-dependencies-bom/pom.xml
#	dubbo-dependencies/dubbo-dependencies-zookeeper-curator5/pom.xml
#	dubbo-dependencies/dubbo-dependencies-zookeeper/pom.xml
#	dubbo-native-plugin/pom.xml
#	dubbo-spring-boot/pom.xml
2024-01-19 15:19:31 +08:00
Sean Yang 46af145730
refactor(triple): Clean up some unused classes to facilitate reference analysis (#13619) 2024-01-19 14:46:30 +08:00
earthchen bfd748ee5d
Triple Stub path compatibility (#13581)
fixes #13348
2023-12-28 15:07:51 +08:00
Albumen Kevin 74dd87c15b Merge branch 'apache-3.2' into apache-3.3 2023-12-27 23:38:38 +08:00
Albumen Kevin d018475f73 Merge branch 'apache-3.2' into apache-3.3
# Conflicts:
#	README.md
#	dubbo-common/pom.xml
#	dubbo-common/src/main/java/org/apache/dubbo/config/MetricsConfig.java
#	dubbo-demo/dubbo-demo-triple/pom.xml
#	dubbo-dependencies-bom/pom.xml
#	dubbo-distribution/dubbo-all/pom.xml
#	dubbo-metadata/dubbo-metadata-processor/pom.xml
#	dubbo-native-plugin/pom.xml
#	dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryProtocol.java
#	dubbo-spring-boot/pom.xml
2023-12-27 23:27:35 +08:00
Ken Liu 2a0755c279
Check if protocol already found before going through ConsumerConfig. (#13510)
* Check if protocol already found before going through ConsumerConfig.

* fix spotless issue
2023-12-26 19:49:01 +08:00
huazhongming cb5ff2aace
Fix aot license (#13562)
* Fix ExecutableDescriber class path

Signed-off-by: crazyhzm <crazyhzm@gmail.com>

* Fix aot license

Signed-off-by: crazyhzm <crazyhzm@gmail.com>

---------

Signed-off-by: crazyhzm <crazyhzm@gmail.com>
2023-12-25 12:57:01 +08:00
huazhongming 36e0ee0a96
Revert dubbo module refactor (#13541)
* Revert dubbo module refactor

Signed-off-by: crazyhzm <crazyhzm@gmail.com>

* Revert dubbo module refactor

Signed-off-by: crazyhzm <crazyhzm@gmail.com>

* Revert dubbo module refactor

Signed-off-by: crazyhzm <crazyhzm@gmail.com>

---------

Signed-off-by: crazyhzm <crazyhzm@gmail.com>
2023-12-21 10:17:43 +08:00
Albumen Kevin 3de3ccf457 Merge branch 'apache-3.2' into apache-3.3
# Conflicts:
#	dubbo-dependencies-bom/pom.xml
#	dubbo-dependencies/dubbo-dependencies-zookeeper-curator5/pom.xml
#	dubbo-dependencies/dubbo-dependencies-zookeeper/pom.xml
#	dubbo-spring-boot/pom.xml
#	pom.xml
2023-12-19 11:36:32 +08:00
huazhongming 5b0b86b11d
Remove dubbo monitor module (#13456)
Signed-off-by: crazyhzm <crazyhzm@gmail.com>
2023-12-18 14:11:33 +08:00
namelessssssssssss 6118aa55f2
Support more content types for Triple protocol (#13387)
* Add more content type support for triple

* Add more content type support for triple

* Add tests & Bug fix

* Code style fix

* Code style fix

* Code style fix

* Code style fix

* Code style fix

* Set codec related dependencies to provided

* Change CodecUtil to bean

* Support Triple response encode by Accept header

* Support Triple response encode by Accept header

* Fix npe

* Refactor response encode

* Bug fix

* Style fix

* Bug fix & Add log

* Style fix

* Bug fix

* Update ExceptionUtilsTest.java

* Refactor

* Fix code style

* Refactor

* Refactor

* Code style fix

* Refactor

* Refactor

* Code style optimize

* Code style optimize

* Refactor MultipartCodec

* Add tests & Remove some dep

* Remove commons_fileupload from bom

* Simplify depedencies & clean up

* Fix jaxb version

* Enhance reliability for MultipartCodec & Add tests

* Enhance reliability for MultipartCodec

* Add test cases

* Add test cases

* Add test cases

* Add test cases

* Add test for xml safety

* Add test for xml safety

* Refactor CodecFactory

* Refactor CodecFactory

* Refactor CodecFactory

* Add codec cache

* Fix npe

* Fix npe

---------

Co-authored-by: nameless <x1544669126@gmail.com>
2023-12-16 11:36:22 +08:00
huazhongming 2f4a78ee38
Fix reference bean create proxy with javassist in native (#13509)
Signed-off-by: crazyhzm <crazyhzm@gmail.com>
2023-12-15 17:12:23 +08:00
Albumen Kevin 0fccd2ccae Merge branch 'apache-3.2' into apache-3.3
# Conflicts:
#	dubbo-build-tools/pom.xml
#	dubbo-dependencies-bom/pom.xml
#	dubbo-dependencies/dubbo-dependencies-zookeeper-curator5/pom.xml
#	dubbo-kubernetes/pom.xml
#	dubbo-native-plugin/pom.xml
#	dubbo-xds/pom.xml
#	dubbo-xds/src/test/java/org/apache/dubbo/rpc/cluster/router/xds/XdsRouteTest.java
#	pom.xml
2023-12-14 19:36:25 +08:00
foghost ad803e1c84
fix DubboAutoConfiguration and DubboRelaxedBinding2AutoConfiguration init too early, (#13461)
can not be processed AOT in spring native image scenario
2023-12-13 16:23:14 +08:00
huazhongming 8f7446c81d
Fix attributes is not passed by BeanDefinition (#13464)
* Fix attributes is not passed by BeanDefinition

Signed-off-by: crazyhzm <crazyhzm@gmail.com>

* Fix attributes in native

Signed-off-by: crazyhzm <crazyhzm@gmail.com>

---------

Signed-off-by: crazyhzm <crazyhzm@gmail.com>
2023-12-13 16:18:46 +08:00
huazhongming c8f7269e41
Fix method annotation compile failed in native (#13490)
Signed-off-by: crazyhzm <crazyhzm@gmail.com>
2023-12-12 17:54:32 +08:00
crazyhzm 0c766ad462 Merge branch '3.2' into 3.3
# Conflicts:
#	pom.xml
2023-12-04 20:39:36 +08:00
crazyhzm 4737eafcb4 Fix SpringMvcRestProtocolTest
Signed-off-by: crazyhzm <crazyhzm@gmail.com>
2023-12-04 20:16:44 +08:00
crazyhzm 5cf765889e Remove unused import
Signed-off-by: crazyhzm <crazyhzm@gmail.com>
2023-12-04 20:02:18 +08:00
crazyhzm c302fcccd8 Merge branch '3.2' into 3.3
# Conflicts:
#	dubbo-build-tools/pom.xml
#	dubbo-dependencies/dubbo-dependencies-zookeeper-curator5/pom.xml
#	dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/TripleInvoker.java
#	pom.xml
2023-12-04 19:53:18 +08:00
Albumen Kevin 40201078b0 Fix compile 2023-11-30 14:00:44 +08:00
Albumen Kevin 74978ca003 Apply style check 2023-11-30 11:31:59 +08:00
Albumen Kevin 40f44f91f5 Merge branch 'apache-3.2' into apache-3.3
# Conflicts:
#	dubbo-demo/dubbo-demo-spring-boot/dubbo-demo-spring-boot-consumer/pom.xml
#	dubbo-demo/dubbo-demo-spring-boot/dubbo-demo-spring-boot-provider/pom.xml
#	dubbo-dependencies-bom/pom.xml
#	dubbo-spring-boot/dubbo-spring-boot-starters/observability/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/otel/OpenTelemetryAutoConfiguration.java
#	dubbo-spring-boot/pom.xml
2023-11-30 11:30:46 +08:00
huazhongming 93ec8e368d
Remove dubbo-container module (#13410)
Signed-off-by: crazyhzm <crazyhzm@gmail.com>
2023-11-30 10:37:41 +08:00
XiaoyuPeng af0f45f7cd
feat:dubbo-compiler remove grpc and grpc/reactive package(#13367) (#13409)
* feat:dubbo-compiler remove grpc and grpc/reactive package(#13367)

* feat:dubbo-complier only reserve dubbo3 and tri(#13367)

---------

Co-authored-by: pengxiaoyu <pengxiaoyu@shengqugames.com>
2023-11-29 21:06:00 +08:00
TomlongTK 3f48269562
Adds a new completion state to the deployer (#13340)
* Adjust the order of events in Deployer

* Format code

* Add completion state

* Format code

* Format code

* Format code

* Marking completion as final state

* Add some comments

* Add some comments

* Fix application state calculate

* Compatible with started state

* Fix tests
2023-11-29 20:58:43 +08:00
foghost 7e0954b8cf
fix native image build error when mainClass is null,add an empty string placeholder (#13426) 2023-11-29 17:40:12 +08:00
Sean Yang a53228d545
feat(logging): #13378 Uniformly uses log4j2 as the logging component (#13402) 2023-11-22 09:58:59 +08:00
XiaoyuPeng 650ee3b9d4
fix:when proto miss package config bug (#13373)
Co-authored-by: pengxiaoyu <pengxiaoyu@shengqugames.com>
Co-authored-by: earthchen <earthchen1996@gmail.com>
2023-11-20 21:57:02 +08:00
hjyp f441e79d8d
[System properties] Add the system properties tool, unified system configuration items (#13307)
* Initialize

* update code style

* delete redundant file

* Change position

* delete redundant import

* Add JsonCompatibilityUtils

* Delete unused import

* change funcs

* Add test case

* update color class

* add license

* fix style

* Add class of SystemPropertyConfigUtils

* Unify config

* Delete permit

* Fix style

* unify config

* Fix code style

* Update comment

* Normalized style

* Fix native CI bug

* unify code style

* Add log

* fix code format

* Add log

* Update graalvm

* Delete log

* Fix bugs
2023-11-20 16:42:18 +08:00
Sean Yang 633bdbd08f
fix(rpc-triple): Fix missing error code (#13379) 2023-11-20 12:56:31 +08:00
Albumen Kevin 7a44bb8ba1 Merge branch 'apache-3.2' into apache-3.3
# Conflicts:
#	dubbo-dependencies-bom/pom.xml
#	dubbo-dependencies/dubbo-dependencies-zookeeper-curator5/pom.xml
#	dubbo-dependencies/dubbo-dependencies-zookeeper/pom.xml
#	pom.xml
2023-11-20 10:59:46 +08:00
Albumen Kevin fe4a9f3592 Merge branch 'apache-3.2' into apache-3.3
# Conflicts:
#	dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/TripleHttp2Protocol.java
2023-11-16 17:54:28 +08:00
Ken Liu 3aacb6642c
Fix 3.3 application name (#13347)
* throw exception if no application name specified but registry enabled

* remove unused import

* format code
2023-11-16 17:53:09 +08:00
Albumen Kevin 976516cbc1 Merge branch 'apache-3.2' into apache-3.3
# Conflicts:
#	dubbo-spring-boot/dubbo-spring-boot-starters/observability/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/DubboObservationAutoConfiguration.java
2023-11-15 11:40:53 +08:00
Nortyr 39611ea28c
feat:RedisMetadataReport implementation (#13303)
* feat:Redis metadataReport implementation

* feat:Redis metadataReport implementation

* remove error code constant

* feat:RedisMetadataReport implementation

* fix:sonarlint issue

* fix:sonarlint bug

* remove unused imports

* fix:spotless

* add notes
2023-11-15 09:43:13 +08:00
XiaoyuPeng 31712083f4
fix:Dubbo3TripleGenerator use OuterClassName error (#13355)
* fix:Dubbo3TripleGenerator use OuterClassName error

* fix:spotless style apply

---------

Co-authored-by: pengxiaoyu <pengxiaoyu@shengqugames.com>
2023-11-14 19:57:32 +08:00
crazyhzm c877d6e6f9 Merge branch '3.2' into 3.3
# Conflicts:
#	dubbo-distribution/dubbo-all/pom.xml
#	dubbo-distribution/dubbo-bom/pom.xml
2023-11-13 11:57:54 +08:00
crazyhzm a3096054ed Add spotless for dubo-distribution
Signed-off-by: crazyhzm <crazyhzm@gmail.com>
2023-11-13 11:57:36 +08:00
Albumen Kevin c3b0c2eefa Merge branch 'apache-3.2' into apache-3.3
# Conflicts:
#	dubbo-dependencies-bom/pom.xml
#	dubbo-dependencies/dubbo-dependencies-zookeeper-curator5/pom.xml
#	dubbo-dependencies/dubbo-dependencies-zookeeper/pom.xml
#	pom.xml
2023-11-13 10:07:57 +08:00
Albumen Kevin 865f68bdc5
Enhance compiler configuration (#13342)
* Enhance compiler configuration

* comment
2023-11-10 11:27:17 +08:00
Sean Yang 2b62e88974
fix(pom): Merge metadata module into autoconfigure module (#13330) 2023-11-08 08:13:05 +08:00
crazyhzm 90bc72e641 merge 3.2
Signed-off-by: crazyhzm <crazyhzm@gmail.com>
2023-11-07 15:45:14 +08:00
huazhongming d979b211ce
[3.3]Use spotless to format the code (#13322)
* Use spotless to format the code

Signed-off-by: crazyhzm <crazyhzm@gmail.com>

* Use spotless to format the code

Signed-off-by: crazyhzm <crazyhzm@gmail.com>

* Use spotless to format the code

Signed-off-by: crazyhzm <crazyhzm@gmail.com>

* degrade dubbo version

Signed-off-by: crazyhzm <crazyhzm@gmail.com>

* degrade dubbo version

Signed-off-by: crazyhzm <crazyhzm@gmail.com>

* revert degrade dubbo version

Signed-off-by: crazyhzm <crazyhzm@gmail.com>

* Fix ut

Signed-off-by: crazyhzm <crazyhzm@gmail.com>

---------

Signed-off-by: crazyhzm <crazyhzm@gmail.com>
2023-11-07 15:41:45 +08:00
huazhongming 88deb9be3d
Fix dubbo-spring-boot-configuration-metadata-compatible check (#13323)
Signed-off-by: crazyhzm <crazyhzm@gmail.com>
2023-11-06 23:39:21 +08:00
crazyhzm d9743aa86e Merge branch '3.2' into 3.3
# Conflicts:
#	dubbo-build-tools/pom.xml
2023-11-06 20:19:56 +08:00
crazyhzm c7e548d9a2 Merge branch '3.2' into 3.3
# Conflicts:
#	dubbo-build-tools/pom.xml
#	dubbo-dependencies-bom/pom.xml
#	dubbo-distribution/pom.xml
#	pom.xml
2023-11-06 19:25:16 +08:00
crazyhzm 70469346b2 Merge branch '3.2' into 3.3 2023-11-06 19:19:20 +08:00
Sean Yang 647f58a02b
feat(config): #13299 Enhance spring boot configuration metadata (#13301) 2023-11-06 16:44:50 +08:00
huazhongming e155591adb
Fix rest compiler failure (#13310)
Signed-off-by: crazyhzm <crazyhzm@gmail.com>
2023-11-06 14:04:47 +08:00
crazyhzm 35b6682393 Merge remote-tracking branch 'upstream/3.2' into 3.3
# Conflicts:
#	dubbo-cluster/pom.xml
#	dubbo-common/src/main/java/org/apache/dubbo/common/constants/CommonConstants.java
#	dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/ServiceAnnotationPostProcessor.java
#	dubbo-demo/dubbo-demo-spring-boot/dubbo-demo-spring-boot-consumer/pom.xml
#	dubbo-demo/dubbo-demo-spring-boot/dubbo-demo-spring-boot-provider/pom.xml
#	dubbo-demo/dubbo-demo-spring-boot/pom.xml
#	dubbo-dependencies-bom/pom.xml
#	dubbo-metadata/dubbo-metadata-rest/src/main/java/org/apache/dubbo/metadata/rest/ParamType.java
#	dubbo-spring-boot/pom.xml
2023-11-06 13:29:10 +08:00
Albumen Kevin 26b9f3e48d Fix import for compile 2023-11-04 20:42:31 +08:00
lazy 48c82c0462
refactor: remove unuse applicationContext (#13285)
* refactor: remove unuse applicationContext

* refactor: remove unused imports
2023-11-04 20:28:26 +08:00
Albumen Kevin 35b4c0aba9 Bump version to 3.3.0-beta.2-SNAPSHOT 2023-11-03 21:36:51 +08:00
Albumen Kevin a46188082c Fix conflicts 2023-11-03 21:36:05 +08:00
Albumen Kevin d00757e65b Merge branch '3.3.0-beta.1-release' into apache-3.3
# Conflicts:
#	.github/workflows/release-test.yml
#	dubbo-annotation-processor/pom.xml
#	dubbo-common/src/main/java/org/apache/dubbo/common/constants/CommonConstants.java
#	dubbo-config/dubbo-config-api/pom.xml
#	dubbo-config/pom.xml
#	dubbo-metadata/dubbo-metadata-processor/pom.xml
#	dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/TripleHttp2Protocol.java
#	pom.xml
2023-11-03 21:30:19 +08:00
Sean Yang 539bb11ae7
fix(pom): #13188 Exclude unnecessary transitive dependencies for zookeeper & cleanup pom (#13230) 2023-11-02 09:54:33 +08:00
lazy a15ab195c6
extract variables (#13284) 2023-11-01 20:28:06 +08:00
Sean Yang f635de7ba2
Include module dubbo-config-spring6 in jdk17 higher versions 2023-10-30 19:03:31 +08:00
huazhongming cd35ca829a
Fix dubbo-rpc-triple module compile failed (#13283)
* Fix lost dubbo-compiler module

Signed-off-by: crazyhzm <crazyhzm@gmail.com>

* Fix dubbo-rpc-triple module compile failed

Signed-off-by: crazyhzm <crazyhzm@gmail.com>

---------

Signed-off-by: crazyhzm <crazyhzm@gmail.com>
2023-10-30 16:16:14 +08:00
huazhongming 7188a3a5cb
Fix lost dubbo-compiler module (#13278)
Signed-off-by: crazyhzm <crazyhzm@gmail.com>
2023-10-30 15:10:55 +08:00
chaicho 9681515f18
Feat: Add support for running dubbo as a native image with nacos as the registry centre. (#13246)
* Add support for building native image with nacos as registry centre.

* Remove unused import.

* Introduce the classes directly to prevent incompatibilities except for the private ones. Remove some unnecessary configs.

* Use the import statements instead of the full quaifified classNames except for those sharing the same className.
2023-10-26 16:49:17 +08:00
huazhongming ba94cf0b17
Move dubbo-compiler into dubbo-plugin (#13266)
* Move dubbo-compiler into dubbo-plugin

Signed-off-by: crazyhzm <crazyhzm@gmail.com>

* Fix license check

Signed-off-by: crazyhzm <crazyhzm@gmail.com>

---------

Signed-off-by: crazyhzm <crazyhzm@gmail.com>
2023-10-26 14:00:28 +08:00
XiaoYu d0c41f512e
feat:remove jprotoc (#13145)
* feat:remove jprotoc

* fix:add dependency and license

* fix:remove useless import

* fix:checkstyle bug

* fix:SonarCloud bug

* refactor:remove a package path

* fix:handle InterruptedException

* refactor:modify license and format code

* fix:checkstyle excluded

* Add NOTICE

* fix:remove unless notice

* refactor:code format

---------

Co-authored-by: Albumen Kevin <jhq0812@gmail.com>
Co-authored-by: pengxiaoyu <pengxiaoyu@shengquganmes.com>
2023-10-19 12:32:38 +08:00
Sean Yang c98c4873ff
fix(rpc-triple): Fix TripleReflectionTypeDescriberRegistrar Compilation Failure (#13231) 2023-10-19 10:46:30 +08:00
Albumen Kevin 0562b64828 Merge branch 'apache-3.2' into apache-3.3
# Conflicts:
#	dubbo-cluster/pom.xml
#	dubbo-dependencies-bom/pom.xml
#	dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/Constants.java
2023-10-18 19:02:54 +08:00
Sean Yang 7696e1b42c
fix(pom): Ignore module dubbo-config-spring6 when jdk version < 17 (#13227)
Closes #13226
2023-10-18 16:38:46 +08:00
namelessssssssssss 027aba599e
Fix wrong return types for StubMethodDescriptor (#13200) 2023-10-17 16:57:31 +08:00
lazy 3e50bdd16f
refactor: modify modulemodel obtain from beanfactory (#13181) 2023-10-13 16:59:11 +08:00
Albumen Kevin 8bdcaf6865 Merge branch 'apache-3.2' into apache-3.3 2023-10-11 09:35:22 +08:00
lazy c72c55aa67
refactor: modify variable naming and extract constants (#13176) 2023-10-10 13:59:28 +08:00
Albumen Kevin bbee466e44 Merge branch 'apache-3.2' into apache-3.3 2023-10-10 10:30:03 +08:00
huazhongming acee3e2f03
Move dubbo-filter module to dubbo-plugin (#13143)
Signed-off-by: crazyhzm <crazyhzm@gmail.com>
2023-10-09 15:35:58 +08:00
Albumen Kevin a709b2803c Fix conflicts 2023-10-08 14:55:51 +08:00
Albumen Kevin 1848e400a0 Merge branch 'apache-3.2' into apache-3.3
# Conflicts:
#	dubbo-dependencies-bom/pom.xml
#	dubbo-dependencies/dubbo-dependencies-zookeeper-curator5/pom.xml
#	dubbo-dependencies/dubbo-dependencies-zookeeper/pom.xml
#	dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/data/BaseStatComposite.java
#	dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/collector/DefaultMetricsCollector.java
#	dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/collector/sample/ThreadPoolMetricsSampler.java
#	dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/collector/sample/ThreadRejectMetricsCountSampler.java
#	pom.xml
2023-10-08 14:46:26 +08:00
huazhongming 0dab17f11d
Fix VirtualThreadPool apache license (#13157)
Signed-off-by: crazyhzm <crazyhzm@gmail.com>
2023-10-08 12:16:09 +08:00
lazy 2bf662ce90
delete useless parts and rewrite the code (#13138)
* refactor: modify non-standard naming

* refactor: delete useless parts and rewrite the code

---------

Co-authored-by: liuzhigang <liuzg3@asiainfo.com>
Co-authored-by: Albumen Kevin <jhq0812@gmail.com>
2023-09-29 20:33:22 +08:00
crazyhzm d050b9c6ec Merge branch '3.2' into 3.3 2023-09-28 17:17:17 +08:00
Albumen Kevin 0c9d5e2f73 Merge branch 'apache-3.3' into 3.3.0-beta.1-release 2023-09-26 16:51:09 +08:00
Albumen Kevin bcd5caf7df
Fix loom project pom (#13132) 2023-09-26 16:50:53 +08:00
Albumen Kevin 0b2b9f735a Fix conflicts 2023-09-26 16:38:32 +08:00
Albumen Kevin a0e7ebc735 Merge branch 'apache-3.3' into 3.3.0-beta.1-release
# Conflicts:
#	dubbo-common/src/main/java/org/apache/dubbo/common/constants/CommonConstants.java
#	dubbo-plugin/dubbo-native/pom.xml
#	dubbo-remoting/dubbo-remoting-netty4/src/test/java/org/apache/dubbo/remoting/transport/netty4/PortUnificationServerTest.java
#	dubbo-test/dubbo-test-modules/src/test/java/org/apache/dubbo/dependency/FileTest.java
2023-09-26 16:37:37 +08:00
Ken Liu 7246fad6b5
fix javadoc compile issue (#13128) 2023-09-26 16:00:52 +08:00
huazhongming c96a8f3719
Fix dubbo-plugin-loom module groupId (#13130)
Signed-off-by: crazyhzm <crazyhzm@gmail.com>
2023-09-26 14:01:43 +08:00
huazhongming 660d5a2ecd
Add dubbo-native module (#13127)
Signed-off-by: crazyhzm <crazyhzm@gmail.com>
2023-09-26 11:40:15 +08:00
Albumen Kevin 4f32e0aba3
Support project loom as thread pool factory (#13111)
fixes #10768
2023-09-26 11:03:23 +08:00
huazhongming fb0911de97
Clear ReferenceAnnotationWithAotBeanPostProcessor logic (#13098)
Signed-off-by: crazyhzm <crazyhzm@gmail.com>
2023-09-26 10:34:30 +08:00
lazy 0fd51b1ca0
refactor: modify non-standard naming (#13059)
Co-authored-by: liuzhigang <liuzg3@asiainfo.com>
Co-authored-by: Albumen Kevin <jhq0812@gmail.com>
2023-09-25 19:35:01 +08:00
huazhongming 54da4da033
Move dubbo-native to dubbo-plugin (#13080)
Signed-off-by: crazyhzm <crazyhzm@gmail.com>
2023-09-25 19:23:25 +08:00
Ken Liu cff9bfd1d2
fix loading process cannot load environment variables. (#13091) 2023-09-23 16:54:00 +08:00
Albumen Kevin 9eb49e24c3
Fix uts on 3.3 (#13087) 2023-09-21 09:35:59 +08:00
crazyhzm 0f61286a78 Merge branch '3.2' into 3.3
# Conflicts:
#	dubbo-dependencies-bom/pom.xml
2023-09-20 15:32:19 +08:00
foghost abb2d3834d
update qos native-image reflect config (#13056) 2023-09-18 11:42:51 +08:00
huazhongming 4b5c186076
Replace dubbo-build-tools with dubbo-shared-resources (#13016) 2023-09-13 16:05:17 +08:00
Albumen Kevin 3ed2dacbef Merge branch 'apache-3.2' into apache-3.3
# Conflicts:
#	dubbo-common/src/main/java/org/apache/dubbo/common/constants/CommonConstants.java
#	dubbo-common/src/main/java/org/apache/dubbo/config/MetricsConfig.java
#	dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/ReferenceBean.java
#	dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/ServiceAnnotationPostProcessor.java
#	dubbo-dependencies-bom/pom.xml
#	dubbo-dependencies/dubbo-dependencies-zookeeper-curator5/pom.xml
#	dubbo-dependencies/dubbo-dependencies-zookeeper/pom.xml
#	dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/collector/DefaultMetricsCollector.java
#	dubbo-remoting/dubbo-remoting-netty4/src/main/java/org/apache/dubbo/remoting/transport/netty4/NettyServer.java
#	pom.xml
2023-09-11 17:16:07 +08:00
icodening 99ba6e3037
Fix hard dependency on protobuf on pojo mode (#13012) 2023-09-06 21:28:14 +08:00
huazhongming 8009c72030
Ignore class loading failure when native is compiled (#13009)
Signed-off-by: crazyhzm <crazyhzm@gmail.com>
2023-09-05 11:31:54 +08:00
icodening dad3b070cd
fix pb class not found (#12997) 2023-09-04 10:53:51 +08:00
icodening fd04ef711b Merge remote-tracking branch 'upstream/3.3.0-beta.1-release' into 3.3.0-beta.1-release 2023-09-02 12:05:37 +08:00
icodening d596eeb151
Add protobuf json format support for triple (#12996) 2023-09-02 10:48:41 +08:00
icodening fe2af7e354 fix h2 curl error 2023-09-01 17:16:41 +08:00
icodening cfd0be3a3a
fix h1 and grpc status code (#12994) 2023-09-01 17:05:45 +08:00
namelessssssssssss 7e6a32ba68
* Fix conflict (#12991) 2023-09-01 10:26:02 +08:00
icodening 059b75c533
[feat.] new triple protocol implement (#12873) 2023-09-01 09:43:04 +08:00
Albumen Kevin 36a80e4db7 Merge branch 'apache-3.2' into apache-3.3
# Conflicts:
#	dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/collector/DefaultMetricsCollector.java
#	dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/collector/sample/ThreadRejectMetricsCountSampler.java
#	dubbo-metrics/dubbo-metrics-event/src/main/java/org/apache/dubbo/metrics/model/key/MetricsKey.java
2023-08-31 18:59:20 +08:00
namelessssssssssss bf3d4f4ca3
Metrics event split (#12888)
* Split event-related api out of dubbo-metrics-api.

* Add new module to .artifacts

* Temporary remove dubbo-plugin-metrics

* Fix pom

* * Remove the use of dispatcher name

* * Bug fix

* * Bug fix

* Update ScopeClusterInvokerTest.java

* * Trigger test

* * Fix ut

---------

Co-authored-by: songxiaosheng <songxiaosheng@elastic.link>
2023-08-31 08:02:41 +08:00
Ken Liu 8e55dae8f9
Feature improvement, only register one url for port unification. (#12528) 2023-08-30 21:48:57 +08:00
hjyp f91246ab09
【OSPP】Json check compatiblity (#12910)
* Initialize

* update code style

* delete redundant file

* Change position

* delete redundant import

* Add JsonCompatibilityUtils

* Delete unused import

* change funcs

* Add test case

* update color class

* add license

* fix style

* check interface

* Fix log style

* Add attribbute of check-json-level

* Update log style

* Update log style

* Fix bugs

* Add test and document

* Fix bugs

* Delete yaml

* Delete xml

* Add license

* Add license

* Merge upstream branch

* Update IllegalStateException
2023-08-29 11:53:15 +08:00
chickenlj 186ec674bf Merge branch '3.3' into 3.3.0-beta.1-release 2023-08-28 17:06:55 +08:00
chickenlj 98d6a853a9 Merge branch '3.3.0-beta.1-release' of https://github.com/apache/dubbo into 3.3.0-beta.1-release
# Conflicts:
#	dubbo-dependencies-bom/pom.xml
2023-08-28 14:50:35 +08:00
carlvine500 679ce4496c
tag support multi level (#12673) 2023-08-24 16:51:06 +08:00
Albumen Kevin 4e9a0a41fc Fix callback consumer context package 2023-08-22 15:08:23 +08:00
Albumen Kevin 7a4ec6c525 Merge branch 'apache-3.2' into apache-3.3
# Conflicts:
#	README.md
#	dubbo-common/src/main/java/org/apache/dubbo/common/constants/CommonConstants.java
#	dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/deploy/DefaultApplicationDeployer.java
#	dubbo-dependencies-bom/pom.xml
#	dubbo-dependencies/dubbo-dependencies-zookeeper-curator5/pom.xml
#	dubbo-dependencies/dubbo-dependencies-zookeeper/pom.xml
#	dubbo-metadata/dubbo-metadata-rest/src/main/java/org/apache/dubbo/metadata/rest/springmvc/SpringMvcServiceRestMetadataResolver.java
#	dubbo-metadata/dubbo-metadata-rest/src/test/java/org/apache/dubbo/metadata/rest/NoAnnotationApiDemoResolverTest.java
#	dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/model/key/MetricsKey.java
#	dubbo-monitor/dubbo-monitor-common/src/main/java/org/apache/dubbo/monitor/support/CallbackConsumerContextFilter.java
#	pom.xml
2023-08-22 15:05:41 +08:00
Ken Liu ae150c01e5
3.3 readme (#12898) 2023-08-17 09:53:09 +08:00
Ken Liu 56de12127b
Revert "Add Dubbo Annotation Processor (Add deprecated method warn when called by user, #10850) (#11513)" (#12871)
This reverts commit 0b6f2e4a8d.
2023-08-16 16:25:08 +08:00
conghuhu 629bee3987
feat: add brave to core (#12814) 2023-08-14 15:42:40 +08:00
namelessssssssssss 5ae875d951
Add support for error code metrics (#12125) (#12661)
* Add metrics support of error code

* Add metrics support of error code

* Add metrics support of error code

* add license

* remove hashcode override

* Update DefaultSubDispatcher.java

* Update ErrorCodeSampleTest.java

* Update DefaultMetricsCollector.java

---------

Co-authored-by: songxiaosheng <songxiaosheng@elastic.link>
2023-08-09 17:56:47 +08:00
胡俊 04f3fe7d2b
add netty4 metrics. (#12695) 2023-08-09 15:46:03 +08:00
icodening 8bfdf1e38c
unification HTTP server side (#12815) 2023-08-09 14:00:25 +08:00
chaicho 059fdf2613
Add module dubbo-all-shaded to avoid netty version conflict. (#12864) 2023-08-08 16:40:24 +08:00
suncairong163 7c971ca1bd
feign client service name cover dubbo provided by (#12838)
Co-authored-by: suncr <suncairong@moresec.cn>
2023-08-07 17:06:39 +08:00
hjyp b18eeb7077
[OSPP 2023] JSON Compatibility Check (#12776)
* Initialize

* update code style

* delete redundant file

* Change position

* delete redundant import

* Add JsonCompatibilityUtils

* Delete unused import

* change funcs

* Add test case

* update color class

* add license

* fix style
2023-08-04 10:42:38 +08:00
suncairong163 6c5a876f31
Feature/dubbo3.3 add reserence providedby by springcloud feignclient (#12823) 2023-08-01 15:43:20 +08:00
Albumen Kevin ce65317207 Fix conflicts 2023-07-29 20:52:35 +08:00
Albumen Kevin 046898bbc8 Merge branch 'apache-3.2' into apache-3.3
# Conflicts:
#	dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/DubboInfraBeanRegisterPostProcessor.java
#	dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/pu/QosDetector.java
#	dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/pu/QosHTTP1Detector.java
#	dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/pu/TelnetDetector.java
#	dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/pu/QosWireProtocolTest.java
#	dubbo-rpc/dubbo-rpc-api/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.rpc.Filter
2023-07-29 20:52:17 +08:00
huazhongming 29d9c070d4
Upgrade spring version 6.0.7 to 6.0.11 and upgrade spring-boot version 3.0.4 to 3.0.9 (#12797)
Signed-off-by: crazyhzm <crazyhzm@gmail.com>
2023-07-26 15:26:06 +08:00
Albumen Kevin 8fefd95a98 Merge branch 'apache-3.2' into apache-3.3 2023-07-26 11:22:21 +08:00
Albumen Kevin 2973426b2a Merge branch 'apache-3.2' into apache-3.3
# Conflicts:
#	dubbo-demo/dubbo-demo-spring-boot/pom.xml
#	dubbo-dependencies-bom/pom.xml
2023-07-26 10:58:32 +08:00
huazhongming 70605f4dd0
Fix native image compilation failure due to missing parameterless constructs of ServiceBean (#12733)
* Fix native image compilation failure due to missing parameterless constructs of ServiceBean

Signed-off-by: crazyhzm <crazyhzm@gmail.com>

* Add ServiceBean constructorArgumentValues

Signed-off-by: crazyhzm <crazyhzm@gmail.com>

* remove unused import

Signed-off-by: crazyhzm <crazyhzm@gmail.com>

* autowired moduleModel

Signed-off-by: crazyhzm <crazyhzm@gmail.com>

* remove unused import

Signed-off-by: crazyhzm <crazyhzm@gmail.com>

---------

Signed-off-by: crazyhzm <crazyhzm@gmail.com>
2023-07-25 21:16:49 +08:00
Albumen Kevin d1719c5358 Remove -1 delay usage (#12767) 2023-07-25 20:57:39 +08:00
dependabot[bot] 0e17f4f168 Bump micrometer-core from 1.11.1 to 1.11.2 (#12746)
Bumps [micrometer-core](https://github.com/micrometer-metrics/micrometer) from 1.11.1 to 1.11.2.
- [Release notes](https://github.com/micrometer-metrics/micrometer/releases)
- [Commits](https://github.com/micrometer-metrics/micrometer/compare/v1.11.1...v1.11.2)

---
updated-dependencies:
- dependency-name: io.micrometer:micrometer-core
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Albumen Kevin <jhq0812@gmail.com>
2023-07-25 20:57:39 +08:00
dependabot[bot] 72e5d20ce9 Bump micrometer-tracing-bom from 1.1.2 to 1.1.3 (#12743)
Bumps [micrometer-tracing-bom](https://github.com/micrometer-metrics/tracing) from 1.1.2 to 1.1.3.
- [Release notes](https://github.com/micrometer-metrics/tracing/releases)
- [Commits](https://github.com/micrometer-metrics/tracing/compare/v1.1.2...v1.1.3)

---
updated-dependencies:
- dependency-name: io.micrometer:micrometer-tracing-bom
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-07-25 20:57:38 +08:00
promiseChan 0db8605974
fix_win11_aot_compile_NoSuchFileException,because of File.separator (#12769) 2023-07-21 11:27:57 +08:00
Albumen Kevin 80d496c5b1 Fix conflicts 2023-07-19 15:37:20 +08:00
Albumen Kevin 093fb7c208 Merge branch 'apache-3.2' into apache-3.3
# Conflicts:
#	dubbo-cluster/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.filter.ClusterFilter
#	dubbo-common/src/main/java/org/apache/dubbo/common/constants/CommonConstants.java
#	dubbo-config/dubbo-config-api/pom.xml
#	dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/ReferenceBean.java
#	dubbo-dependencies-bom/pom.xml
#	dubbo-dependencies/dubbo-dependencies-zookeeper-curator5/pom.xml
#	dubbo-dependencies/dubbo-dependencies-zookeeper/pom.xml
#	dubbo-metrics/dubbo-metrics-default/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.rpc.Filter
#	dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/Constants.java
#	dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/NettyHttpRestServer.java
#	dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/deploy/ServiceDeployer.java
#	dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/handler/NettyHttpHandler.java
#	dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/message/codec/JsonCodec.java
#	pom.xml
2023-07-19 15:18:51 +08:00
suncairong163 f78b4f5dea
add rest provider body multipart json that JsonUtils supports ut (#12716) 2023-07-17 13:29:10 +08:00
suncairong163 1f8a0fa5ec
add feign client annotation support (#12736) 2023-07-17 12:34:28 +08:00
MartinDai f2ec217f54
log messages support use placeholders and parameters (#12365)
* log messages support use placeholders and parameters

* mockLogger add implements method

* reformat file

* fix unit test error

* fix sonar security

* remove unnecessary util

* update file license

* update file license

* add checkstyle ignore

---------

Co-authored-by: Albumen Kevin <jhq0812@gmail.com>
2023-07-13 19:52:23 +08:00
suncairong163 c7d411c3cb
Feature/dubbo rest no annotation support (#12700) 2023-07-11 13:38:49 +08:00
TomlongTK 8bb17b85f2
GsonUtils provide toJson method, GenericFilter use gson mode support toJson (#12633)
Co-authored-by: Albumen Kevin <jhq0812@gmail.com>
2023-07-11 12:49:07 +08:00
conghuhu 4b62513dff
chore: add seata sentinel starter & rename tracing starter (#12543)
Co-authored-by: Albumen Kevin <jhq0812@gmail.com>
Co-authored-by: Ken Liu <ken.lj.hz@gmail.com>
2023-07-07 10:22:48 +08:00
Albumen Kevin 9bbf7625a8 Merge branch 'apache-3.2' into apache-3.3 2023-07-03 16:07:41 +08:00
qinliujie 0d4e8304bc
refactor dubbo module (#12276)
* refactor:extract MergeableCluster as a single module

* fix:add license header

* fix:add dubbo-plugin-cluster-mergeable to .artifacts

* refactor:extract module from dubbo-cluster

* refactor:extract dubbo-plugin-router-condition module

* refactor:extract dubbo-plugin-router-tag module

* refactor:move metric filter out from dubbo-cluster

* refactor:add pom dependency

* fix:ut and dependency

* fix:ut

* refactor:extract dubbo-plugin-loadbalance-adaptive

* refactor:extract dubbo-remoting-zookeeper-api module

* refactor:extract dubbo-configcenter-file module

* refactor:extract dubbo-metadata-rest module

* refactor:extract dubbo-monitor-common module

* refactor: extrace dubbo-plugin-access-log module

* refactor: extrace dubbo-plugin-tps module

* refactor: extrace dubbo-plugin-token module

* refactor: extract dubbo-plugin-generic-invoke module

* refactor: extract dubbo-plugin-context module

* refactor: extract dubbo-plugin-classloader-filter module

* refactor: extract dubbo-plugin-proxy-bytebuddy module

* refactor: extract dubbo-plugin-qos-trace module

* refactor: extract FutureFilter from dubbo protocol module

* refactor: add modules to pom

* ut:fix ut dependency
2023-07-03 15:55:42 +08:00
Albumen Kevin 33a8063309 Update release test 2023-06-30 22:48:37 +08:00
Albumen Kevin d4c2852caf Prapare 3.3.0-beta.1 release 2023-06-30 22:46:49 +08:00
Albumen Kevin 48cc5b24de Merge branch 'apache-3.2' into apache-3.3
# Conflicts:
#	dubbo-dependencies-bom/pom.xml
#	dubbo-dependencies/dubbo-dependencies-zookeeper-curator5/pom.xml
#	dubbo-dependencies/dubbo-dependencies-zookeeper/pom.xml
#	pom.xml
2023-06-30 22:45:24 +08:00
Albumen Kevin 37f150263a
Disable subscribe nacos legacy name in 3.3 (#12617) 2023-06-29 14:50:00 +08:00
conghuhu 95207b9079
fix: fix missing metrics filter & recover #12453 (#12577)
* recover "refactor: migrate tracing core from boot-start to dubbo deployer (#12453)"

This reverts commit ea35f7ed5c.

* fix: fix missing metrics filter

---------

Co-authored-by: songxiaosheng <songxiaosheng@elastic.link>
Co-authored-by: Albumen Kevin <jhq0812@gmail.com>
2023-06-28 20:36:38 +08:00
Albumen Kevin da8d0cd994 Merge branch 'apache-3.2' into apache-3.3 2023-06-28 20:35:33 +08:00
carlvine500 27e6838c3b
add spring boot interceptor to copy header(dubbo-tag)/cookie(dubbo.tag) (#12514)
* add spring boot interceptor to copy header(dubbo-tag)/cookie(dubbo.tag)

* copy dubbo.tag in urlParameter

* copy dubbo.tag in urlParameter

* remove dubbo.tag in interceptor

* add dubbo-spring-boot-interceptor to dubbo-dependencies-all/.artifacts/dubbo-bom

---------

Co-authored-by: liutingfeng <tingfeng.liu@successchannel.com>
Co-authored-by: songxiaosheng <songxiaosheng@elastic.link>
Co-authored-by: Albumen Kevin <jhq0812@gmail.com>
2023-06-28 20:30:45 +08:00
songxiaosheng 1c65617fb1
add framework metrics (#12576)
* add framework metric

*  add framework metrics

*  add framework metrics
2023-06-28 20:27:08 +08:00
Albumen Kevin cf2a63580e
Service not register to registry if specify register=false (#12584) 2023-06-22 14:35:41 +08:00
Albumen Kevin d6776e4008 Merge branch 'apache-3.2' into apache-3.3 2023-06-22 14:30:33 +08:00
Albumen Kevin b14201f393 Merge branch 'apache-3.2' into apache-3.3
# Conflicts:
#	dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/DubboInfraBeanRegisterPostProcessor.java
#	dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/RegistryScopeModelInitializer.java
#	dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/Constants.java
2023-06-22 10:18:31 +08:00
foghost c96a06eba1
add tri native image support (#12536)
Co-authored-by: huazhongming <crazyhzm@gmail.com>
2023-06-19 11:26:50 +08:00
huazhongming 1e59ab524a
In native scenarios, Compiler and Proxy are set to jdk by default (#12530)
* In native scenarios, Compiler and Proxy are set to jdk by default

Signed-off-by: crazyhzm <crazyhzm@gmail.com>

* Fix UT

Signed-off-by: crazyhzm <crazyhzm@gmail.com>

---------

Signed-off-by: crazyhzm <crazyhzm@gmail.com>
2023-06-15 10:11:44 +08:00
Albumen Kevin fd14e7b76f Merge branch 'apache-3.2' into apache-3.3
# Conflicts:
#	dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/RestProtocol.java
#	dubbo-test/dubbo-test-modules/src/test/java/org/apache/dubbo/dependency/FileTest.java
2023-06-12 20:52:32 +08:00
Albumen Kevin 642f741dba Merge branch 'apache-3.2' into apache-3.3
# Conflicts:
#	dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/ReferenceBean.java
#	dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/ServiceAnnotationPostProcessor.java
#	dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/reference/ReferenceBeanSupport.java
2023-06-08 16:16:15 +08:00
suncairong163 85bc6ea472
http protocol detector (#12452)
* http protocol detector

* make differnece between rest and qos http

* set rest http wire protocol spi order  after qos http detector

* make differnce between rest and qos http detector

* add differnt  service to server  url

* adjust code position

* complete some change request

* passing ServiceDeployer to  PortUnificationServer through URL

* merge code and add qos detect ut
2023-06-08 11:13:35 +08:00
icodening 391d3cdb35
support passing detect context to help build netty handlers (#12460) 2023-06-07 15:19:06 +08:00
huazhongming 2031a4c531
Remove NativeUtils (#12454)
Signed-off-by: crazyhzm <crazyhzm@gmail.com>
2023-06-06 17:42:12 +08:00
huazhongming e642e72ce8
Fixed the issue of superclass and filed not being loaded automatically in the native serialization config scenario (#12435)
* Fixed the issue of superclass and filed not being loaded automatically in the native serialization config scenario

Signed-off-by: crazyhzm <crazyhzm@gmail.com>

* Add license

Signed-off-by: crazyhzm <crazyhzm@gmail.com>

* Fix test

Signed-off-by: crazyhzm <crazyhzm@gmail.com>

* Fix test

Signed-off-by: crazyhzm <crazyhzm@gmail.com>

* add log

Signed-off-by: crazyhzm <crazyhzm@gmail.com>

* add log

Signed-off-by: crazyhzm <crazyhzm@gmail.com>

* Fix AotUtilsTest

Signed-off-by: crazyhzm <crazyhzm@gmail.com>

---------

Signed-off-by: crazyhzm <crazyhzm@gmail.com>
2023-06-01 15:01:20 +08:00
huazhongming 4604b8074a
Support for automatic identification of serialization classes and generation of native image configuration (#12433)
Signed-off-by: crazyhzm <crazyhzm@gmail.com>
2023-05-31 16:05:54 +08:00
Albumen Kevin 30daba2d74 Merge branch 'apache-3.2' into apache-3.3
# Conflicts:
#	dubbo-dependencies-bom/pom.xml
#	dubbo-dependencies/dubbo-dependencies-zookeeper-curator5/pom.xml
#	dubbo-dependencies/dubbo-dependencies-zookeeper/pom.xml
#	dubbo-metrics/dubbo-metrics-default/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.metrics.collector.MetricsCollector
#	dubbo-plugin/dubbo-qos/pom.xml
#	pom.xml
2023-05-29 16:01:02 +08:00
huazhongming 1f39543632
Skip security and xds module javadoc plugin (#12413)
Signed-off-by: crazyhzm <crazyhzm@gmail.com>
2023-05-28 18:45:36 +08:00
huazhongming 71046bdd6f
skip demo javadoc (#12411)
Signed-off-by: crazyhzm <crazyhzm@gmail.com>
2023-05-28 15:07:30 +08:00
huazhongming ae4899a462
Override the maven-javadoc-plugin configuration that depends on the pass (#12410)
* Override the maven-javadoc-plugin configuration that depends on the pass

Signed-off-by: crazyhzm <crazyhzm@gmail.com>

* Fix maven-javadoc-plugin

Signed-off-by: crazyhzm <crazyhzm@gmail.com>

* skip maven javadoc plugin

Signed-off-by: crazyhzm <crazyhzm@gmail.com>

---------

Signed-off-by: crazyhzm <crazyhzm@gmail.com>
2023-05-28 09:43:18 +08:00
huazhongming 7661cab6f5
Javadoc ingore missing excpetion (#12405)
Signed-off-by: crazyhzm <crazyhzm@gmail.com>
2023-05-26 23:34:19 +08:00
crazyhzm d798e7c3be Merge branch '3.2' into 3.3 2023-05-26 11:34:53 +08:00
crazyhzm 34eb252178 Merge branch '3.2' into 3.3 2023-05-24 22:24:10 +08:00
Albumen Kevin 59758f4b58 Merge branch 'apache-3.2' into apache-3.3 2023-05-23 20:00:42 +08:00
huazhongming 52e4e4e301
remove dubbo-native-plugin module (#12358)
Signed-off-by: crazyhzm <crazyhzm@gmail.com>
2023-05-21 21:00:46 +08:00
crazyhzm 71cc51bf69 Merge branch '3.2' into 3.3
# Conflicts:
#	dubbo-dependencies-bom/pom.xml
#	dubbo-dependencies/dubbo-dependencies-zookeeper-curator5/pom.xml
#	dubbo-dependencies/dubbo-dependencies-zookeeper/pom.xml
#	pom.xml
2023-05-17 14:07:55 +08:00
huazhongming a80ad7f505
fix license check (#12268)
Signed-off-by: crazyhzm <crazyhzm@gmail.com>
2023-05-09 17:26:48 +08:00
Albumen Kevin 9f0e1589a5 Merge branch 'apache-3.2' into apache-3.3
# Conflicts:
#	.licenserc.yaml
2023-05-08 08:07:10 +08:00
XIACYBING 471f44b52d
fix: fix inappropriate invoke in unsubscribe retry task (#12231) 2023-05-05 20:26:34 +08:00
Albumen Kevin 992abd2d34 Merge branch 'apache-3.2' into apache-3.3
# Conflicts:
#	dubbo-config/dubbo-config-api/pom.xml
#	dubbo-distribution/dubbo-all/pom.xml
#	dubbo-metrics/dubbo-metrics-default/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.metrics.collector.MetricsCollector
#	pom.xml
2023-05-05 13:07:25 +08:00
huazhongming 9d9df82194
Fix the dubbo-config-spring6 module is lost (#12228)
Signed-off-by: crazyhzm <crazyhzm@gmail.com>
2023-05-05 11:31:07 +08:00
huazhongming 6c8f79c889
Native Support Springboot3 (#12072)
* Support native with springboot3

Signed-off-by: crazyhzm <crazyhzm@gmail.com>

* fix checkstyle

Signed-off-by: crazyhzm <crazyhzm@gmail.com>

* remove useless imports

Signed-off-by: crazyhzm <crazyhzm@gmail.com>

* remove useless imports

Signed-off-by: crazyhzm <crazyhzm@gmail.com>

* change java version of  build-source actions to jdk17

Signed-off-by: crazyhzm <crazyhzm@gmail.com>

* dubbo-serialization-fastjson2 support native

Signed-off-by: crazyhzm <crazyhzm@gmail.com>

* fix xml config

Signed-off-by: crazyhzm <crazyhzm@gmail.com>

* fix singleton bean

Signed-off-by: crazyhzm <crazyhzm@gmail.com>

* ignore test

Signed-off-by: crazyhzm <crazyhzm@gmail.com>

* ignore dubbo-config-spring6 module in dubbo all

Signed-off-by: crazyhzm <crazyhzm@gmail.com>

* remove @ignore

Signed-off-by: crazyhzm <crazyhzm@gmail.com>

* add dubbo-config-spring6 to dubbo-bom

Signed-off-by: crazyhzm <crazyhzm@gmail.com>

* add dubbo-config-spring6 to dubbo-test

Signed-off-by: crazyhzm <crazyhzm@gmail.com>

* add transformer

Signed-off-by: crazyhzm <crazyhzm@gmail.com>

* ignore  dubbo-config-spring6

Signed-off-by: crazyhzm <crazyhzm@gmail.com>

* fix JsonUtilsTest

Signed-off-by: crazyhzm <crazyhzm@gmail.com>

* fix JsonUtilsTest

Signed-off-by: crazyhzm <crazyhzm@gmail.com>

---------

Signed-off-by: crazyhzm <crazyhzm@gmail.com>
2023-04-25 11:30:17 +08:00
Andy Cheung 2997fa6a2e
Make Annotation Processor's Dependency optional. (#12112) 2023-04-19 10:10:10 +08:00
Andy Cheung 13558a8e6a
Add ignorance of FileTest.java. (#12105) 2023-04-16 17:00:25 +08:00
Albumen Kevin 59832d45d4 Merge branch 'apache-3.2' into apache-3.3
# Conflicts:
#	dubbo-dependencies-bom/pom.xml
#	dubbo-dependencies/dubbo-dependencies-zookeeper-curator5/pom.xml
#	dubbo-dependencies/dubbo-dependencies-zookeeper/pom.xml
#	pom.xml
2023-04-15 07:28:32 +08:00
Albumen Kevin fe55491d4a Merge branch 'apache-3.2' into apache-3.3
# Conflicts:
#	dubbo-common/src/main/java/org/apache/dubbo/common/utils/JsonUtils.java
#	dubbo-dependencies-bom/pom.xml
#	dubbo-dependencies/dubbo-dependencies-zookeeper-curator5/pom.xml
#	dubbo-dependencies/dubbo-dependencies-zookeeper/pom.xml
2023-04-13 20:32:44 +08:00
Andy Cheung b23bae38cc
[3.3] Remove deprecated method invocation in tests (Common Module). (#11934)
* Remove setJson() method.

* Remove test only methods in FileCacheStore, FileCacheStoreFactory.
2023-03-28 15:27:38 +08:00
Andy Cheung 0b6f2e4a8d
Add Dubbo Annotation Processor (Add deprecated method warn when called by user, #10850) (#11513) 2023-03-24 09:48:08 +08:00
Albumen Kevin 414785c05b Merge branch 'apache-3.2' into apache-3.3
# Conflicts:
#	dubbo-dependencies-bom/pom.xml
#	dubbo-dependencies/dubbo-dependencies-zookeeper-curator5/pom.xml
#	dubbo-dependencies/dubbo-dependencies-zookeeper/pom.xml
#	pom.xml
2023-03-21 17:49:14 +08:00
Albumen Kevin 52611099ab Bump version to 3.3.0-beta.1-SNAPSHOT 2023-02-20 16:24:28 +08:00
1337 changed files with 53570 additions and 15610 deletions

View File

@ -19,8 +19,8 @@
dubbo dubbo
dubbo-auth dubbo-auth
dubbo-apache-release dubbo-apache-release
dubbo-all-shaded
dubbo-bom dubbo-bom
dubbo-build-tools
dubbo-cluster dubbo-cluster
dubbo-common dubbo-common
dubbo-compatible dubbo-compatible
@ -28,13 +28,12 @@ dubbo-compiler
dubbo-config dubbo-config
dubbo-config-api dubbo-config-api
dubbo-config-spring dubbo-config-spring
dubbo-config-spring6
dubbo-configcenter dubbo-configcenter
dubbo-configcenter-file
dubbo-configcenter-apollo dubbo-configcenter-apollo
dubbo-configcenter-nacos dubbo-configcenter-nacos
dubbo-configcenter-zookeeper dubbo-configcenter-zookeeper
dubbo-container
dubbo-container-api
dubbo-container-spring
dubbo-core-spi dubbo-core-spi
dubbo-dependencies dubbo-dependencies
dubbo-dependencies-all dubbo-dependencies-all
@ -42,13 +41,13 @@ dubbo-dependencies-bom
dubbo-dependencies-zookeeper dubbo-dependencies-zookeeper
dubbo-dependencies-zookeeper-curator5 dubbo-dependencies-zookeeper-curator5
dubbo-distribution dubbo-distribution
dubbo-filter
dubbo-filter-cache dubbo-filter-cache
dubbo-filter-validation dubbo-filter-validation
dubbo-kubernetes dubbo-kubernetes
dubbo-maven-plugin dubbo-maven-plugin
dubbo-metadata dubbo-metadata
dubbo-metadata-api dubbo-metadata-api
dubbo-metadata-rest
dubbo-metadata-definition-protobuf dubbo-metadata-definition-protobuf
dubbo-metadata-processor dubbo-metadata-processor
dubbo-metadata-report-nacos dubbo-metadata-report-nacos
@ -61,11 +60,9 @@ dubbo-metrics-metadata
dubbo-metrics-prometheus dubbo-metrics-prometheus
dubbo-metrics-registry dubbo-metrics-registry
dubbo-metrics-config-center dubbo-metrics-config-center
dubbo-monitor dubbo-metrics-netty
dubbo-monitor-api dubbo-metrics-event
dubbo-monitor-default
dubbo-native dubbo-native
dubbo-native-plugin
dubbo-parent dubbo-parent
dubbo-plugin dubbo-plugin
dubbo-qos dubbo-qos
@ -77,11 +74,14 @@ dubbo-registry-multicast
dubbo-registry-multiple dubbo-registry-multiple
dubbo-registry-nacos dubbo-registry-nacos
dubbo-registry-zookeeper dubbo-registry-zookeeper
dubbo-xds
dubbo-remoting dubbo-remoting
dubbo-remoting-api dubbo-remoting-api
dubbo-remoting-http dubbo-remoting-http
dubbo-remoting-http12
dubbo-remoting-netty dubbo-remoting-netty
dubbo-remoting-netty4 dubbo-remoting-netty4
dubbo-remoting-zookeeper-api
dubbo-remoting-zookeeper dubbo-remoting-zookeeper
dubbo-remoting-zookeeper-curator5 dubbo-remoting-zookeeper-curator5
dubbo-rpc dubbo-rpc
@ -102,16 +102,25 @@ dubbo-spring-boot-actuator-compatible
dubbo-spring-boot-autoconfigure dubbo-spring-boot-autoconfigure
dubbo-spring-boot-autoconfigure-compatible dubbo-spring-boot-autoconfigure-compatible
dubbo-spring-boot-compatible dubbo-spring-boot-compatible
dubbo-spring-boot-observability-starters dubbo-observability-spring-boot-starters
dubbo-spring-boot-observability-autoconfigure dubbo-observability-spring-boot-autoconfigure
dubbo-spring-boot-tracing-brave-zipkin-starter dubbo-tracing-brave-zipkin-spring-boot-starter
dubbo-spring-boot-tracing-otel-zipkin-starter dubbo-tracing-otel-zipkin-spring-boot-starter
dubbo-spring-boot-tracing-otel-otlp-starter dubbo-tracing-otel-otlp-spring-boot-starter
dubbo-spring-boot-observability-starter dubbo-observability-spring-boot-starter
dubbo-spring-boot-starter dubbo-spring-boot-starter
dubbo-spring-boot-starters dubbo-spring-boot-starters
dubbo-spring-boot-interceptor
dubbo-nacos-spring-boot-starter dubbo-nacos-spring-boot-starter
dubbo-zookeeper-spring-boot-starter dubbo-zookeeper-spring-boot-starter
dubbo-zookeeper-curator5-spring-boot-starter dubbo-zookeeper-curator5-spring-boot-starter
dubbo-sentinel-spring-boot-starter
dubbo-seata-spring-boot-starter
dubbo-spring-security dubbo-spring-security
dubbo-tracing
dubbo-xds dubbo-xds
dubbo-plugin-loom
dubbo-rest-jaxrs
dubbo-rest-servlet
dubbo-rest-spring

View File

@ -1,21 +1,8 @@
## What is the purpose of the change ## What is the purpose of the change?
## Brief changelog
## Verifying this change
<!-- Follow this checklist to help us incorporate your contribution quickly and easily: -->
## Checklist ## Checklist
- [x] Make sure there is a [GitHub_issue](https://github.com/apache/dubbo/issues) field for the change (usually before you start working on it). Trivial changes like typos do not require a GitHub issue. Your pull request should address just this issue, without pulling in other changes - one PR resolves one issue. - [x] Make sure there is a [GitHub_issue](https://github.com/apache/dubbo/issues) field for the change.
- [ ] Each commit in the pull request should have a meaningful subject line and body. - [x] Write a pull request description that is detailed enough to understand what the pull request does, how, and why.
- [ ] Write a pull request description that is detailed enough to understand what the pull request does, how, and why. - [x] Write necessary unit-test to verify your logic correction. If the new feature or significant change is committed, please remember to add sample in [dubbo samples](https://github.com/apache/dubbo-samples) project.
- [ ] Check if is necessary to patch to Dubbo 3 if you are work on Dubbo 2.7 - [x] Make sure gitHub actions can pass. [Why the workflow is failing and how to fix it?](./CONTRIBUTING.md)
- [ ] Write necessary unit-test to verify your logic correction, more mock a little better when cross module dependency exist. If the new feature or significant change is committed, please remember to add sample in [dubbo samples](https://github.com/apache/dubbo-samples) project.
- [ ] Add some description to [dubbo-website](https://github.com/apache/dubbo-website) project if you are requesting to add a feature.
- [ ] GitHub Actions works fine on your own branch.
- [ ] If this contribution is large, please follow the [Software Donation Guide](https://github.com/apache/dubbo/wiki/Software-donation-guide).

View File

@ -97,7 +97,7 @@ jobs:
- uses: actions/setup-java@v3 - uses: actions/setup-java@v3
with: with:
distribution: 'zulu' distribution: 'zulu'
java-version: 8 java-version: 17
- uses: actions/cache@v3 - uses: actions/cache@v3
name: "Cache local Maven repository" name: "Cache local Maven repository"
with: with:
@ -238,7 +238,7 @@ jobs:
openssl rsautl -decrypt -in ${{ github.workspace }}/.tmp/encrypted-sonarcloud-token -out ${{ github.workspace }}/.tmp/decrypted-sonarcloud-token -inkey ${{ github.workspace }}/.tmp/rsa/rsa_private.pem openssl rsautl -decrypt -in ${{ github.workspace }}/.tmp/encrypted-sonarcloud-token -out ${{ github.workspace }}/.tmp/decrypted-sonarcloud-token -inkey ${{ github.workspace }}/.tmp/rsa/rsa_private.pem
- name: "Test with Maven with SonarCloud Scan" - name: "Test with Maven with SonarCloud Scan"
if: ${{ github.repository == 'apache/dubbo' }} if: ${{ github.repository == 'apache/dubbo' }}
timeout-minutes: 70 timeout-minutes: 90
env: env:
# Needed to get some information about the pull request, if any # Needed to get some information about the pull request, if any
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
@ -247,7 +247,7 @@ jobs:
./mvnw --batch-mode --no-snapshot-updates -e --no-transfer-progress --fail-fast clean test verify org.sonarsource.scanner.maven:sonar-maven-plugin:sonar -Pjacoco,jdk15ge-simple,'!jdk15ge',jacoco089 -Dsonar.host.url=https://sonarcloud.io -Dsonar.organization=apache -Dsonar.projectKey=apache_dubbo -DtrimStackTrace=false -Dmaven.wagon.httpconnectionManager.ttlSeconds=120 -Dmaven.wagon.http.retryHandler.count=5 -DskipTests=false -DskipIntegrationTests=false -Dcheckstyle.skip=false -Dcheckstyle_unix.skip=false -Drat.skip=false -Dmaven.javadoc.skip=true -DembeddedZookeeperPath=${{ github.workspace }}/.tmp/zookeeper -Dsonar.coverage.jacoco.xmlReportPaths=dubbo-test/dubbo-dependencies-all/target/site/jacoco-aggregate/jacoco.xml -Dsonar.login=${SONAR_TOKEN} ./mvnw --batch-mode --no-snapshot-updates -e --no-transfer-progress --fail-fast clean test verify org.sonarsource.scanner.maven:sonar-maven-plugin:sonar -Pjacoco,jdk15ge-simple,'!jdk15ge',jacoco089 -Dsonar.host.url=https://sonarcloud.io -Dsonar.organization=apache -Dsonar.projectKey=apache_dubbo -DtrimStackTrace=false -Dmaven.wagon.httpconnectionManager.ttlSeconds=120 -Dmaven.wagon.http.retryHandler.count=5 -DskipTests=false -DskipIntegrationTests=false -Dcheckstyle.skip=false -Dcheckstyle_unix.skip=false -Drat.skip=false -Dmaven.javadoc.skip=true -DembeddedZookeeperPath=${{ github.workspace }}/.tmp/zookeeper -Dsonar.coverage.jacoco.xmlReportPaths=dubbo-test/dubbo-dependencies-all/target/site/jacoco-aggregate/jacoco.xml -Dsonar.login=${SONAR_TOKEN}
- name: "Test with Maven without SonarCloud Scan" - name: "Test with Maven without SonarCloud Scan"
if: ${{ github.repository != 'apache/dubbo' }} if: ${{ github.repository != 'apache/dubbo' }}
timeout-minutes: 70 timeout-minutes: 90
run: | run: |
./mvnw --batch-mode --no-snapshot-updates -e --no-transfer-progress --fail-fast clean test verify -Dmaven.wagon.httpconnectionManager.ttlSeconds=120 -Pjacoco,jdk15ge-simple,'!jdk15ge',jacoco089 -DtrimStackTrace=false -Dmaven.wagon.http.retryHandler.count=5 -DskipTests=false -DskipIntegrationTests=false -Dcheckstyle.skip=false -Dcheckstyle_unix.skip=false -Drat.skip=false -Dmaven.javadoc.skip=true -DembeddedZookeeperPath=${{ github.workspace }}/.tmp/zookeeper ./mvnw --batch-mode --no-snapshot-updates -e --no-transfer-progress --fail-fast clean test verify -Dmaven.wagon.httpconnectionManager.ttlSeconds=120 -Pjacoco,jdk15ge-simple,'!jdk15ge',jacoco089 -DtrimStackTrace=false -Dmaven.wagon.http.retryHandler.count=5 -DskipTests=false -DskipIntegrationTests=false -Dcheckstyle.skip=false -Dcheckstyle_unix.skip=false -Drat.skip=false -Dmaven.javadoc.skip=true -DembeddedZookeeperPath=${{ github.workspace }}/.tmp/zookeeper
- name: "Upload coverage result" - name: "Upload coverage result"

View File

@ -41,7 +41,7 @@ jobs:
- uses: actions/setup-java@v3 - uses: actions/setup-java@v3
with: with:
distribution: 'zulu' distribution: 'zulu'
java-version: 8 java-version: 17
- uses: actions/cache@v3 - uses: actions/cache@v3
name: "Cache local Maven repository" name: "Cache local Maven repository"
with: with:
@ -132,7 +132,7 @@ jobs:
fail-fast: false fail-fast: false
matrix: matrix:
os: [ ubuntu-latest, windows-latest ] os: [ ubuntu-latest, windows-latest ]
jdk: [ 8, 11, 17, 21 ] jdk: [ 17, 21 ]
env: env:
DISABLE_FILE_SYSTEM_TEST: true DISABLE_FILE_SYSTEM_TEST: true
steps: steps:
@ -175,7 +175,7 @@ jobs:
fail-fast: false fail-fast: false
matrix: matrix:
os: [ ubuntu-latest, windows-latest ] os: [ ubuntu-latest, windows-latest ]
jdk: [ 8, 11, 17, 21 ] jdk: [ 17, 21 ]
env: env:
DISABLE_FILE_SYSTEM_TEST: true DISABLE_FILE_SYSTEM_TEST: true
DUBBO_DEFAULT_SERIALIZATION: fastjson2 DUBBO_DEFAULT_SERIALIZATION: fastjson2

View File

@ -95,11 +95,15 @@ header:
- 'dubbo-maven-plugin/src/main/java/org/apache/dubbo/maven/plugin/aot/MatchingGroupIdFilter.java' - 'dubbo-maven-plugin/src/main/java/org/apache/dubbo/maven/plugin/aot/MatchingGroupIdFilter.java'
- 'dubbo-maven-plugin/src/main/java/org/apache/dubbo/maven/plugin/aot/RunArguments.java' - 'dubbo-maven-plugin/src/main/java/org/apache/dubbo/maven/plugin/aot/RunArguments.java'
- 'dubbo-maven-plugin/src/main/java/org/apache/dubbo/maven/plugin/aot/RunProcess.java' - 'dubbo-maven-plugin/src/main/java/org/apache/dubbo/maven/plugin/aot/RunProcess.java'
- 'dubbo-native/src/main/java/org/apache/dubbo/aot/generate/BasicJsonWriter.java' - 'dubbo-plugin/dubbo-native/src/main/java/org/apache/dubbo/aot/generate/BasicJsonWriter.java'
- 'dubbo-native/src/main/java/org/apache/dubbo/aot/generate/ExecutableMode.java' - 'dubbo-plugin/dubbo-native/src/main/java/org/apache/dubbo/aot/api/ExecutableMode.java'
- 'dubbo-native/src/main/java/org/apache/dubbo/aot/generate/MemberCategory.java' - 'dubbo-plugin/dubbo-native/src/main/java/org/apache/dubbo/aot/api/MemberCategory.java'
- 'dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/aggregate/DubboMergingDigest.java' - 'dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/aggregate/DubboMergingDigest.java'
- 'dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/aggregate/DubboAbstractTDigest.java' - 'dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/aggregate/DubboAbstractTDigest.java'
- 'dubbo-common/src/main/java/org/apache/dubbo/common/logger/helpers/FormattingTuple.java'
- 'dubbo-common/src/main/java/org/apache/dubbo/common/logger/helpers/MessageFormatter.java'
- 'dubbo-maven-plugin/src/main/java/org/apache/dubbo/maven/plugin/protoc/DubboProtocCompilerMojo.java'
- 'dubbo-plugin/dubbo-compiler/src/main/java/org/apache/dubbo/gen/utils/ProtoTypeMap.java'
comment: on-failure comment: on-failure
@ -198,10 +202,26 @@ dependency:
license: Apache-2.0 license: Apache-2.0
- name: org.sonatype.plexus:plexus-cipher - name: org.sonatype.plexus:plexus-cipher
license: Apache-2.0 license: Apache-2.0
- name: com.alibaba.csp:sentinel-apache-dubbo3-adapter
license: Apache-2.0
- name: com.alibaba.csp:sentinel-transport-simple-http
license: Apache-2.0
- name: com.alibaba.csp:sentinel-transport-common
license: Apache-2.0
- name: com.alibaba.csp:sentinel-datasource-extension
license: Apache-2.0
- name: com.alibaba.csp:sentinel-core
license: Apache-2.0
- name: com.google.protobuf:protobuf-java - name: com.google.protobuf:protobuf-java
license: BSD 3-clause license: BSD 3-clause
- name: com.google.protobuf:protobuf-java-util - name: com.google.protobuf:protobuf-java-util
license: BSD 3-clause license: BSD 3-clause
- name: org.antlr:antlr4
license: BSD 3-clause
- name: org.antlr:antlr-runtime
license: BSD 3-clause
- name: org.antlr:ST4
license: BSD 3-clause
# multi license # multi license
- name: org.javassist:javassist - name: org.javassist:javassist
license: Apache-2.0 license: Apache-2.0

20
NOTICE
View File

@ -16,3 +16,23 @@ Copyright 2014 The Netty Project
This product contains code form the t-digest Project: This product contains code form the t-digest Project:
The code for the t-digest was originally authored by Ted Dunning The code for the t-digest was originally authored by Ted Dunning
Adrien Grand contributed the heart of the AVLTreeDigest (https://github.com/jpountz) Adrien Grand contributed the heart of the AVLTreeDigest (https://github.com/jpountz)
This product contains the following code copied from Maven Protocol Buffers Plugin:
dubbo-maven-plugin/src/main/java/org/apache/dubbo/maven/plugin/protoc/DubboProtocCompilerMojo.java
Maven Protocol Buffers Plugin
=============================
Copyright (c) 2016 Maven Protocol Buffers Plugin Authors. All rights reserved.
This product contains the following code copied from grpc-java-contrib:
dubbo-plugin/dubbo-compiler/src/main/java/org/apache/dubbo/gen/utils/ProtoTypeMap.java
Some portions of this file Copyright (c) 2019, Salesforce.com, Inc. and licensed under the BSD 3-Clause License
grpc-java-contrib
====================
Copyright (c) 2019, Salesforce.com, Inc.
All rights reserved.

236
README.md
View File

@ -1,187 +1,68 @@
# Apache Dubbo Project # Apache Dubbo Project
[![Build and Test For PR](https://github.com/apache/dubbo/actions/workflows/build-and-test-pr.yml/badge.svg)](https://github.com/apache/dubbo/actions/workflows/build-and-test-pr.yml) [![Build and Test For PR](https://github.com/apache/dubbo/actions/workflows/build-and-test-pr.yml/badge.svg)](https://github.com/apache/dubbo/actions/workflows/build-and-test-pr.yml)
[![Codecov](https://codecov.io/gh/apache/dubbo/branch/3.2/graph/badge.svg)](https://codecov.io/gh/apache/dubbo) [![Codecov](https://codecov.io/gh/apache/dubbo/branch/3.3/graph/badge.svg)](https://codecov.io/gh/apache/dubbo)
![Maven](https://img.shields.io/maven-central/v/org.apache.dubbo/dubbo.svg) ![Maven](https://img.shields.io/maven-central/v/org.apache.dubbo/dubbo.svg)
![License](https://img.shields.io/github/license/alibaba/dubbo.svg) ![License](https://img.shields.io/github/license/alibaba/dubbo.svg)
[![Average time to resolve an issue](http://isitmaintained.com/badge/resolution/apache/dubbo.svg)](http://isitmaintained.com/project/apache/dubbo "Average time to resolve an issue") [![Average time to resolve an issue](http://isitmaintained.com/badge/resolution/apache/dubbo.svg)](http://isitmaintained.com/project/apache/dubbo "Average time to resolve an issue")
[![Percentage of issues still open](http://isitmaintained.com/badge/open/apache/dubbo.svg)](http://isitmaintained.com/project/apache/dubbo "Percentage of issues still open") [![Percentage of issues still open](http://isitmaintained.com/badge/open/apache/dubbo.svg)](http://isitmaintained.com/project/apache/dubbo "Percentage of issues still open")
Apache Dubbo is a high-performance, Java-based open-source RPC framework. Please visit the [official site](http://dubbo.apache.org) for the quick start guide and documentation, as well as the [wiki](https://github.com/apache/dubbo/wiki) for news, FAQ, and release notes. Apache Dubbo is an easy-to-use Web and RPC framework that provides multiple
language implementations(Java, [Go](https://github.com/apache/dubbo-go), [Rust](https://github.com/apache/dubbo-rust), [Node.js](https://github.com/apache/dubbo-js), [Web](https://github.com/apache/dubbo-js)) for communication, service discovery, traffic management,
observability, security, tools, and best practices for building enterprise-ready microservices.
We are now collecting Dubbo user info to help us to improve Dubbo further. Kindly support us by providing your usage information on [Wanted: who's using dubbo](https://github.com/apache/dubbo/discussions/13842), thanks :) We are now collecting Dubbo user info to help us to improve Dubbo further. Kindly support us by providing your usage information on [Wanted: who's using dubbo](https://github.com/apache/dubbo/discussions/13842), thanks :)
## Architecture ## Architecture
![Architecture](https://dubbo.apache.org/imgs/architecture.png) ![Architecture](https://dubbo.apache.org/imgs/architecture.png)
## Features * Consumer and provider communicate with each other using RPC protocol like triple, tcp, rest, etc.
* Consumers automatically trace provider instances registered in registries(Zookeeper, Nacos) and distribute traffic among them by following traffic strategies.
* Transparent interface based RPC * Rich features for monitoring and managing the cluster with dynamic configuration, metrics, tracing, security, and visualized console.
* Intelligent load balancing
* Automatic service registration and discovery
* High extensibility
* Runtime traffic routing
* Visualized service governance
## Getting started ## Getting started
Follow the instructions below to learn how to:
The following code snippet comes from [Dubbo Samples](https://github.com/apache/dubbo-samples.git). You may clone the sample project and step into the `dubbo-samples-api` subdirectory before proceeding. ### Programming with lightweight RPC API
[5 minutes step-by-step guide](https://dubbo.apache.org/zh-cn/overview/quickstart/rpc/java)
```bash Dubbo supports building RPC services with only a few lines of code while depending only on a lightweight SDK (<10MB). The protocol on the wire can be [Triple](https://dubbo.apache.org/zh-cn/overview/reference/protocols/triple/)(fully gRPC compatible and HTTP-friendly), Dubbo2(TCP), REST, or any protocol of your choice.
git clone https://github.com/apache/dubbo-samples.git
cd dubbo-samples/1-basic/dubbo-samples-api
```
There's a [README](https://github.com/apache/dubbo-samples/blob/389cd612f1ea57ee6e575005b32f195c442c35a2/1-basic/dubbo-samples-api/README.md) file under `dubbo-samples-api` directory. We recommend referencing the samples in that directory by following the below-mentioned instructions:
### Maven dependency
```xml
<properties>
<dubbo.version>3.2.11</dubbo.version>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>${dubbo.version}</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-dependencies-zookeeper</artifactId>
<version>${dubbo.version}</version>
<type>pom</type>
</dependency>
</dependencies>
```
### Define service interfaces
```java
package org.apache.dubbo.samples.api;
public interface GreetingsService {
String sayHi(String name);
}
```
*See [api/GreetingsService.java](https://github.com/apache/dubbo-samples/blob/389cd612f1ea57ee6e575005b32f195c442c35a2/1-basic/dubbo-samples-api/src/main/java/org/apache/dubbo/samples/api/GreetingsService.java) on GitHub.*
### Implement service interface for the provider
```java
package org.apache.dubbo.samples.provider;
import org.apache.dubbo.samples.api.GreetingsService;
public class GreetingsServiceImpl implements GreetingsService {
@Override
public String sayHi(String name) {
return "hi, " + name;
}
}
```
*See [provider/GreetingsServiceImpl.java](https://github.com/apache/dubbo-samples/blob/389cd612f1ea57ee6e575005b32f195c442c35a2/1-basic/dubbo-samples-api/src/main/java/org/apache/dubbo/samples/provider/GreetingsServiceImpl.java) on GitHub.*
### Start service provider
```java
package org.apache.dubbo.samples.provider;
import org.apache.dubbo.config.ApplicationConfig; ### Building a microservice application with Spring Boot
import org.apache.dubbo.config.RegistryConfig; [5 minutes step-by-step guide](https://dubbo.apache.org/zh-cn/overview/quickstart/microservice)
import org.apache.dubbo.config.ServiceConfig;
import org.apache.dubbo.samples.api.GreetingsService;
import java.util.concurrent.CountDownLatch; It's highly recommended to start your microservice application with the Spring Boot Starter `dubbo-spring-boot-starter` provided by Dubbo. With only a single dependency and yaml file, and optionally a bunch of other useful spring boot starters, you can enable all of the Dubo features like service discovery, observability, tracing, etc.
public class Application { Next, learn how to [deploy](https://dubbo.apache.org/zh-cn/overview/tasks/deploy/), [monitor](https://dubbo.apache.org/zh-cn/overview/tasks/observability/), and [manage the traffic](https://dubbo.apache.org/zh-cn/overview/tasks/traffic-management/) of your Dubbo application and cluster.
private static String zookeeperHost = System.getProperty("zookeeper.address", "127.0.0.1");
public static void main(String[] args) throws Exception { ## More Features
ServiceConfig<GreetingsService> service = new ServiceConfig<>(); Get more details by visiting the links below to get your hands dirty with some well-designed tasks on our website.
service.setApplication(new ApplicationConfig("first-dubbo-provider"));
service.setRegistry(new RegistryConfig("zookeeper://" + zookeeperHost + ":2181"));
service.setInterface(GreetingsService.class);
service.setRef(new GreetingsServiceImpl());
service.export();
System.out.println("dubbo service started"); * [Launch a Dubbo project](https://dubbo.apache.org/zh-cn/overview/tasks/develop/template/)
new CountDownLatch(1).await(); * [RPC protocols](https://dubbo.apache.org/zh-cn/overview/core-features/protocols/)
} * [Traffic management](https://dubbo.apache.org/zh-cn/overview/core-features/traffic/)
} * [Service discovery](https://dubbo.apache.org/zh-cn/overview/core-features/service-discovery/)
``` * [Observability](https://dubbo.apache.org/zh-cn/overview/core-features/observability/)
* [Extensibility](https://dubbo.apache.org/zh-cn/overview/core-features/extensibility/)
* [Security](https://dubbo.apache.org/zh-cn/overview/core-features/security/)
* [Visualized console and control plane](https://dubbo.apache.org/zh-cn/overview/reference/admin/)
* [Kubernetes and Service mesh](https://dubbo.apache.org/zh-cn/overview/core-features/service-mesh/)
*See [provider/Application.java](https://github.com/apache/dubbo-samples/blob/389cd612f1ea57ee6e575005b32f195c442c35a2/1-basic/dubbo-samples-spring-xml/src/main/java/org/apache/dubbo/samples/provider/Application.java) on GitHub.* ## Which Dubbo version should I use?
| **Dubbo3** | **JDK** | **Dependencies** | **Description** |
| --- | --- | --- | --- |
| 3.3.0-beta| 1.8 17 | [dependency list](https://github.com/apache/dubbo/blob/3.3/dubbo-dependencies-bom/pom.xml#L94) | **- Unstable version** <br/> **- Features** <br/> &nbsp;&nbsp; - Triple - gRPC and cURL compatible.<br/> &nbsp;&nbsp; - Rest-style programming support.<br/> &nbsp;&nbsp; - Spring Boot Starters. |
| 3.2.5 | 1.8 17 | [dependency list](https://github.com/apache/dubbo/blob/dubbo-3.2.5/dubbo-dependencies-bom/pom.xml#L94) | **- Stable version (active)** <br/> **- Features** <br/> &nbsp;&nbsp;- Out-of-box metrics and tracing support.<br/> &nbsp;&nbsp;- Threadpool Isolation<br/> &nbsp;&nbsp;- 30% performance<br/> &nbsp;&nbsp;- Native Image|
| 3.1.11 | 1.8 11 | [dependency list](https://github.com/apache/dubbo/blob/dubbo-3.2.11/dubbo-dependencies-bom/pom.xml#L94) | **Stable version (not active)** |
### Build and run the provider | **Dubbo2** | **JDK** | **Dependencies** | **Description** |
| --- | --- | --- | --- |
| 2.7.23 | 1.8 | [dependency list](https://github.com/apache/dubbo/blob/dubbo-2.7.23/dubbo-dependencies-bom/pom.xml#L92) | EOL |
| 2.6.x, 2.5.x | 1.6 1.7 | | EOL |
```bash ## Contributing
mvn clean package See [CONTRIBUTING](https://github.com/apache/dubbo/blob/master/CONTRIBUTING.md) for details on submitting patches and the contribution workflow.
mvn -Djava.net.preferIPv4Stack=true -Dexec.mainClass=org.apache.dubbo.samples.provider.Application exec:java
```
### Call remote service in the consumer
```java
package org.apache.dubbo.samples.client;
import org.apache.dubbo.config.ApplicationConfig;
import org.apache.dubbo.config.ReferenceConfig;
import org.apache.dubbo.config.RegistryConfig;
import org.apache.dubbo.samples.api.GreetingsService;
public class Application {
private static String zookeeperHost = System.getProperty("zookeeper.address", "127.0.0.1");
public static void main(String[] args) {
ReferenceConfig<GreetingsService> reference = new ReferenceConfig<>();
reference.setApplication(new ApplicationConfig("first-dubbo-consumer"));
reference.setRegistry(new RegistryConfig("zookeeper://" + zookeeperHost + ":2181"));
reference.setInterface(GreetingsService.class);
GreetingsService service = reference.get();
String message = service.sayHi("dubbo");
System.out.println(message);
}
}
```
*See [client/Application.java](https://github.com/apache/dubbo-samples/blob/389cd612f1ea57ee6e575005b32f195c442c35a2/1-basic/dubbo-samples-api/src/main/java/org/apache/dubbo/samples/client/Application.java) on GitHub.*
### Build and run the consumer
```bash
mvn clean package
mvn -Djava.net.preferIPv4Stack=true -Dexec.mainClass=org.apache.dubbo.samples.client.Application exec:java
```
The consumer will print out `hi, dubbo` on the screen.
### Next steps
* [Your first Dubbo application](https://dubbo.apache.org/en/blog/2018/08/07/dubbo-101/) - A 101 tutorial to reveal more details, with the same code above.
* [Dubbo user manual](https://dubbo.apache.org/en/overview/what/) - How to use Dubbo and all its features.
* [Dubbo developer guide](https://dubbo.apache.org/en/docs3-v2/java-sdk/) - How to involve in Dubbo development.
* [Dubbo admin manual](https://dubbo.apache.org/en/docs/v2.7/admin/ops/) - How to admin and manage Dubbo services.
## Building
If you want to try out the cutting-edge features, you can build with the following commands. (Java 1.8 is needed to build the master branch)
```
mvn clean install
```
## Recommended Test Environment
To avoid intermittent test failures (i.e., flaky tests), it is recommended to have a machine or virtual machine with the following specifications:
* Minimum of 2CPUs.
* Minimum of 2Gb of RAM.
### How does the Dubbo Community collaborate? ### How does the Dubbo Community collaborate?
@ -242,13 +123,39 @@ Please follow the [template](https://github.com/apache/dubbo/issues/new?template
Please report security vulnerabilities to [us](mailto:security@dubbo.apache.org) privately. Please report security vulnerabilities to [us](mailto:security@dubbo.apache.org) privately.
## Contact ## Contact
* WeChat: apachedubbo
* Mailing list: * DingTalk group: 37290003945
* dev list: for dev/user discussion. [subscribe](mailto:dev-subscribe@dubbo.apache.org), [unsubscribe](mailto:dev-unsubscribe@dubbo.apache.org), [archive](https://lists.apache.org/list.html?dev@dubbo.apache.org), [guide](https://github.com/apache/dubbo/wiki/Mailing-list-subscription-guide) * Mailing list: [guide](https://dubbo.apache.org/zh-cn/contact/)
* Bugs: [Issues](https://github.com/apache/dubbo/issues/new?template=dubbo-issue-report-template.md)
* Gitter: [Gitter channel](https://gitter.im/alibaba/dubbo)
* Twitter: [@ApacheDubbo](https://twitter.com/ApacheDubbo) * Twitter: [@ApacheDubbo](https://twitter.com/ApacheDubbo)
* Security issues: please mail to [us](mailto:security@dubbo.apache.org) privately.
## Contributing
See [CONTRIBUTING](https://github.com/apache/dubbo/blob/master/CONTRIBUTING.md) for details on submitting patches and the contribution workflow.
### How can I contribute?
* Take a look at issues with tags marked [`Good first issue`](https://github.com/apache/dubbo/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22) or [`Help wanted`](https://github.com/apache/dubbo/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22).
* Join the discussion on the mailing list, subscription [guide](https://github.com/apache/dubbo/wiki/Mailing-list-subscription-guide).
* Answer questions on [issues](https://github.com/apache/dubbo/issues).
* Fix bugs reported on [issues](https://github.com/apache/dubbo/issues), and send us a pull request.
* Review the existing [pull request](https://github.com/apache/dubbo/pulls).
* Improve the [website](https://github.com/apache/dubbo-website), typically we need
* blog post
* translation on documentation
* use cases around the integration of Dubbo in enterprise systems.
* Improve the [dubbo-admin/dubbo-monitor](https://github.com/apache/dubbo-admin).
* Contribute to the projects listed in [ecosystem](https://github.com/dubbo).
* Other forms of contribution not explicitly enumerated above.
* If you would like to contribute, please send an email to dev@dubbo.apache.org to let us know!
## Reporting bugs
Please follow the [template](https://github.com/apache/dubbo/issues/new?template=dubbo-issue-report-template.md) for reporting any issues.
## Reporting a security vulnerability
Please report security vulnerabilities to [us](mailto:security@dubbo.apache.org) privately.
## Dubbo ecosystem ## Dubbo ecosystem
@ -268,5 +175,4 @@ Please report security vulnerabilities to [us](mailto:security@dubbo.apache.org)
* [Erlang](https://github.com/apache/dubbo-erlang) * [Erlang](https://github.com/apache/dubbo-erlang)
## License ## License
Apache Dubbo is licensed under the Apache License Version 2.0. See the [LICENSE](https://github.com/apache/dubbo/blob/master/LICENSE) file for details.
Apache Dubbo software is licensed under the Apache License Version 2.0. See the [LICENSE](https://github.com/apache/dubbo/blob/master/LICENSE) file for details.

View File

@ -29,6 +29,5 @@ ignore:
- "**/dubbo-test/**" - "**/dubbo-test/**"
- "**/dubbo-compatible/**" - "**/dubbo-compatible/**"
- "**/dubbo-native/**" - "**/dubbo-native/**"
- "**/dubbo-native-plugin/**"
- "**/dubbo-common/src/main/java/org/apache/dubbo/common/json/*.java" # internal JSON impl is deprecate, ignore test coverage for them - "**/dubbo-common/src/main/java/org/apache/dubbo/common/json/*.java" # internal JSON impl is deprecate, ignore test coverage for them
- "**/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/AnnotationBean.java" # Deprecated - "**/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/AnnotationBean.java" # Deprecated

View File

@ -1,89 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-build-tools</artifactId>
<version>1.0.0</version>
<packaging>jar</packaging>
<properties>
<maven.deploy.skip>true</maven.deploy.skip>
<spotless-maven-plugin.version>2.43.0</spotless-maven-plugin.version>
<spotless.action>check</spotless.action>
<dubbo-shared-resources.version>1.0.0</dubbo-shared-resources.version>
<palantirJavaFormat.version>2.38.0</palantirJavaFormat.version>
</properties>
<profiles>
<profile>
<id>java11+</id>
<activation>
<jdk>[11,)</jdk>
</activation>
<build>
<!--- newer versions of plugins requires JDK 11 -->
<plugins>
<plugin>
<groupId>com.diffplug.spotless</groupId>
<artifactId>spotless-maven-plugin</artifactId>
<version>${spotless-maven-plugin.version}</version>
<configuration>
<java>
<palantirJavaFormat>
<version>${palantirJavaFormat.version}</version>
</palantirJavaFormat>
<removeUnusedImports />
<importOrder>
<file>dubbo-importorder.txt</file>
</importOrder>
<licenseHeader>
<file>checkstyle-header.txt</file>
</licenseHeader>
</java>
<pom>
<sortPom>
<expandEmptyElements>false</expandEmptyElements>
<spaceBeforeCloseEmptyElement>true</spaceBeforeCloseEmptyElement>
</sortPom>
</pom>
<upToDateChecking>
<enabled>true</enabled>
</upToDateChecking>
</configuration>
<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo-shared-resources</artifactId>
<version>${dubbo-shared-resources.version}</version>
</dependency>
</dependencies>
<executions>
<execution>
<goals>
<goal>${spotless.action}</goal>
</goals>
<phase>process-sources</phase>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
</project>

View File

@ -92,6 +92,11 @@
<artifactId>micrometer-tracing-integration-test</artifactId> <artifactId>micrometer-tracing-integration-test</artifactId>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<scope>test</scope>
</dependency>
</dependencies> </dependencies>
<profiles> <profiles>

View File

@ -17,10 +17,7 @@
package org.apache.dubbo.rpc.cluster; package org.apache.dubbo.rpc.cluster;
import org.apache.dubbo.common.beans.factory.ScopeBeanFactory; import org.apache.dubbo.common.beans.factory.ScopeBeanFactory;
import org.apache.dubbo.rpc.AdaptiveMetrics;
import org.apache.dubbo.rpc.cluster.merger.MergerFactory;
import org.apache.dubbo.rpc.cluster.router.RouterSnapshotSwitcher; import org.apache.dubbo.rpc.cluster.router.RouterSnapshotSwitcher;
import org.apache.dubbo.rpc.cluster.router.mesh.route.MeshRuleManager;
import org.apache.dubbo.rpc.cluster.support.ClusterUtils; import org.apache.dubbo.rpc.cluster.support.ClusterUtils;
import org.apache.dubbo.rpc.model.ApplicationModel; import org.apache.dubbo.rpc.model.ApplicationModel;
import org.apache.dubbo.rpc.model.FrameworkModel; import org.apache.dubbo.rpc.model.FrameworkModel;
@ -37,14 +34,9 @@ public class ClusterScopeModelInitializer implements ScopeModelInitializer {
@Override @Override
public void initializeApplicationModel(ApplicationModel applicationModel) { public void initializeApplicationModel(ApplicationModel applicationModel) {
ScopeBeanFactory beanFactory = applicationModel.getBeanFactory(); ScopeBeanFactory beanFactory = applicationModel.getBeanFactory();
beanFactory.registerBean(MergerFactory.class);
beanFactory.registerBean(ClusterUtils.class); beanFactory.registerBean(ClusterUtils.class);
beanFactory.registerBean(AdaptiveMetrics.class);
} }
@Override @Override
public void initializeModuleModel(ModuleModel moduleModel) { public void initializeModuleModel(ModuleModel moduleModel) {}
ScopeBeanFactory beanFactory = moduleModel.getBeanFactory();
beanFactory.registerBean(MeshRuleManager.class);
}
} }

View File

@ -21,6 +21,7 @@ import org.apache.dubbo.common.URL;
import org.apache.dubbo.common.utils.CollectionUtils; import org.apache.dubbo.common.utils.CollectionUtils;
import org.apache.dubbo.rpc.Invocation; import org.apache.dubbo.rpc.Invocation;
import org.apache.dubbo.rpc.Invoker; import org.apache.dubbo.rpc.Invoker;
import org.apache.dubbo.rpc.Protocol;
import org.apache.dubbo.rpc.RpcException; import org.apache.dubbo.rpc.RpcException;
import java.util.List; import java.util.List;
@ -98,4 +99,8 @@ public interface Directory<T> extends Node {
default boolean isNotificationReceived() { default boolean isNotificationReceived() {
return false; return false;
} }
default Protocol getProtocol() {
return null;
}
} }

View File

@ -0,0 +1,38 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.dubbo.rpc.cluster;
import org.apache.dubbo.common.beans.factory.ScopeBeanFactory;
import org.apache.dubbo.rpc.cluster.merger.MergerFactory;
import org.apache.dubbo.rpc.model.ApplicationModel;
import org.apache.dubbo.rpc.model.FrameworkModel;
import org.apache.dubbo.rpc.model.ModuleModel;
import org.apache.dubbo.rpc.model.ScopeModelInitializer;
public class MergeableClusterScopeModelInitializer implements ScopeModelInitializer {
@Override
public void initializeFrameworkModel(FrameworkModel frameworkModel) {}
@Override
public void initializeApplicationModel(ApplicationModel applicationModel) {
ScopeBeanFactory beanFactory = applicationModel.getBeanFactory();
beanFactory.registerBean(MergerFactory.class);
}
@Override
public void initializeModuleModel(ModuleModel moduleModel) {}
}

View File

@ -14,11 +14,10 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.apache.dubbo.monitor.support; package org.apache.dubbo.rpc.cluster.filter.support;
import org.apache.dubbo.common.extension.Activate; import org.apache.dubbo.common.extension.Activate;
import org.apache.dubbo.rpc.Filter; import org.apache.dubbo.rpc.Filter;
import org.apache.dubbo.rpc.cluster.filter.support.ConsumerContextFilter;
import org.apache.dubbo.rpc.model.ApplicationModel; import org.apache.dubbo.rpc.model.ApplicationModel;
import static org.apache.dubbo.common.constants.CommonConstants.CALLBACK; import static org.apache.dubbo.common.constants.CommonConstants.CALLBACK;

View File

@ -0,0 +1,37 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.dubbo.rpc.cluster.router.mesh;
import org.apache.dubbo.common.beans.factory.ScopeBeanFactory;
import org.apache.dubbo.rpc.cluster.router.mesh.route.MeshRuleManager;
import org.apache.dubbo.rpc.model.ApplicationModel;
import org.apache.dubbo.rpc.model.FrameworkModel;
import org.apache.dubbo.rpc.model.ModuleModel;
import org.apache.dubbo.rpc.model.ScopeModelInitializer;
public class MeshScopeModelInitializer implements ScopeModelInitializer {
@Override
public void initializeFrameworkModel(FrameworkModel frameworkModel) {}
@Override
public void initializeApplicationModel(ApplicationModel applicationModel) {}
public void initializeModuleModel(ModuleModel moduleModel) {
ScopeBeanFactory beanFactory = moduleModel.getBeanFactory();
beanFactory.registerBean(MeshRuleManager.class);
}
}

View File

@ -36,6 +36,7 @@ import org.apache.dubbo.rpc.cluster.router.state.BitList;
import org.apache.dubbo.rpc.cluster.router.tag.model.TagRouterRule; import org.apache.dubbo.rpc.cluster.router.tag.model.TagRouterRule;
import org.apache.dubbo.rpc.cluster.router.tag.model.TagRuleParser; import org.apache.dubbo.rpc.cluster.router.tag.model.TagRuleParser;
import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.function.Predicate; import java.util.function.Predicate;
@ -52,6 +53,7 @@ public class TagStateRouter<T> extends AbstractStateRouter<T> implements Configu
public static final String NAME = "TAG_ROUTER"; public static final String NAME = "TAG_ROUTER";
private static final ErrorTypeAwareLogger logger = LoggerFactory.getErrorTypeAwareLogger(TagStateRouter.class); private static final ErrorTypeAwareLogger logger = LoggerFactory.getErrorTypeAwareLogger(TagStateRouter.class);
private static final String RULE_SUFFIX = ".tag-router"; private static final String RULE_SUFFIX = ".tag-router";
public static final char TAG_SEPERATOR = '|';
private volatile TagRouterRule tagRouterRule; private volatile TagRouterRule tagRouterRule;
private String application; private String application;
@ -119,7 +121,8 @@ public class TagStateRouter<T> extends AbstractStateRouter<T> implements Configu
// if we are requesting for a Provider with a specific tag // if we are requesting for a Provider with a specific tag
if (StringUtils.isNotEmpty(tag)) { if (StringUtils.isNotEmpty(tag)) {
Set<String> addresses = tagRouterRuleCopy.getTagnameToAddresses().get(tag); Map<String, Set<String>> tagnameToAddresses = tagRouterRuleCopy.getTagnameToAddresses();
Set<String> addresses = selectAddressByTagLevel(tagnameToAddresses, tag, isForceUseTag(invocation));
// filter by dynamic tag group first // filter by dynamic tag group first
if (addresses != null) { // null means tag not set if (addresses != null) { // null means tag not set
result = filterInvoker(invokers, invoker -> addressMatches(invoker.getUrl(), addresses)); result = filterInvoker(invokers, invoker -> addressMatches(invoker.getUrl(), addresses));
@ -336,4 +339,34 @@ public class TagStateRouter<T> extends AbstractStateRouter<T> implements Configu
public void setTagRouterRule(TagRouterRule tagRouterRule) { public void setTagRouterRule(TagRouterRule tagRouterRule) {
this.tagRouterRule = tagRouterRule; this.tagRouterRule = tagRouterRule;
} }
/**
* select addresses by tag with level
* <p>
* example:
* selector=beta|team1|partner1
* step1.select tagAddresses with selector=beta|team1|partner1, if result is empty, then run step2
* step2.select tagAddresses with selector=beta|team1, if result is empty, then run step3
* step3.select tagAddresses with selector=beta, if result is empty, result is null
* </p>
*
* @param tagAddresses
* @param tagSelector eg: beta|team1|partner1
* @return
*/
public static Set<String> selectAddressByTagLevel(
Map<String, Set<String>> tagAddresses, String tagSelector, boolean isForce) {
if (isForce || StringUtils.isNotContains(tagSelector, TAG_SEPERATOR)) {
return tagAddresses.get(tagSelector);
}
String[] selectors = StringUtils.split(tagSelector, TAG_SEPERATOR);
for (int i = selectors.length; i > 0; i--) {
String selectorTmp = StringUtils.join(selectors, TAG_SEPERATOR, 0, i);
Set<String> addresses = tagAddresses.get(selectorTmp);
if (CollectionUtils.isNotEmpty(addresses)) {
return addresses;
}
}
return null;
}
} }

View File

@ -21,6 +21,7 @@ import org.apache.dubbo.common.logger.ErrorTypeAwareLogger;
import org.apache.dubbo.common.logger.LoggerFactory; import org.apache.dubbo.common.logger.LoggerFactory;
import org.apache.dubbo.common.utils.ConfigUtils; import org.apache.dubbo.common.utils.ConfigUtils;
import org.apache.dubbo.rpc.AsyncRpcResult; import org.apache.dubbo.rpc.AsyncRpcResult;
import org.apache.dubbo.rpc.Constants;
import org.apache.dubbo.rpc.Invocation; import org.apache.dubbo.rpc.Invocation;
import org.apache.dubbo.rpc.Invoker; import org.apache.dubbo.rpc.Invoker;
import org.apache.dubbo.rpc.Result; import org.apache.dubbo.rpc.Result;
@ -42,8 +43,6 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import static org.apache.dubbo.common.constants.LoggerCodeConstants.CLUSTER_FAILED_GROUP_MERGE;
import static org.apache.dubbo.rpc.Constants.ASYNC_KEY;
import static org.apache.dubbo.rpc.Constants.MERGER_KEY; import static org.apache.dubbo.rpc.Constants.MERGER_KEY;
/** /**
@ -95,7 +94,7 @@ public class MergeableClusterInvoker<T> extends AbstractClusterInvoker<T> {
Map<String, Result> results = new HashMap<>(); Map<String, Result> results = new HashMap<>();
for (final Invoker<T> invoker : invokers) { for (final Invoker<T> invoker : invokers) {
RpcInvocation subInvocation = new RpcInvocation(invocation, invoker); RpcInvocation subInvocation = new RpcInvocation(invocation, invoker);
subInvocation.setAttachment(ASYNC_KEY, "true"); subInvocation.setAttachment(Constants.ASYNC_KEY, "true");
try { try {
results.put(invoker.getUrl().getServiceKey(), invokeWithContext(invoker, subInvocation)); results.put(invoker.getUrl().getServiceKey(), invokeWithContext(invoker, subInvocation));
} catch (RpcException e) { } catch (RpcException e) {
@ -123,7 +122,7 @@ public class MergeableClusterInvoker<T> extends AbstractClusterInvoker<T> {
Result r = asyncResult.get(Integer.MAX_VALUE, TimeUnit.MILLISECONDS); Result r = asyncResult.get(Integer.MAX_VALUE, TimeUnit.MILLISECONDS);
if (r.hasException()) { if (r.hasException()) {
log.error( log.error(
CLUSTER_FAILED_GROUP_MERGE, LoggerCodeConstants.CLUSTER_FAILED_GROUP_MERGE,
"Invoke " + getGroupDescFromServiceKey(entry.getKey()) + " failed: " "Invoke " + getGroupDescFromServiceKey(entry.getKey()) + " failed: "
+ r.getException().getMessage(), + r.getException().getMessage(),
"", "",

View File

@ -23,6 +23,7 @@ import org.apache.dubbo.common.logger.LoggerFactory;
import org.apache.dubbo.common.utils.CollectionUtils; import org.apache.dubbo.common.utils.CollectionUtils;
import org.apache.dubbo.common.utils.ConfigUtils; import org.apache.dubbo.common.utils.ConfigUtils;
import org.apache.dubbo.common.utils.StringUtils; import org.apache.dubbo.common.utils.StringUtils;
import org.apache.dubbo.common.utils.SystemPropertyConfigUtils;
import org.apache.dubbo.rpc.AsyncRpcResult; import org.apache.dubbo.rpc.AsyncRpcResult;
import org.apache.dubbo.rpc.Invocation; import org.apache.dubbo.rpc.Invocation;
import org.apache.dubbo.rpc.InvokeMode; import org.apache.dubbo.rpc.InvokeMode;
@ -47,8 +48,8 @@ import static org.apache.dubbo.rpc.cluster.Constants.INVOCATION_NEED_MOCK;
public class MockClusterInvoker<T> implements ClusterInvoker<T> { public class MockClusterInvoker<T> implements ClusterInvoker<T> {
private static final ErrorTypeAwareLogger logger = LoggerFactory.getErrorTypeAwareLogger(MockClusterInvoker.class); private static final ErrorTypeAwareLogger logger = LoggerFactory.getErrorTypeAwareLogger(MockClusterInvoker.class);
private static final boolean setFutureWhenSync = private static final boolean setFutureWhenSync = Boolean.parseBoolean(SystemPropertyConfigUtils.getSystemProperty(
Boolean.parseBoolean(System.getProperty(CommonConstants.SET_FUTURE_IN_SYNC_MODE, "true")); CommonConstants.ThirdPartyProperty.SET_FUTURE_IN_SYNC_MODE, "true"));
private final Directory<T> directory; private final Directory<T> directory;

View File

@ -0,0 +1 @@
callback-consumer-context=org.apache.dubbo.rpc.cluster.filter.support.CallbackConsumerContextFilter

View File

@ -8,4 +8,4 @@ forking=org.apache.dubbo.rpc.cluster.support.ForkingCluster
available=org.apache.dubbo.rpc.cluster.support.AvailableCluster available=org.apache.dubbo.rpc.cluster.support.AvailableCluster
mergeable=org.apache.dubbo.rpc.cluster.support.MergeableCluster mergeable=org.apache.dubbo.rpc.cluster.support.MergeableCluster
broadcast=org.apache.dubbo.rpc.cluster.support.BroadcastCluster broadcast=org.apache.dubbo.rpc.cluster.support.BroadcastCluster
zone-aware=org.apache.dubbo.rpc.cluster.support.registry.ZoneAwareCluster zone-aware=org.apache.dubbo.rpc.cluster.support.registry.ZoneAwareCluster

View File

@ -1,6 +1,4 @@
consumercontext=org.apache.dubbo.rpc.cluster.filter.support.ConsumerContextFilter consumercontext=org.apache.dubbo.rpc.cluster.filter.support.ConsumerContextFilter
consumer-classloader=org.apache.dubbo.rpc.cluster.filter.support.ConsumerClassLoaderFilter consumer-classloader=org.apache.dubbo.rpc.cluster.filter.support.ConsumerClassLoaderFilter
router-snapshot=org.apache.dubbo.rpc.cluster.router.RouterSnapshotFilter router-snapshot=org.apache.dubbo.rpc.cluster.router.RouterSnapshotFilter
observationsender=org.apache.dubbo.rpc.cluster.filter.support.ObservationSenderFilter
metricsClusterFilter=org.apache.dubbo.rpc.cluster.filter.support.MetricsClusterFilter
metricsConsumerFilter=org.apache.dubbo.rpc.cluster.filter.support.MetricsConsumerFilter metricsConsumerFilter=org.apache.dubbo.rpc.cluster.filter.support.MetricsConsumerFilter

View File

@ -1,4 +1,3 @@
attachment=org.apache.dubbo.rpc.cluster.router.condition.matcher.attachment.AttachmentConditionMatcherFactory attachment=org.apache.dubbo.rpc.cluster.router.condition.matcher.attachment.AttachmentConditionMatcherFactory
argument=org.apache.dubbo.rpc.cluster.router.condition.matcher.argument.ArgumentConditionMatcherFactory argument=org.apache.dubbo.rpc.cluster.router.condition.matcher.argument.ArgumentConditionMatcherFactory
param=org.apache.dubbo.rpc.cluster.router.condition.matcher.param.UrlParamConditionMatcherFactory param=org.apache.dubbo.rpc.cluster.router.condition.matcher.param.UrlParamConditionMatcherFactory

View File

@ -1,8 +1,8 @@
tag=org.apache.dubbo.rpc.cluster.router.tag.TagStateRouterFactory mock=org.apache.dubbo.rpc.cluster.router.mock.MockStateRouterFactory
condition=org.apache.dubbo.rpc.cluster.router.condition.ConditionStateRouterFactory condition=org.apache.dubbo.rpc.cluster.router.condition.ConditionStateRouterFactory
service=org.apache.dubbo.rpc.cluster.router.condition.config.ServiceStateRouterFactory service=org.apache.dubbo.rpc.cluster.router.condition.config.ServiceStateRouterFactory
app=org.apache.dubbo.rpc.cluster.router.condition.config.AppStateRouterFactory app=org.apache.dubbo.rpc.cluster.router.condition.config.AppStateRouterFactory
provider-app=org.apache.dubbo.rpc.cluster.router.condition.config.ProviderAppStateRouterFactory provider-app=org.apache.dubbo.rpc.cluster.router.condition.config.ProviderAppStateRouterFactory
script-app=org.apache.dubbo.rpc.cluster.router.script.config.AppScriptRouterFactory
mock=org.apache.dubbo.rpc.cluster.router.mock.MockStateRouterFactory
standard-mesh-rule=org.apache.dubbo.rpc.cluster.router.mesh.route.StandardMeshRuleRouterFactory standard-mesh-rule=org.apache.dubbo.rpc.cluster.router.mesh.route.StandardMeshRuleRouterFactory
script-app=org.apache.dubbo.rpc.cluster.router.script.config.AppScriptRouterFactory
tag=org.apache.dubbo.rpc.cluster.router.tag.TagStateRouterFactory

View File

@ -1 +1,3 @@
dubbo-cluster=org.apache.dubbo.rpc.cluster.ClusterScopeModelInitializer dubbo-cluster=org.apache.dubbo.rpc.cluster.ClusterScopeModelInitializer
dubbo-cluster-mergeable=org.apache.dubbo.rpc.cluster.MergeableClusterScopeModelInitializer
mesh=org.apache.dubbo.rpc.cluster.router.mesh.MeshScopeModelInitializer

View File

@ -1,264 +0,0 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.dubbo.rpc.cluster;
import org.apache.dubbo.common.URL;
import org.apache.dubbo.common.config.configcenter.ConfigChangeType;
import org.apache.dubbo.common.config.configcenter.ConfigChangedEvent;
import org.apache.dubbo.common.config.configcenter.DynamicConfiguration;
import org.apache.dubbo.common.url.component.ServiceConfigURL;
import org.apache.dubbo.common.utils.CollectionUtils;
import org.apache.dubbo.rpc.Invoker;
import org.apache.dubbo.rpc.RpcContext;
import org.apache.dubbo.rpc.RpcInvocation;
import org.apache.dubbo.rpc.cluster.filter.DemoService;
import org.apache.dubbo.rpc.cluster.router.RouterSnapshotSwitcher;
import org.apache.dubbo.rpc.cluster.router.condition.config.AppStateRouter;
import org.apache.dubbo.rpc.cluster.router.condition.config.ListenableStateRouter;
import org.apache.dubbo.rpc.cluster.router.condition.config.ServiceStateRouter;
import org.apache.dubbo.rpc.cluster.router.mesh.route.MeshAppRuleListener;
import org.apache.dubbo.rpc.cluster.router.mesh.route.MeshRuleManager;
import org.apache.dubbo.rpc.cluster.router.state.BitList;
import org.apache.dubbo.rpc.model.FrameworkModel;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
import static org.apache.dubbo.common.constants.CommonConstants.INTERFACE_KEY;
import static org.apache.dubbo.common.constants.CommonConstants.TAG_KEY;
import static org.apache.dubbo.rpc.cluster.router.mesh.route.MeshRuleConstants.MESH_RULE_DATA_ID_SUFFIX;
import static org.mockito.Mockito.when;
class RouterChainTest {
/**
* verify the router and state router loaded by default
*/
@Test
void testBuildRouterChain() {
RouterChain<DemoService> routerChain = createRouterChanin();
Assertions.assertEquals(0, routerChain.getRouters().size());
Assertions.assertEquals(7, routerChain.getStateRouters().size());
}
private RouterChain<DemoService> createRouterChanin() {
Map<String, String> parameters = new HashMap<>();
parameters.put(INTERFACE_KEY, DemoService.class.getName());
parameters.put("registry", "zookeeper");
URL url = new ServiceConfigURL("dubbo", "127.0.0.1", 20881, DemoService.class.getName(), parameters);
RouterChain<DemoService> routerChain = RouterChain.buildChain(DemoService.class, url);
return routerChain;
}
@Test
void testRoute() {
RouterChain<DemoService> routerChain = createRouterChanin();
// mockInvoker will be filtered out by MockInvokersSelector
Invoker<DemoService> mockInvoker = createMockInvoker();
// invoker1 will be filtered out by MeshStateRouter
Map<String, String> map1 = new HashMap<>();
map1.put("env-sign", "yyyyyyy");
Invoker<DemoService> invoker1 = createNormalInvoker(map1);
// invoker2 will be filtered out by TagStateRouter
Map<String, String> map2 = new HashMap<>();
map2.put("env-sign", "xxx");
map2.put("tag1", "hello");
Invoker<DemoService> invoker2 = createNormalInvoker(map2);
// invoker3 will be filtered out by AppStateRouter
Map<String, String> map3 = new HashMap<>();
map3.put("env-sign", "xxx");
map3.put("tag1", "hello");
map3.put(TAG_KEY, "TAG_");
Invoker<DemoService> invoker3 = createNormalInvoker(map3);
// invoker4 will be filtered out by ServiceStateRouter
Map<String, String> map4 = new HashMap<>();
map4.put("env-sign", "xxx");
map4.put("tag1", "hello");
map4.put(TAG_KEY, "TAG_");
map4.put("timeout", "5000");
Invoker<DemoService> invoker4 = createNormalInvoker(map4);
// invoker5 is the only one returned at the end that is not filtered out
Map<String, String> map5 = new HashMap<>();
map5.put("env-sign", "xxx");
map5.put("tag1", "hello");
map5.put(TAG_KEY, "TAG_");
map5.put("timeout", "5000");
map5.put("serialization", "hessian2");
Invoker<DemoService> invoker5 = createNormalInvoker(map5);
BitList<Invoker<DemoService>> invokers =
new BitList<>(Arrays.asList(mockInvoker, invoker1, invoker2, invoker3, invoker4, invoker5));
routerChain.setInvokers(invokers, () -> {});
// mesh rule for MeshStateRouter
MeshRuleManager meshRuleManager =
mockInvoker.getUrl().getOrDefaultModuleModel().getBeanFactory().getBean(MeshRuleManager.class);
ConcurrentHashMap<String, MeshAppRuleListener> appRuleListeners = meshRuleManager.getAppRuleListeners();
MeshAppRuleListener meshAppRuleListener =
appRuleListeners.get(invoker1.getUrl().getRemoteApplication());
ConfigChangedEvent configChangedEvent = new ConfigChangedEvent(
"demo-route" + MESH_RULE_DATA_ID_SUFFIX,
DynamicConfiguration.DEFAULT_GROUP,
MESH_RULE1 + "---\n" + MESH_RULE2,
ConfigChangeType.ADDED);
meshAppRuleListener.process(configChangedEvent);
// condition rule for AppStateRouter&ServiceStateRouter
ListenableStateRouter serviceRouter = routerChain.getStateRouters().stream()
.filter(s -> s instanceof ServiceStateRouter)
.map(s -> (ListenableStateRouter) s)
.findAny()
.orElse(null);
ConfigChangedEvent serviceConditionEvent = new ConfigChangedEvent(
DynamicConfiguration.getRuleKey(mockInvoker.getUrl()) + ".condition-router",
DynamicConfiguration.DEFAULT_GROUP,
SERVICE_CONDITION_RULE,
ConfigChangeType.ADDED);
serviceRouter.process(serviceConditionEvent);
ListenableStateRouter appRouter = routerChain.getStateRouters().stream()
.filter(s -> s instanceof AppStateRouter)
.map(s -> (ListenableStateRouter) s)
.findAny()
.orElse(null);
ConfigChangedEvent appConditionEvent = new ConfigChangedEvent(
"app.condition-router", DynamicConfiguration.DEFAULT_GROUP, APP_CONDITION_RULE, ConfigChangeType.ADDED);
appRouter.process(appConditionEvent);
// prepare consumerUrl and RpcInvocation
URL consumerUrl = URL.valueOf("consumer://localhost/DemoInterface?remote.application=app1");
RpcInvocation rpcInvocation = new RpcInvocation();
rpcInvocation.setServiceName("DemoService");
rpcInvocation.setObjectAttachment("trafficLabel", "xxx");
rpcInvocation.setObjectAttachment(TAG_KEY, "TAG_");
RpcContext.getServiceContext().setNeedPrintRouterSnapshot(true);
RouterSnapshotSwitcher routerSnapshotSwitcher =
FrameworkModel.defaultModel().getBeanFactory().getBean(RouterSnapshotSwitcher.class);
routerSnapshotSwitcher.addEnabledService("org.apache.dubbo.demo.DemoService");
// route
List<Invoker<DemoService>> result = routerChain
.getSingleChain(consumerUrl, invokers, rpcInvocation)
.route(consumerUrl, invokers, rpcInvocation);
Assertions.assertEquals(result.size(), 1);
Assertions.assertTrue(result.contains(invoker5));
String snapshotLog =
"[ Parent (Input: 6) (Current Node Output: 6) (Chain Node Output: 1) ] Input: localhost:9103,localhost:9103,localhost:9103,localhost:9103,localhost:9103 -> Chain Node Output: localhost:9103...\n"
+ " [ MockInvokersSelector (Input: 6) (Current Node Output: 5) (Chain Node Output: 1) Router message: invocation.need.mock not set. Return normal Invokers. ] Current Node Output: localhost:9103,localhost:9103,localhost:9103,localhost:9103,localhost:9103\n"
+ " [ StandardMeshRuleRouter (Input: 5) (Current Node Output: 4) (Chain Node Output: 1) Router message: Match App: app Subset: isolation ] Current Node Output: localhost:9103,localhost:9103,localhost:9103,localhost:9103\n"
+ " [ TagStateRouter (Input: 4) (Current Node Output: 3) (Chain Node Output: 1) Router message: Disable Tag Router. Reason: tagRouterRule is invalid or disabled ] Current Node Output: localhost:9103,localhost:9103,localhost:9103\n"
+ " [ ServiceStateRouter (Input: 3) (Current Node Output: 3) (Chain Node Output: 1) Router message: null ] Current Node Output: localhost:9103,localhost:9103,localhost:9103\n"
+ " [ ConditionStateRouter (Input: 3) (Current Node Output: 2) (Chain Node Output: 2) Router message: Match return. ] Current Node Output: localhost:9103,localhost:9103\n"
+ " [ ProviderAppStateRouter (Input: 2) (Current Node Output: 2) (Chain Node Output: 1) Router message: Directly return. Reason: Invokers from previous router is empty or conditionRouters is empty. ] Current Node Output: localhost:9103,localhost:9103\n"
+ " [ AppStateRouter (Input: 2) (Current Node Output: 2) (Chain Node Output: 1) Router message: null ] Current Node Output: localhost:9103,localhost:9103\n"
+ " [ ConditionStateRouter (Input: 2) (Current Node Output: 1) (Chain Node Output: 1) Router message: Match return. ] Current Node Output: localhost:9103\n"
+ " [ AppScriptStateRouter (Input: 1) (Current Node Output: 1) (Chain Node Output: 1) Router message: Directly return from script router. Reason: Invokers from previous router is empty or script is not enabled. Script rule is: null ] Current Node Output: localhost:9103";
String[] snapshot = routerSnapshotSwitcher.cloneSnapshot();
Assertions.assertTrue(snapshot[0].contains(snapshotLog));
RpcContext.getServiceContext().setNeedPrintRouterSnapshot(false);
result = routerChain
.getSingleChain(consumerUrl, invokers, rpcInvocation)
.route(consumerUrl, invokers, rpcInvocation);
Assertions.assertEquals(result.size(), 1);
Assertions.assertTrue(result.contains(invoker5));
routerChain.destroy();
Assertions.assertEquals(routerChain.getRouters().size(), 0);
Assertions.assertEquals(routerChain.getStateRouters().size(), 0);
}
private Invoker<DemoService> createMockInvoker() {
URL url = URL.valueOf("mock://localhost:9103/DemoInterface?remote.application=app");
Invoker<DemoService> invoker = Mockito.mock(Invoker.class);
when(invoker.getUrl()).thenReturn(url);
return invoker;
}
private Invoker<DemoService> createNormalInvoker(Map<String, String> parameters) {
URL url = URL.valueOf("dubbo://localhost:9103/DemoInterface?remote.application=app");
if (CollectionUtils.isNotEmptyMap(parameters)) {
url = url.addParameters(parameters);
}
Invoker<DemoService> invoker = Mockito.mock(Invoker.class);
when(invoker.getUrl()).thenReturn(url);
return invoker;
}
private static final String MESH_RULE1 =
"apiVersion: service.dubbo.apache.org/v1alpha1\n" + "kind: DestinationRule\n"
+ "metadata: { name: demo-route }\n"
+ "spec:\n"
+ " host: demo\n"
+ " subsets:\n"
+ " - labels: { env-sign: xxx, tag1: hello }\n"
+ " name: isolation\n"
+ " - labels: { env-sign: yyy }\n"
+ " name: testing-trunk\n"
+ " - labels: { env-sign: zzz }\n"
+ " name: testing\n"
+ " trafficPolicy:\n"
+ " loadBalancer: { simple: ROUND_ROBIN }\n"
+ "\n";
private static final String MESH_RULE2 =
"apiVersion: service.dubbo.apache.org/v1alpha1\n" + "kind: VirtualService\n"
+ "metadata: { name: demo-route }\n"
+ "spec:\n"
+ " dubbo:\n"
+ " - routedetail:\n"
+ " - match:\n"
+ " - attachments: \n"
+ " dubboContext: {trafficLabel: {regex: xxx}}\n"
+ " name: xxx-project\n"
+ " route:\n"
+ " - destination: {host: demo, subset: isolation}\n"
+ " services:\n"
+ " - {regex: DemoService}\n"
+ " hosts: [demo]\n";
private static final String APP_CONDITION_RULE = "scope: application\n" + "force: true\n"
+ "runtime: false\n"
+ "enabled: true\n"
+ "priority: 1\n"
+ "key: demo-consumer\n"
+ "conditions:\n"
+ "- => serialization=hessian2";
private static final String SERVICE_CONDITION_RULE = "scope: service\n" + "force: true\n"
+ "runtime: false\n"
+ "enabled: true\n"
+ "priority: 1\n"
+ "key: org.apache.dubbo.demo.DemoService\n"
+ "conditions:\n"
+ "- => timeout=5000";
}

View File

@ -1,83 +0,0 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.dubbo.rpc.cluster.filter;
import org.apache.dubbo.config.ApplicationConfig;
import org.apache.dubbo.config.TracingConfig;
import org.apache.dubbo.rpc.AppResponse;
import org.apache.dubbo.rpc.BaseFilter;
import org.apache.dubbo.rpc.Invoker;
import org.apache.dubbo.rpc.RpcInvocation;
import org.apache.dubbo.rpc.model.ApplicationModel;
import io.micrometer.tracing.test.SampleTestRunner;
import org.junit.jupiter.api.AfterEach;
import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.mock;
abstract class AbstractObservationFilterTest extends SampleTestRunner {
ApplicationModel applicationModel;
RpcInvocation invocation;
BaseFilter filter;
Invoker<?> invoker = mock(Invoker.class);
static final String INTERFACE_NAME = "org.apache.dubbo.MockInterface";
static final String METHOD_NAME = "mockMethod";
static final String GROUP = "mockGroup";
static final String VERSION = "1.0.0";
@AfterEach
public void teardown() {
if (applicationModel != null) {
applicationModel.destroy();
}
}
abstract BaseFilter createFilter(ApplicationModel applicationModel);
void setupConfig() {
ApplicationConfig config = new ApplicationConfig();
config.setName("MockObservations");
applicationModel = ApplicationModel.defaultModel();
applicationModel.getApplicationConfigManager().setApplication(config);
invocation = new RpcInvocation(new MockInvocation());
invocation.addInvokedInvoker(invoker);
applicationModel.getBeanFactory().registerBean(getObservationRegistry());
TracingConfig tracingConfig = new TracingConfig();
tracingConfig.setEnabled(true);
applicationModel.getApplicationConfigManager().setTracing(tracingConfig);
filter = createFilter(applicationModel);
given(invoker.invoke(invocation)).willReturn(new AppResponse("success"));
initParam();
}
private void initParam() {
invocation.setTargetServiceUniqueName(GROUP + "/" + INTERFACE_NAME + ":" + VERSION);
invocation.setMethodName(METHOD_NAME);
invocation.setParameterTypes(new Class[] {String.class});
}
}

View File

@ -18,12 +18,10 @@ package org.apache.dubbo.rpc.cluster.router.tag;
import org.apache.dubbo.common.URL; import org.apache.dubbo.common.URL;
import org.apache.dubbo.common.beans.factory.ScopeBeanFactory; import org.apache.dubbo.common.beans.factory.ScopeBeanFactory;
import org.apache.dubbo.common.extension.ExtensionLoader;
import org.apache.dubbo.common.utils.Holder; import org.apache.dubbo.common.utils.Holder;
import org.apache.dubbo.rpc.Invoker; import org.apache.dubbo.rpc.Invoker;
import org.apache.dubbo.rpc.RpcInvocation; import org.apache.dubbo.rpc.RpcInvocation;
import org.apache.dubbo.rpc.cluster.router.MockInvoker; import org.apache.dubbo.rpc.cluster.router.MockInvoker;
import org.apache.dubbo.rpc.cluster.router.mesh.util.TracingContextProvider;
import org.apache.dubbo.rpc.cluster.router.state.BitList; import org.apache.dubbo.rpc.cluster.router.state.BitList;
import org.apache.dubbo.rpc.cluster.router.state.StateRouter; import org.apache.dubbo.rpc.cluster.router.state.StateRouter;
import org.apache.dubbo.rpc.cluster.router.tag.model.TagRouterRule; import org.apache.dubbo.rpc.cluster.router.tag.model.TagRouterRule;
@ -32,10 +30,12 @@ import org.apache.dubbo.rpc.model.ApplicationModel;
import org.apache.dubbo.rpc.model.ModuleModel; import org.apache.dubbo.rpc.model.ModuleModel;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashSet; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Set; import java.util.Set;
import com.google.common.collect.Sets;
import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
@ -48,7 +48,6 @@ class TagStateRouterTest {
private URL url; private URL url;
private ModuleModel originModel; private ModuleModel originModel;
private ModuleModel moduleModel; private ModuleModel moduleModel;
private Set<TracingContextProvider> tracingContextProviders;
@BeforeEach @BeforeEach
public void setup() { public void setup() {
@ -59,11 +58,6 @@ class TagStateRouterTest {
ScopeBeanFactory beanFactory = Mockito.spy(originBeanFactory); ScopeBeanFactory beanFactory = Mockito.spy(originBeanFactory);
when(moduleModel.getBeanFactory()).thenReturn(beanFactory); when(moduleModel.getBeanFactory()).thenReturn(beanFactory);
ExtensionLoader<TracingContextProvider> extensionLoader = Mockito.mock(ExtensionLoader.class);
tracingContextProviders = new HashSet<>();
when(extensionLoader.getSupportedExtensionInstances()).thenReturn(tracingContextProviders);
when(moduleModel.getExtensionLoader(TracingContextProvider.class)).thenReturn(extensionLoader);
url = URL.valueOf("test://localhost/DemoInterface").setScopeModel(moduleModel); url = URL.valueOf("test://localhost/DemoInterface").setScopeModel(moduleModel);
} }
@ -264,4 +258,44 @@ class TagStateRouterTest {
TagRouterRule tagRouterRule = TagRuleParser.parse(tagRouterRuleConfig); TagRouterRule tagRouterRule = TagRuleParser.parse(tagRouterRuleConfig);
return tagRouterRule; return tagRouterRule;
} }
@Test
public void tagMultiLevelTest() {
String tagSelector = "beta|team1|partner1";
Set<String> address1 = Sets.newHashSet("192.168.5.1:20880");
Map<String, Set<String>> tagAddresses = new HashMap<>();
tagAddresses.put("beta", address1);
Assertions.assertEquals(address1, TagStateRouter.selectAddressByTagLevel(tagAddresses, tagSelector, false));
Set<String> address2 = Sets.newHashSet("192.168.5.2:20880");
tagAddresses.put("beta|team1", address2);
Assertions.assertEquals(address2, TagStateRouter.selectAddressByTagLevel(tagAddresses, tagSelector, false));
Set<String> address3 = Sets.newHashSet("192.168.5.3:20880");
tagAddresses.put("beta|team1|partner1", address3);
Assertions.assertEquals(address3, TagStateRouter.selectAddressByTagLevel(tagAddresses, tagSelector, false));
tagSelector = "beta";
Assertions.assertEquals(address1, TagStateRouter.selectAddressByTagLevel(tagAddresses, tagSelector, false));
tagSelector = "beta|team1";
Assertions.assertEquals(address2, TagStateRouter.selectAddressByTagLevel(tagAddresses, tagSelector, false));
tagSelector = "beta|team1|partner1";
Assertions.assertEquals(address3, TagStateRouter.selectAddressByTagLevel(tagAddresses, tagSelector, false));
tagSelector = "beta2";
Assertions.assertNull(TagStateRouter.selectAddressByTagLevel(tagAddresses, tagSelector, false));
tagSelector = "beta|team2";
Assertions.assertEquals(address1, TagStateRouter.selectAddressByTagLevel(tagAddresses, tagSelector, false));
tagSelector = "beta|team1|partner2";
Assertions.assertEquals(address2, TagStateRouter.selectAddressByTagLevel(tagAddresses, tagSelector, false));
}
@Test
public void tagLevelForceTest() {
Set<String> addresses = Sets.newHashSet("192.168.1.223:20880");
Map<String, Set<String>> tagAddresses = new HashMap<>();
tagAddresses.put("beta", addresses);
Set<String> selectedAddresses = TagStateRouter.selectAddressByTagLevel(tagAddresses, "beta", true);
Assertions.assertEquals(addresses, selectedAddresses);
}
} }

View File

@ -60,7 +60,6 @@ import static org.apache.dubbo.common.constants.CommonConstants.MONITOR_KEY;
import static org.apache.dubbo.common.constants.CommonConstants.PATH_KEY; import static org.apache.dubbo.common.constants.CommonConstants.PATH_KEY;
import static org.apache.dubbo.common.constants.CommonConstants.PROTOCOL_KEY; import static org.apache.dubbo.common.constants.CommonConstants.PROTOCOL_KEY;
import static org.apache.dubbo.rpc.cluster.Constants.CLUSTER_AVAILABLE_CHECK_KEY; import static org.apache.dubbo.rpc.cluster.Constants.CLUSTER_AVAILABLE_CHECK_KEY;
import static org.apache.dubbo.rpc.cluster.Constants.INVOCATION_NEED_MOCK;
import static org.apache.dubbo.rpc.cluster.Constants.REFER_KEY; import static org.apache.dubbo.rpc.cluster.Constants.REFER_KEY;
import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.ArgumentMatchers.same; import static org.mockito.ArgumentMatchers.same;
@ -580,25 +579,5 @@ class AbstractClusterInvokerTest {
} }
} }
/**
* Test mock invoker selector works as expected
*/
@Test
void testMockedInvokerSelect() {
initlistsize5();
invokers.add(mockedInvoker1);
initDic();
RpcInvocation mockedInvocation = new RpcInvocation();
mockedInvocation.setMethodName("sayHello");
mockedInvocation.setAttachment(INVOCATION_NEED_MOCK, "true");
List<Invoker<IHelloService>> mockedInvokers = dic.list(mockedInvocation);
Assertions.assertEquals(1, mockedInvokers.size());
List<Invoker<IHelloService>> invokers = dic.list(invocation);
Assertions.assertEquals(5, invokers.size());
}
public static interface IHelloService {} public static interface IHelloService {}
} }

View File

@ -14,7 +14,7 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.apache.dubbo.rpc.support; package org.apache.dubbo.rpc.cluster.support;
public interface DemoServiceA { public interface DemoServiceA {
String methodA(); String methodA();

View File

@ -14,7 +14,7 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.apache.dubbo.rpc.support; package org.apache.dubbo.rpc.cluster.support;
/** /**
* default mock service for DemoServiceA * default mock service for DemoServiceA

View File

@ -14,7 +14,7 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.apache.dubbo.rpc.support; package org.apache.dubbo.rpc.cluster.support;
public interface DemoServiceB { public interface DemoServiceB {
String methodB(); String methodB();

View File

@ -14,7 +14,7 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.apache.dubbo.rpc.support; package org.apache.dubbo.rpc.cluster.support;
/** /**
* default mock service for DemoServiceA * default mock service for DemoServiceA

View File

@ -18,6 +18,7 @@ package org.apache.dubbo.rpc.cluster.support;
import org.apache.dubbo.common.URL; import org.apache.dubbo.common.URL;
import org.apache.dubbo.common.constants.CommonConstants; import org.apache.dubbo.common.constants.CommonConstants;
import org.apache.dubbo.common.logger.Level;
import org.apache.dubbo.common.utils.DubboAppender; import org.apache.dubbo.common.utils.DubboAppender;
import org.apache.dubbo.common.utils.LogUtil; import org.apache.dubbo.common.utils.LogUtil;
import org.apache.dubbo.rpc.AppResponse; import org.apache.dubbo.rpc.AppResponse;
@ -34,7 +35,6 @@ import java.util.List;
import java.util.concurrent.CountDownLatch; import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import org.apache.log4j.Level;
import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;

View File

@ -0,0 +1,24 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.dubbo.rpc.cluster.support;
import org.apache.dubbo.common.extension.SPI;
@SPI
public interface Greeting {
String hello();
}

View File

@ -14,6 +14,6 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.apache.dubbo.config.mock; package org.apache.dubbo.rpc.cluster.support;
public class GreetingMock1 {} public class GreetingMock1 {}

View File

@ -14,9 +14,7 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.apache.dubbo.config.mock; package org.apache.dubbo.rpc.cluster.support;
import org.apache.dubbo.config.api.Greeting;
public class GreetingMock2 implements Greeting { public class GreetingMock2 implements Greeting {
private GreetingMock2() {} private GreetingMock2() {}

View File

@ -0,0 +1,190 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.dubbo.rpc.cluster.support;
import org.apache.dubbo.common.URL;
import org.apache.dubbo.metrics.event.MetricsDispatcher;
import org.apache.dubbo.rpc.Invocation;
import org.apache.dubbo.rpc.Invoker;
import org.apache.dubbo.rpc.Result;
import org.apache.dubbo.rpc.RpcContext;
import org.apache.dubbo.rpc.RpcException;
import org.apache.dubbo.rpc.RpcInvocation;
import org.apache.dubbo.rpc.cluster.LoadBalance;
import org.apache.dubbo.rpc.cluster.directory.StaticDirectory;
import org.apache.dubbo.rpc.model.ApplicationModel;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import static org.apache.dubbo.common.constants.CommonConstants.ENABLE_CONNECTIVITY_VALIDATION;
import static org.apache.dubbo.rpc.cluster.Constants.CLUSTER_AVAILABLE_CHECK_KEY;
import static org.apache.dubbo.rpc.cluster.Constants.INVOCATION_NEED_MOCK;
import static org.apache.dubbo.rpc.cluster.Constants.REFER_KEY;
import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.mock;
/**
* AbstractClusterInvokerTest
*/
@SuppressWarnings("rawtypes")
class MockAbstractClusterInvokerTest {
List<Invoker<IHelloService>> invokers = new ArrayList<Invoker<IHelloService>>();
List<Invoker<IHelloService>> selectedInvokers = new ArrayList<Invoker<IHelloService>>();
AbstractClusterInvoker<IHelloService> cluster;
AbstractClusterInvoker<IHelloService> cluster_nocheck;
StaticDirectory<IHelloService> dic;
RpcInvocation invocation = new RpcInvocation();
URL url = URL.valueOf(
"registry://localhost:9090/org.apache.dubbo.rpc.cluster.support.AbstractClusterInvokerTest.IHelloService?refer="
+ URL.encode("application=abstractClusterInvokerTest"));
URL consumerUrl = URL.valueOf(
"dubbo://localhost?application=abstractClusterInvokerTest&refer=application%3DabstractClusterInvokerTest");
Invoker<IHelloService> invoker1;
Invoker<IHelloService> invoker2;
Invoker<IHelloService> invoker3;
Invoker<IHelloService> invoker4;
Invoker<IHelloService> invoker5;
Invoker<IHelloService> mockedInvoker1;
@BeforeAll
public static void setUpBeforeClass() throws Exception {
System.setProperty(ENABLE_CONNECTIVITY_VALIDATION, "false");
}
@AfterEach
public void teardown() throws Exception {
RpcContext.removeContext();
}
@AfterAll
public static void afterClass() {
System.clearProperty(ENABLE_CONNECTIVITY_VALIDATION);
}
@SuppressWarnings({"unchecked"})
@BeforeEach
public void setUp() throws Exception {
ApplicationModel.defaultModel().getBeanFactory().registerBean(MetricsDispatcher.class);
Map<String, Object> attributes = new HashMap<>();
attributes.put("application", "abstractClusterInvokerTest");
url = url.putAttribute(REFER_KEY, attributes);
invocation.setMethodName("sayHello");
invoker1 = mock(Invoker.class);
invoker2 = mock(Invoker.class);
invoker3 = mock(Invoker.class);
invoker4 = mock(Invoker.class);
invoker5 = mock(Invoker.class);
mockedInvoker1 = mock(Invoker.class);
URL turl = URL.valueOf("test://test:11/test");
given(invoker1.isAvailable()).willReturn(false);
given(invoker1.getInterface()).willReturn(IHelloService.class);
given(invoker1.getUrl()).willReturn(turl.setPort(1).addParameter("name", "invoker1"));
given(invoker2.isAvailable()).willReturn(true);
given(invoker2.getInterface()).willReturn(IHelloService.class);
given(invoker2.getUrl()).willReturn(turl.setPort(2).addParameter("name", "invoker2"));
given(invoker3.isAvailable()).willReturn(false);
given(invoker3.getInterface()).willReturn(IHelloService.class);
given(invoker3.getUrl()).willReturn(turl.setPort(3).addParameter("name", "invoker3"));
given(invoker4.isAvailable()).willReturn(true);
given(invoker4.getInterface()).willReturn(IHelloService.class);
given(invoker4.getUrl()).willReturn(turl.setPort(4).addParameter("name", "invoker4"));
given(invoker5.isAvailable()).willReturn(false);
given(invoker5.getInterface()).willReturn(IHelloService.class);
given(invoker5.getUrl()).willReturn(turl.setPort(5).addParameter("name", "invoker5"));
given(mockedInvoker1.isAvailable()).willReturn(false);
given(mockedInvoker1.getInterface()).willReturn(IHelloService.class);
given(mockedInvoker1.getUrl()).willReturn(turl.setPort(999).setProtocol("mock"));
invokers.add(invoker1);
dic = new StaticDirectory<IHelloService>(url, invokers, null);
cluster = new AbstractClusterInvoker(dic) {
@Override
protected Result doInvoke(Invocation invocation, List invokers, LoadBalance loadbalance)
throws RpcException {
return null;
}
};
cluster_nocheck =
new AbstractClusterInvoker(
dic, url.addParameterIfAbsent(CLUSTER_AVAILABLE_CHECK_KEY, Boolean.FALSE.toString())) {
@Override
protected Result doInvoke(Invocation invocation, List invokers, LoadBalance loadbalance)
throws RpcException {
return null;
}
};
}
private void initlistsize5() {
invokers.clear();
selectedInvokers
.clear(); // Clear first, previous test case will make sure that the right invoker2 will be used.
invokers.add(invoker1);
invokers.add(invoker2);
invokers.add(invoker3);
invokers.add(invoker4);
invokers.add(invoker5);
}
private void initDic() {
dic.notify(invokers);
dic.buildRouterChain();
}
/**
* Test mock invoker selector works as expected
*/
@Test
void testMockedInvokerSelect() {
initlistsize5();
invokers.add(mockedInvoker1);
initDic();
RpcInvocation mockedInvocation = new RpcInvocation();
mockedInvocation.setMethodName("sayHello");
mockedInvocation.setAttachment(INVOCATION_NEED_MOCK, "true");
List<Invoker<IHelloService>> mockedInvokers = dic.list(mockedInvocation);
Assertions.assertEquals(1, mockedInvokers.size());
List<Invoker<IHelloService>> invokers = dic.list(invocation);
Assertions.assertEquals(5, invokers.size());
}
public static interface IHelloService {}
}

View File

@ -14,12 +14,13 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.apache.dubbo.rpc.support; package org.apache.dubbo.rpc.cluster.support;
import org.apache.dubbo.common.URL; import org.apache.dubbo.common.URL;
import org.apache.dubbo.rpc.RpcException; import org.apache.dubbo.rpc.RpcException;
import org.apache.dubbo.rpc.RpcInvocation; import org.apache.dubbo.rpc.RpcInvocation;
import org.apache.dubbo.rpc.model.ApplicationModel; import org.apache.dubbo.rpc.model.ApplicationModel;
import org.apache.dubbo.rpc.support.MockInvoker;
import java.io.Serializable; import java.io.Serializable;
import java.lang.reflect.Type; import java.lang.reflect.Type;
@ -116,7 +117,8 @@ class MockInvokerTest {
@Test @Test
void testGetThrowable() { void testGetThrowable() {
Assertions.assertThrows(RpcException.class, () -> MockInvoker.getThrowable("Exception.class")); Assertions.assertThrows(
RpcException.class, () -> org.apache.dubbo.rpc.support.MockInvoker.getThrowable("Exception.class"));
} }
@Test @Test

View File

@ -62,7 +62,7 @@ class MockProviderRpcExceptionTest {
.addParameter("invoke_return_error", "true") .addParameter("invoke_return_error", "true")
.addParameter( .addParameter(
REFER_KEY, REFER_KEY,
URL.encode(PATH_KEY + "=" + MockProviderRpcExceptionTest.IHelloRpcService.class.getName() URL.encode(PATH_KEY + "=" + IHelloRpcService.class.getName()
+ "&" + "mock=true" + "&" + "mock=true"
+ "&" + "proxy=jdk")); + "&" + "proxy=jdk"));
Invoker<IHelloRpcService> cluster = getClusterInvoker(url); Invoker<IHelloRpcService> cluster = getClusterInvoker(url);

View File

@ -1,38 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="false">
<appender name="DUBBO" class="org.apache.dubbo.common.utils.DubboAppender">
<param name="File" value="../dubbo.log"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%d{dd/MM/yy HH:mm:ss:SSS z}] %t %5p %c{2}: %m%n"/>
</layout>
</appender>
<appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%d{dd/MM/yy HH:mm:ss:SSS z}] %t %5p %c{2}: %m%n"/>
</layout>
</appender>
<root>
<level value="INFO"/>
<appender-ref ref="DUBBO"/>
<appender-ref ref="CONSOLE"/>
</root>
</log4j:configuration>

View File

@ -0,0 +1,33 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
~ Licensed to the Apache Software Foundation (ASF) under one or more
~ contributor license agreements. See the NOTICE file distributed with
~ this work for additional information regarding copyright ownership.
~ The ASF licenses this file to You under the Apache License, Version 2.0
~ (the "License"); you may not use this file except in compliance with
~ the License. You may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
-->
<Configuration status="WARN">
<Appenders>
<Dubbo name="Dubbo" fileName="../dubbo.log">
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] %5p %t %c{2}: %m%n%ex" charset="UTF-8"/>
</Dubbo>
<Console name="Console" target="SYSTEM_OUT" follow="true">
<PatternLayout pattern="%d{HH:mm:ss.SSS} |-%highlight{%-5p} [%t] %40.40c:%-3L -| %m%n%rEx{filters(jdk.internal.reflect,java.lang.reflect,sun.reflect,org.junit,org.mockito)}" charset="UTF-8"/>
</Console>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="Dubbo"/>
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>

View File

@ -99,6 +99,17 @@
<groupId>javax.annotation</groupId> <groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId> <artifactId>javax.annotation-api</artifactId>
</dependency> </dependency>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib-nodep</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<scope>test</scope>
</dependency>
<dependency> <dependency>
<groupId>com.google.protobuf</groupId> <groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId> <artifactId>protobuf-java</artifactId>

View File

@ -0,0 +1,37 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.dubbo.common.aot;
import org.apache.dubbo.common.utils.SystemPropertyConfigUtils;
import static org.apache.dubbo.common.constants.CommonConstants.ThirdPartyProperty.GRAALVM_NATIVEIMAGE_IMAGECODE;
public abstract class NativeDetector {
/**
* See https://github.com/oracle/graal/blob/master/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/ImageInfo.java
*/
private static final boolean IMAGE_CODE =
(SystemPropertyConfigUtils.getSystemProperty(GRAALVM_NATIVEIMAGE_IMAGECODE) != null);
/**
* Returns {@code true} if invoked in the context of image building or during image runtime, else {@code false}.
*/
public static boolean inNativeImage() {
return IMAGE_CODE;
}
}

View File

@ -162,14 +162,6 @@ public class FileCacheStore {
FileCacheStoreFactory.removeCache(cacheFilePath); FileCacheStoreFactory.removeCache(cacheFilePath);
} }
/**
* for unit test only
*/
@Deprecated
protected String getCacheFilePath() {
return cacheFilePath;
}
public static Builder newBuilder() { public static Builder newBuilder() {
return new Builder(); return new Builder();
} }

View File

@ -19,6 +19,7 @@ package org.apache.dubbo.common.cache;
import org.apache.dubbo.common.logger.ErrorTypeAwareLogger; import org.apache.dubbo.common.logger.ErrorTypeAwareLogger;
import org.apache.dubbo.common.logger.LoggerFactory; import org.apache.dubbo.common.logger.LoggerFactory;
import org.apache.dubbo.common.utils.ConcurrentHashMapUtils; import org.apache.dubbo.common.utils.ConcurrentHashMapUtils;
import org.apache.dubbo.common.utils.SystemPropertyConfigUtils;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
@ -30,11 +31,11 @@ import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.Collections; import java.util.Collections;
import java.util.HashSet; import java.util.HashSet;
import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap; import java.util.concurrent.ConcurrentMap;
import static org.apache.dubbo.common.constants.CommonConstants.SystemProperty.USER_HOME;
import static org.apache.dubbo.common.constants.LoggerCodeConstants.COMMON_CACHE_PATH_INACCESSIBLE; import static org.apache.dubbo.common.constants.LoggerCodeConstants.COMMON_CACHE_PATH_INACCESSIBLE;
/** /**
@ -82,7 +83,7 @@ public final class FileCacheStoreFactory {
public static FileCacheStore getInstance(String basePath, String cacheName, boolean enableFileCache) { public static FileCacheStore getInstance(String basePath, String cacheName, boolean enableFileCache) {
if (basePath == null) { if (basePath == null) {
// default case: ~/.dubbo // default case: ~/.dubbo
basePath = System.getProperty("user.home") + File.separator + ".dubbo"; basePath = SystemPropertyConfigUtils.getSystemProperty(USER_HOME) + File.separator + ".dubbo";
} }
if (basePath.endsWith(File.separator)) { if (basePath.endsWith(File.separator)) {
basePath = basePath.substring(0, basePath.length() - 1); basePath = basePath.substring(0, basePath.length() - 1);
@ -207,14 +208,6 @@ public final class FileCacheStoreFactory {
cacheMap.remove(cacheFileName); cacheMap.remove(cacheFileName);
} }
/**
* for unit test only
*/
@Deprecated
static Map<String, FileCacheStore> getCacheMap() {
return cacheMap;
}
private static class PathNotExclusiveException extends Exception { private static class PathNotExclusiveException extends Exception {
public PathNotExclusiveException(String msg) { public PathNotExclusiveException(String msg) {
super(msg); super(msg);

View File

@ -18,6 +18,7 @@ package org.apache.dubbo.common.compact;
import org.apache.dubbo.common.constants.CommonConstants; import org.apache.dubbo.common.constants.CommonConstants;
import org.apache.dubbo.common.utils.StringUtils; import org.apache.dubbo.common.utils.StringUtils;
import org.apache.dubbo.common.utils.SystemPropertyConfigUtils;
import java.lang.annotation.Annotation; import java.lang.annotation.Annotation;
@ -38,17 +39,18 @@ public class Dubbo2CompactUtils {
private static void initEnabled() { private static void initEnabled() {
try { try {
String fromProp = System.getProperty(CommonConstants.DUBBO2_COMPACT_ENABLE); String fromProp =
SystemPropertyConfigUtils.getSystemProperty(CommonConstants.DubboProperty.DUBBO2_COMPACT_ENABLE);
if (StringUtils.isNotEmpty(fromProp)) { if (StringUtils.isNotEmpty(fromProp)) {
enabled = Boolean.parseBoolean(fromProp); enabled = Boolean.parseBoolean(fromProp);
return; return;
} }
String fromEnv = System.getenv(CommonConstants.DUBBO2_COMPACT_ENABLE); String fromEnv = System.getenv(CommonConstants.DubboProperty.DUBBO2_COMPACT_ENABLE);
if (StringUtils.isNotEmpty(fromEnv)) { if (StringUtils.isNotEmpty(fromEnv)) {
enabled = Boolean.parseBoolean(fromEnv); enabled = Boolean.parseBoolean(fromEnv);
return; return;
} }
fromEnv = System.getenv(StringUtils.toOSStyleKey(CommonConstants.DUBBO2_COMPACT_ENABLE)); fromEnv = System.getenv(StringUtils.toOSStyleKey(CommonConstants.DubboProperty.DUBBO2_COMPACT_ENABLE));
enabled = !StringUtils.isNotEmpty(fromEnv) || Boolean.parseBoolean(fromEnv); enabled = !StringUtils.isNotEmpty(fromEnv) || Boolean.parseBoolean(fromEnv);
} catch (Throwable t) { } catch (Throwable t) {
enabled = true; enabled = true;

View File

@ -282,7 +282,8 @@ public final class ConfigurationUtils {
for (Map.Entry<String, V> entry : copy.entrySet()) { for (Map.Entry<String, V> entry : copy.entrySet()) {
String key = entry.getKey(); String key = entry.getKey();
V val = entry.getValue(); V val = entry.getValue();
if (StringUtils.startsWithIgnoreCase(key, prefix) if ((StringUtils.startsWithIgnoreCase(key, prefix)
|| StringUtils.startsWithIgnoreCase(key, StringUtils.toOSStyleKey(prefix)))
&& key.length() > prefix.length() && key.length() > prefix.length()
&& !ConfigurationUtils.isEmptyValue(val)) { && !ConfigurationUtils.isEmptyValue(val)) {
@ -322,7 +323,8 @@ public final class ConfigurationUtils {
} }
for (Map.Entry<String, V> entry : copy.entrySet()) { for (Map.Entry<String, V> entry : copy.entrySet()) {
String key = entry.getKey(); String key = entry.getKey();
if (StringUtils.startsWithIgnoreCase(key, prefix) if ((StringUtils.startsWithIgnoreCase(key, prefix)
|| StringUtils.startsWithIgnoreCase(key, StringUtils.toOSStyleKey(prefix)))
&& key.length() > prefix.length() && key.length() > prefix.length()
&& !ConfigurationUtils.isEmptyValue(entry.getValue())) { && !ConfigurationUtils.isEmptyValue(entry.getValue())) {
return true; return true;

View File

@ -25,6 +25,7 @@ import org.apache.dubbo.common.logger.ErrorTypeAwareLogger;
import org.apache.dubbo.common.logger.LoggerFactory; import org.apache.dubbo.common.logger.LoggerFactory;
import org.apache.dubbo.common.utils.ConfigUtils; import org.apache.dubbo.common.utils.ConfigUtils;
import org.apache.dubbo.common.utils.StringUtils; import org.apache.dubbo.common.utils.StringUtils;
import org.apache.dubbo.common.utils.SystemPropertyConfigUtils;
import org.apache.dubbo.config.AbstractConfig; import org.apache.dubbo.config.AbstractConfig;
import org.apache.dubbo.config.context.ConfigConfigurationAdapter; import org.apache.dubbo.config.context.ConfigConfigurationAdapter;
import org.apache.dubbo.rpc.model.ScopeModel; import org.apache.dubbo.rpc.model.ScopeModel;
@ -96,10 +97,12 @@ public class Environment extends LifecycleAdapter implements ApplicationExt {
*/ */
@Deprecated @Deprecated
private void loadMigrationRule() { private void loadMigrationRule() {
if (Boolean.parseBoolean(System.getProperty(CommonConstants.DUBBO_MIGRATION_FILE_ENABLE, "false"))) { if (Boolean.parseBoolean(SystemPropertyConfigUtils.getSystemProperty(
String path = System.getProperty(CommonConstants.DUBBO_MIGRATION_KEY); CommonConstants.DubboProperty.DUBBO_MIGRATION_FILE_ENABLE, "false"))) {
String path =
SystemPropertyConfigUtils.getSystemProperty(CommonConstants.DubboProperty.DUBBO_MIGRATION_KEY);
if (StringUtils.isEmpty(path)) { if (StringUtils.isEmpty(path)) {
path = System.getenv(CommonConstants.DUBBO_MIGRATION_KEY); path = System.getenv(CommonConstants.DubboProperty.DUBBO_MIGRATION_KEY);
if (StringUtils.isEmpty(path)) { if (StringUtils.isEmpty(path)) {
path = CommonConstants.DEFAULT_DUBBO_MIGRATION_FILE; path = CommonConstants.DEFAULT_DUBBO_MIGRATION_FILE;
} }

View File

@ -17,7 +17,6 @@
package org.apache.dubbo.common.config.configcenter; package org.apache.dubbo.common.config.configcenter;
import org.apache.dubbo.common.URL; import org.apache.dubbo.common.URL;
import org.apache.dubbo.common.config.configcenter.file.FileSystemDynamicConfiguration;
import org.apache.dubbo.common.utils.StringUtils; import org.apache.dubbo.common.utils.StringUtils;
import java.util.Collection; import java.util.Collection;
@ -30,7 +29,7 @@ import static org.apache.dubbo.common.utils.PathUtils.normalize;
/** /**
* An abstract implementation of {@link DynamicConfiguration} is like "tree-structure" path : * An abstract implementation of {@link DynamicConfiguration} is like "tree-structure" path :
* <ul> * <ul>
* <li>{@link FileSystemDynamicConfiguration "file"}</li> * <li>{@link org.apache.dubbo.common.config.configcenter.file.FileSystemDynamicConfiguration "file"}</li>
* <li>{@link org.apache.dubbo.configcenter.support.zookeeper.ZookeeperDynamicConfiguration "zookeeper"}</li> * <li>{@link org.apache.dubbo.configcenter.support.zookeeper.ZookeeperDynamicConfiguration "zookeeper"}</li>
* </ul> * </ul>
* *

View File

@ -60,14 +60,8 @@ public interface CommonConstants {
String DISABLED_KEY = "disabled"; String DISABLED_KEY = "disabled";
String DUBBO_PROPERTIES_KEY = "dubbo.properties.file";
String DEFAULT_DUBBO_PROPERTIES = "dubbo.properties"; String DEFAULT_DUBBO_PROPERTIES = "dubbo.properties";
String DUBBO_MIGRATION_KEY = "dubbo.migration.file";
String DUBBO_MIGRATION_FILE_ENABLE = "dubbo.migration-file.enable";
String DEFAULT_DUBBO_MIGRATION_FILE = "dubbo-migration.yaml"; String DEFAULT_DUBBO_MIGRATION_FILE = "dubbo-migration.yaml";
String ANY_VALUE = "*"; String ANY_VALUE = "*";
@ -127,6 +121,8 @@ public interface CommonConstants {
String THREAD_POOL_EXHAUSTED_LISTENERS_KEY = "thread-pool-exhausted-listeners"; String THREAD_POOL_EXHAUSTED_LISTENERS_KEY = "thread-pool-exhausted-listeners";
String JSON_CHECK_LEVEL_KEY = "jsonCheckLevel";
String THREADS_KEY = "threads"; String THREADS_KEY = "threads";
String QUEUES_KEY = "queues"; String QUEUES_KEY = "queues";
@ -285,6 +281,7 @@ public interface CommonConstants {
String MONITOR_KEY = "monitor"; String MONITOR_KEY = "monitor";
String BACKGROUND_KEY = "background"; String BACKGROUND_KEY = "background";
String CLUSTER_KEY = "cluster"; String CLUSTER_KEY = "cluster";
String MERGEABLE_CLUSTER_NAME = "mergeable";
String USERNAME_KEY = "username"; String USERNAME_KEY = "username";
String PASSWORD_KEY = "password"; String PASSWORD_KEY = "password";
String HOST_KEY = "host"; String HOST_KEY = "host";
@ -296,14 +293,6 @@ public interface CommonConstants {
*/ */
String BROADCAST_CLUSTER = "broadcast"; String BROADCAST_CLUSTER = "broadcast";
/**
* The property name for {@link NetworkInterface#getDisplayName() the name of network interface} that
* the Dubbo application prefers
*
* @since 2.7.6
*/
String DUBBO_PREFERRED_NETWORK_INTERFACE = "dubbo.network.interface.preferred";
@Deprecated @Deprecated
String SHUTDOWN_WAIT_SECONDS_KEY = "dubbo.service.shutdown.wait.seconds"; String SHUTDOWN_WAIT_SECONDS_KEY = "dubbo.service.shutdown.wait.seconds";
@ -436,12 +425,6 @@ public interface CommonConstants {
*/ */
String DEFAULT_SERVICE_NAME_MAPPING_PROPERTIES_PATH = "META-INF/dubbo/service-name-mapping.properties"; String DEFAULT_SERVICE_NAME_MAPPING_PROPERTIES_PATH = "META-INF/dubbo/service-name-mapping.properties";
String CLASS_DESERIALIZE_BLOCK_ALL = "dubbo.security.serialize.blockAllClassExceptAllow";
String CLASS_DESERIALIZE_ALLOWED_LIST = "dubbo.security.serialize.allowedClassList";
String CLASS_DESERIALIZE_BLOCKED_LIST = "dubbo.security.serialize.blockedClassList";
String ENABLE_NATIVE_JAVA_GENERIC_SERIALIZE = "dubbo.security.serialize.generic.native-java-enable"; String ENABLE_NATIVE_JAVA_GENERIC_SERIALIZE = "dubbo.security.serialize.generic.native-java-enable";
String SERIALIZE_BLOCKED_LIST_FILE_PATH = "security/serialize.blockedlist"; String SERIALIZE_BLOCKED_LIST_FILE_PATH = "security/serialize.blockedlist";
@ -472,8 +455,6 @@ public interface CommonConstants {
String DEFAULT_VERSION = "0.0.0"; String DEFAULT_VERSION = "0.0.0";
String CLASS_DESERIALIZE_OPEN_CHECK = "dubbo.security.serialize.openCheckClass";
String ROUTER_KEY = "router"; String ROUTER_KEY = "router";
String EXPORT_ASYNC_KEY = "export-async"; String EXPORT_ASYNC_KEY = "export-async";
@ -501,11 +482,6 @@ public interface CommonConstants {
*/ */
String URL_MERGE_PROCESSOR_KEY = "url-merge-processor"; String URL_MERGE_PROCESSOR_KEY = "url-merge-processor";
/**
* use native image to compile dubbo's identifier
*/
String NATIVE = "native";
String DUBBO_MONITOR_ADDRESS = "dubbo.monitor.address"; String DUBBO_MONITOR_ADDRESS = "dubbo.monitor.address";
String SERVICE_NAME_MAPPING_KEY = "service-name-mapping"; String SERVICE_NAME_MAPPING_KEY = "service-name-mapping";
@ -514,16 +490,6 @@ public interface CommonConstants {
String SERVICE_MODEL = "serviceModel"; String SERVICE_MODEL = "serviceModel";
/**
* The property name for {@link NetworkInterface#getDisplayName() the name of network interface} that
* the Dubbo application will be ignored
*
* @since 2.7.6
*/
String DUBBO_NETWORK_IGNORED_INTERFACE = "dubbo.network.interface.ignored";
String OS_NAME_KEY = "os.name";
String OS_LINUX_PREFIX = "linux"; String OS_LINUX_PREFIX = "linux";
String OS_WIN_PREFIX = "win"; String OS_WIN_PREFIX = "win";
@ -568,10 +534,6 @@ public interface CommonConstants {
String INJVM_IGNORE_SAME_MODULE_KEY = "injvm.ignore.same-module"; String INJVM_IGNORE_SAME_MODULE_KEY = "injvm.ignore.same-module";
String SET_FUTURE_IN_SYNC_MODE = "future.sync.set";
String CLEAR_FUTURE_AFTER_GET = "future.clear.once";
String NATIVE_STUB = "nativestub"; String NATIVE_STUB = "nativestub";
String METADATA = "metadata"; String METADATA = "metadata";
@ -580,8 +542,6 @@ public interface CommonConstants {
String OPTIMIZER_KEY = "optimizer"; String OPTIMIZER_KEY = "optimizer";
String PREFER_JSON_FRAMEWORK_NAME = "dubbo.json-framework.prefer";
/** /**
* @since 3.1.0 * @since 3.1.0
*/ */
@ -618,21 +578,9 @@ public interface CommonConstants {
String EXECUTOR_MANAGEMENT_MODE_DEFAULT = "default"; String EXECUTOR_MANAGEMENT_MODE_DEFAULT = "default";
String EXECUTOR_MANAGEMENT_MODE_ISOLATION = "isolation"; String EXECUTOR_MANAGEMENT_MODE_ISOLATION = "isolation";
/**
*
* used in JVMUtil.java ,Control stack print lines, default is 32 lines
*
*/
String DUBBO_JSTACK_MAXLINE = "dubbo.jstack-dump.max-line";
String ENCODE_IN_IO_THREAD_KEY = "encode.in.io"; String ENCODE_IN_IO_THREAD_KEY = "encode.in.io";
boolean DEFAULT_ENCODE_IN_IO_THREAD = false; boolean DEFAULT_ENCODE_IN_IO_THREAD = false;
/**
* @since 3.2.0
*/
String BYTE_ACCESSOR_KEY = "byte.accessor";
String PAYLOAD = "payload"; String PAYLOAD = "payload";
String DUBBO_METRICS_CONFIGCENTER_ENABLE = "dubbo.metrics.configcenter.enable"; String DUBBO_METRICS_CONFIGCENTER_ENABLE = "dubbo.metrics.configcenter.enable";
@ -643,7 +591,161 @@ public interface CommonConstants {
String DUBBO_PACKABLE_METHOD_FACTORY = "dubbo.application.parameters." + PACKABLE_METHOD_FACTORY_KEY; String DUBBO_PACKABLE_METHOD_FACTORY = "dubbo.application.parameters." + PACKABLE_METHOD_FACTORY_KEY;
String DUBBO_MANUAL_REGISTER_KEY = "dubbo.application.manual-register"; String DUBBO_TAG_HEADER = "dubbo-tag";
String DUBBO2_COMPACT_ENABLE = "dubbo.compact.enable"; String REST_SERVICE_DEPLOYER_URL_ATTRIBUTE_KEY = "restServiceDeployerAttributeKey";
String POD_NAMESPACE = "POD_NAMESPACE";
String CLUSTER_DOMAIN = "CLUSTER_DOMAIN";
String EXT_PROTOCOL = "ext.protocol";
String IS_EXTRA = "isExtra";
/**
* System-related VM properties
*/
interface SystemProperty {
String USER_HOME = "user.home";
String SYSTEM_JAVA_VERSION = "java.version";
String SYSTEM_JAVA_IO_TMPDIR = "java.io.tmpdir";
String SYSTEM_LINE_SEPARATOR = "line.separator";
String SERIALIZATION_SECURITY_CHECK_KEY = "serialization.security.check";
String SYSTEM_BYTE_ACCESSOR_KEY = "byte.accessor";
String SYSTEM_OS_NAME = "os.name";
String SYSTEM_OS_VERSION = "os.version";
String JAVA_RUNTIME_NAME = "java.runtime.name";
String JAVA_RUNTIME_VERSION = "java.runtime.version";
String JAVA_VM_NAME = "java.vm.name";
String JAVA_VM_VERSION = "java.vm.version";
String JAVA_VM_INFO = "java.vm.info";
String JAVA_HOME = "java.home";
String OS_ARCH = "os.arch";
String SYSTEM_FILE_ENCODING = "file.encoding";
String SYSTEM_TCP_RESPONSE_TIMEOUT = "sun.rmi.transport.tcp.responseTimeout";
}
/**
* Third-party-related VM properties
*/
interface ThirdPartyProperty {
String NETTY_EPOLL_ENABLE_KEY = "netty.epoll.enable";
String SET_FUTURE_IN_SYNC_MODE = "future.sync.set";
String CLEAR_FUTURE_AFTER_GET = "future.clear.once";
String APOLLO_ADDR_KEY = "apollo.meta";
String APOLLO_CLUSTER_KEY = "apollo.cluster";
String APOLLO_ENV_KEY = "env";
String APOLLO_APPID_KEY = "app.id";
String NACOS_SERVICE_NAME_SEPARATOR = "nacos.service.name.separator";
String GRAALVM_NATIVEIMAGE_IMAGECODE = "org.graalvm.nativeimage.imagecode";
/**
* The JVM arguments to set if it can use embedded zookeeper, the default value is {@code true}.
*/
String ZOOKEEPER_CONFIG_ENABLE_EMBEDDED = "enableEmbeddedZookeeper";
}
/**
* Dubbo custom VM properties
*/
interface DubboProperty {
String DUBBO_MIGRATION_FILE_ENABLE = "dubbo.migration-file.enable";
String DUBBO_MIGRATION_KEY = "dubbo.migration.file";
String DUBBO_APPLICATION_LOGGER = "dubbo.application.logger";
String DUBBO_PROPERTIES_KEY = "dubbo.properties.file";
String DUBBO_PREFER_JSON_FRAMEWORK_NAME = "dubbo.json-framework.prefer";
/**
* used in JVMUtil.java ,Control stack print lines, default is 32 lines
*/
String DUBBO_JSTACK_MAXLINE = "dubbo.jstack-dump.max-line";
/**
* The property name for {@link NetworkInterface#getDisplayName() the name of network interface} that
* the Dubbo application will be ignored
*
* @since 2.7.6
*/
String DUBBO_NETWORK_IGNORED_INTERFACE = "dubbo.network.interface.ignored";
/**
* The property name for {@link NetworkInterface#getDisplayName() the name of network interface} that
* the Dubbo application prefers
*
* @since 2.7.6
*/
String DUBBO_PREFERRED_NETWORK_INTERFACE = "dubbo.network.interface.preferred";
String DUBBO_CLASS_DESERIALIZE_ALLOWED_LIST = "dubbo.security.serialize.allowedClassList";
String DUBBO_CLASS_DESERIALIZE_BLOCKED_LIST = "dubbo.security.serialize.blockedClassList";
String DUBBO_CLASS_DESERIALIZE_OPEN_CHECK = "dubbo.security.serialize.openCheckClass";
String DUBBO_CLASS_DESERIALIZE_BLOCK_ALL = "dubbo.security.serialize.blockAllClassExceptAllow";
String DUBBO_RESOLVE_FILE = "dubbo.resolve.file";
String DUBBO_IP_TO_REGISTRY = "DUBBO_IP_TO_REGISTRY";
String DUBBO_MONITOR_ADDRESS = "dubbo.monitor.address";
String DUBBO_CONTAINER_KEY = "dubbo.container";
String DUBBO_SHUTDOWN_HOOK_KEY = "dubbo.shutdown.hook";
String DUBBO_SPRING_CONFIG = "dubbo.spring.config";
String DUBBO_MAPPING_CACHE_FILEPATH = "dubbo.mapping.cache.filePath";
String DUBBO_MAPPING_CACHE_FILENAME = "dubbo.mapping.cache.fileName";
String DUBBO_MAPPING_CACHE_ENTRYSIZE = "dubbo.mapping.cache.entrySize";
String DUBBO_MAPPING_CACHE_MAXFILESIZE = "dubbo.mapping.cache.maxFileSize";
String DUBBO_META_CACHE_FILEPATH = "dubbo.meta.cache.filePath";
String DUBBO_META_CACHE_FILENAME = "dubbo.meta.cache.fileName";
String DUBBO_META_CACHE_ENTRYSIZE = "dubbo.meta.cache.entrySize";
String DUBBO_META_CACHE_MAXFILESIZE = "dubbo.meta.cache.maxFileSize";
String DUBBO_USE_SECURE_RANDOM_ID = "dubbo.application.use-secure-random-request-id";
String DUBBO_CLOSE_TIMEOUT_CONFIG_KEY = "dubbo.protocol.default-close-timeout";
String DUBBO_HEARTBEAT_CONFIG_KEY = "dubbo.protocol.default-heartbeat";
String DUBBO_DEFAULT_REMOTING_SERIALIZATION_PROPERTY = "DUBBO_DEFAULT_SERIALIZATION";
String DUBBO_HESSIAN_ALLOW_NON_SERIALIZABLE = "dubbo.hessian.allowNonSerializable";
String DUBBO_HESSIAN_WHITELIST = "dubbo.application.hessian2.whitelist";
String DUBBO_HESSIAN_ALLOW = "dubbo.application.hessian2.allow";
String DUBBO_HESSIAN_DENY = "dubbo.application.hessian2.deny";
String DUBBO_MANUAL_REGISTER_KEY = "dubbo.application.manual-register";
String DUBBO2_COMPACT_ENABLE = "dubbo.compact.enable";
}
} }

View File

@ -91,6 +91,8 @@ public interface LoggerCodeConstants {
String VULNERABILITY_WARNING = "0-28"; String VULNERABILITY_WARNING = "0-28";
String COMMON_NOT_FOUND_TRACER_DEPENDENCY = "0-29";
// Registry module // Registry module
String REGISTRY_ADDRESS_INVALID = "1-1"; String REGISTRY_ADDRESS_INVALID = "1-1";

View File

@ -47,6 +47,8 @@ public interface MetricsConstants {
String TAG_CHANGE_TYPE = "change.type"; String TAG_CHANGE_TYPE = "change.type";
String TAG_ERROR_CODE = "error";
String ENABLE_JVM_METRICS_KEY = "enable.jvm"; String ENABLE_JVM_METRICS_KEY = "enable.jvm";
String ENABLE_COLLECTOR_SYNC_KEY = "enable.collector.sync"; String ENABLE_COLLECTOR_SYNC_KEY = "enable.collector.sync";

View File

@ -141,4 +141,5 @@ public interface RegistryConstants {
String ENABLE_EMPTY_PROTECTION_KEY = "enable-empty-protection"; String ENABLE_EMPTY_PROTECTION_KEY = "enable-empty-protection";
boolean DEFAULT_ENABLE_EMPTY_PROTECTION = false; boolean DEFAULT_ENABLE_EMPTY_PROTECTION = false;
String REGISTER_CONSUMER_URL_KEY = "register-consumer-url"; String REGISTER_CONSUMER_URL_KEY = "register-consumer-url";
String REGISTRY_PROTOCOL_TYPE = "registry-protocol-type";
} }

View File

@ -24,6 +24,7 @@ import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CopyOnWriteArrayList;
import static org.apache.dubbo.common.constants.LoggerCodeConstants.COMMON_MONITOR_EXCEPTION; import static org.apache.dubbo.common.constants.LoggerCodeConstants.COMMON_MONITOR_EXCEPTION;
import static org.apache.dubbo.common.deploy.DeployState.COMPLETION;
import static org.apache.dubbo.common.deploy.DeployState.FAILED; import static org.apache.dubbo.common.deploy.DeployState.FAILED;
import static org.apache.dubbo.common.deploy.DeployState.PENDING; import static org.apache.dubbo.common.deploy.DeployState.PENDING;
import static org.apache.dubbo.common.deploy.DeployState.STARTED; import static org.apache.dubbo.common.deploy.DeployState.STARTED;
@ -56,12 +57,17 @@ public abstract class AbstractDeployer<E extends ScopeModel> implements Deployer
@Override @Override
public boolean isRunning() { public boolean isRunning() {
return state == STARTING || state == STARTED; return state == STARTING || state == STARTED || state == COMPLETION;
} }
@Override @Override
public boolean isStarted() { public boolean isStarted() {
return state == STARTED; return state == STARTED || state == COMPLETION;
}
@Override
public boolean isCompletion() {
return state == COMPLETION;
} }
@Override @Override
@ -135,6 +141,22 @@ public abstract class AbstractDeployer<E extends ScopeModel> implements Deployer
} }
} }
protected void setCompletion() {
this.state = COMPLETION;
for (DeployListener<E> listener : listeners) {
try {
listener.onCompletion(scopeModel);
} catch (Throwable e) {
logger.error(
COMMON_MONITOR_EXCEPTION,
"",
"",
getIdentifier() + " an exception occurred when handle completion event",
e);
}
}
}
protected void setStopping() { protected void setStopping() {
this.state = STOPPING; this.state = STOPPING;
for (DeployListener<E> listener : listeners) { for (DeployListener<E> listener : listeners) {

View File

@ -48,7 +48,9 @@ public interface ApplicationDeployer extends Deployer<ApplicationModel> {
/** /**
* Register application instance and start internal services * Register application instance and start internal services
*/ */
void prepareApplicationInstance(); void prepareApplicationInstance(ModuleModel moduleModel);
void exportMetadataService();
/** /**
* Register application instance and start internal services * Register application instance and start internal services

View File

@ -24,13 +24,35 @@ public interface DeployListener<E extends ScopeModel> {
*/ */
void onInitialize(E scopeModel); void onInitialize(E scopeModel);
/**
* Triggered before starting module.
*/
void onStarting(E scopeModel); void onStarting(E scopeModel);
/**
* Triggered before registering and exposing the service.
*/
void onStarted(E scopeModel); void onStarted(E scopeModel);
/**
* Triggered after deployer startup is complete.
*/
default void onCompletion(E scopeModel) {}
/**
* Triggered before the app is destroyed,
* can do some customized things before offline the service and destroy reference.
*/
void onStopping(E scopeModel); void onStopping(E scopeModel);
/**
* Triggered after the application is destroyed,
* can do some customized things after the service is offline and the reference is destroyed.
*/
void onStopped(E scopeModel); void onStopped(E scopeModel);
/**
* Useful to do something when deployer was failed.
*/
void onFailure(E scopeModel, Throwable cause); void onFailure(E scopeModel, Throwable cause);
} }

View File

@ -28,6 +28,9 @@ public class DeployListenerAdapter<E extends ScopeModel> implements DeployListen
@Override @Override
public void onStarted(E scopeModel) {} public void onStarted(E scopeModel) {}
@Override
public void onCompletion(E scopeModel) {}
@Override @Override
public void onStopping(E scopeModel) {} public void onStopping(E scopeModel) {}

View File

@ -40,6 +40,11 @@ public enum DeployState {
*/ */
STARTED, STARTED,
/**
* Completion
*/
COMPLETION,
/** /**
* Stopping * Stopping
*/ */

View File

@ -55,6 +55,8 @@ public interface Deployer<E extends ScopeModel> {
*/ */
boolean isStarted(); boolean isStarted();
boolean isCompletion();
/** /**
* @return true if the component is starting. * @return true if the component is starting.
* @see #isStarted() * @see #isStarted()

View File

@ -50,4 +50,8 @@ public interface ModuleDeployer extends Deployer<ModuleModel> {
* Whether start in background, do not await finish * Whether start in background, do not await finish
*/ */
boolean isBackground(); boolean isBackground();
boolean hasRegistryInteraction();
ApplicationDeployer getApplicationDeployer();
} }

View File

@ -16,6 +16,9 @@
*/ */
package org.apache.dubbo.common.extension; package org.apache.dubbo.common.extension;
import java.util.Collections;
import java.util.List;
/** /**
* Uniform accessor for extension * Uniform accessor for extension
*/ */
@ -24,7 +27,7 @@ public interface ExtensionAccessor {
ExtensionDirector getExtensionDirector(); ExtensionDirector getExtensionDirector();
default <T> ExtensionLoader<T> getExtensionLoader(Class<T> type) { default <T> ExtensionLoader<T> getExtensionLoader(Class<T> type) {
return this.getExtensionDirector().getExtensionLoader(type); return getExtensionDirector().getExtensionLoader(type);
} }
default <T> T getExtension(Class<T> type, String name) { default <T> T getExtension(Class<T> type, String name) {
@ -41,4 +44,21 @@ public interface ExtensionAccessor {
ExtensionLoader<T> extensionLoader = getExtensionLoader(type); ExtensionLoader<T> extensionLoader = getExtensionLoader(type);
return extensionLoader != null ? extensionLoader.getDefaultExtension() : null; return extensionLoader != null ? extensionLoader.getDefaultExtension() : null;
} }
default <T> List<T> getActivateExtensions(Class<T> type) {
ExtensionLoader<T> extensionLoader = getExtensionLoader(type);
return extensionLoader != null ? extensionLoader.getActivateExtensions() : Collections.emptyList();
}
default <T> T getFirstActivateExtension(Class<T> type) {
ExtensionLoader<T> extensionLoader = getExtensionLoader(type);
if (extensionLoader == null) {
throw new IllegalArgumentException("ExtensionLoader for [" + type + "] is not found");
}
List<T> extensions = extensionLoader.getActivateExtensions();
if (extensions.isEmpty()) {
throw new IllegalArgumentException("No activate extensions for [" + type + "] found");
}
return extensions.get(0);
}
} }

View File

@ -18,6 +18,7 @@ package org.apache.dubbo.common.extension;
import org.apache.dubbo.common.Extension; import org.apache.dubbo.common.Extension;
import org.apache.dubbo.common.URL; import org.apache.dubbo.common.URL;
import org.apache.dubbo.common.aot.NativeDetector;
import org.apache.dubbo.common.beans.support.InstantiationStrategy; import org.apache.dubbo.common.beans.support.InstantiationStrategy;
import org.apache.dubbo.common.compact.Dubbo2ActivateUtils; import org.apache.dubbo.common.compact.Dubbo2ActivateUtils;
import org.apache.dubbo.common.compact.Dubbo2CompactUtils; import org.apache.dubbo.common.compact.Dubbo2CompactUtils;
@ -35,7 +36,6 @@ import org.apache.dubbo.common.utils.CollectionUtils;
import org.apache.dubbo.common.utils.ConcurrentHashSet; import org.apache.dubbo.common.utils.ConcurrentHashSet;
import org.apache.dubbo.common.utils.ConfigUtils; import org.apache.dubbo.common.utils.ConfigUtils;
import org.apache.dubbo.common.utils.Holder; import org.apache.dubbo.common.utils.Holder;
import org.apache.dubbo.common.utils.NativeUtils;
import org.apache.dubbo.common.utils.ReflectUtils; import org.apache.dubbo.common.utils.ReflectUtils;
import org.apache.dubbo.common.utils.StringUtils; import org.apache.dubbo.common.utils.StringUtils;
import org.apache.dubbo.rpc.model.ApplicationModel; import org.apache.dubbo.rpc.model.ApplicationModel;
@ -1451,7 +1451,7 @@ public class ExtensionLoader<T> {
// Adaptive Classes' ClassLoader should be the same with Real SPI interface classes' ClassLoader // Adaptive Classes' ClassLoader should be the same with Real SPI interface classes' ClassLoader
ClassLoader classLoader = type.getClassLoader(); ClassLoader classLoader = type.getClassLoader();
try { try {
if (NativeUtils.isNative()) { if (NativeDetector.inNativeImage()) {
return classLoader.loadClass(type.getName() + "$Adaptive"); return classLoader.loadClass(type.getName() + "$Adaptive");
} }
} catch (Throwable ignore) { } catch (Throwable ignore) {

View File

@ -16,8 +16,13 @@
*/ */
package org.apache.dubbo.common.io; package org.apache.dubbo.common.io;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.OutputStream;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
/** /**
* Stream utils. * Stream utils.
@ -229,4 +234,51 @@ public class StreamUtils {
is.skip(is.available()); is.skip(is.available());
} }
} }
public static void copy(InputStream in, OutputStream out) throws IOException {
if (in.getClass() == ByteArrayInputStream.class) {
copy((ByteArrayInputStream) in, out);
return;
}
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = in.read(buffer)) != -1) {
out.write(buffer, 0, bytesRead);
}
}
public static void copy(ByteArrayInputStream in, OutputStream out) throws IOException {
int len = in.available();
byte[] buffer = new byte[len];
in.read(buffer, 0, len);
out.write(buffer, 0, len);
}
public static byte[] readBytes(InputStream in) throws IOException {
if (in.getClass() == ByteArrayInputStream.class) {
return readBytes((ByteArrayInputStream) in);
}
ByteArrayOutputStream out = new ByteArrayOutputStream();
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = in.read(buffer)) != -1) {
out.write(buffer, 0, bytesRead);
}
return out.toByteArray();
}
public static byte[] readBytes(ByteArrayInputStream in) throws IOException {
int len = in.available();
byte[] bytes = new byte[len];
in.read(bytes, 0, len);
return bytes;
}
public static String toString(InputStream in) throws IOException {
return new String(readBytes(in), StandardCharsets.UTF_8);
}
public static String toString(InputStream in, Charset charset) throws IOException {
return new String(readBytes(in), charset);
}
} }

View File

@ -62,6 +62,19 @@ public class GsonUtils {
} }
} }
public static String toJson(Object obj) throws RuntimeException {
if (!isSupportGson()) {
throw new RuntimeException("Gson is not supported. Please import Gson in JVM env.");
}
try {
return getGson().toJson(obj);
} catch (JsonSyntaxException ex) {
throw new RuntimeException(String.format(
"Generic serialization [%s] Json syntax exception thrown when parsing (object:%s ) error:%s",
GENERIC_SERIALIZATION_GSON, obj, ex.getMessage()));
}
}
private static Gson getGson() { private static Gson getGson() {
if (gsonCache == null || !(gsonCache instanceof Gson)) { if (gsonCache == null || !(gsonCache instanceof Gson)) {
synchronized (GsonUtils.class) { synchronized (GsonUtils.class) {

View File

@ -16,11 +16,14 @@
*/ */
package org.apache.dubbo.common.json; package org.apache.dubbo.common.json;
import org.apache.dubbo.common.extension.SPI;
import java.lang.reflect.Type; import java.lang.reflect.Type;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
public interface JSON { @SPI
public interface JsonUtil {
boolean isSupport(); boolean isSupport();
<T> T toJavaObject(String json, Type type); <T> T toJavaObject(String json, Type type);
@ -37,6 +40,10 @@ public interface JSON {
Map<String, ?> getObject(Map<String, ?> obj, String key); Map<String, ?> getObject(Map<String, ?> obj, String key);
Object convertObject(Object obj, Type type);
Object convertObject(Object obj, Class<?> clazz);
Double getNumberAsDouble(Map<String, ?> obj, String key); Double getNumberAsDouble(Map<String, ?> obj, String key);
Integer getNumberAsInteger(Map<String, ?> obj, String key); Integer getNumberAsInteger(Map<String, ?> obj, String key);

View File

@ -16,7 +16,7 @@
*/ */
package org.apache.dubbo.common.json.impl; package org.apache.dubbo.common.json.impl;
import org.apache.dubbo.common.json.JSON; import org.apache.dubbo.common.json.JsonUtil;
import org.apache.dubbo.common.utils.CollectionUtils; import org.apache.dubbo.common.utils.CollectionUtils;
import java.util.HashMap; import java.util.HashMap;
@ -24,7 +24,7 @@ import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
public abstract class AbstractJSONImpl implements JSON { public abstract class AbstractJsonUtilImpl implements JsonUtil {
@Override @Override
public boolean isSupport() { public boolean isSupport() {
try { try {

View File

@ -21,7 +21,7 @@ import java.util.List;
import com.alibaba.fastjson2.JSONWriter; import com.alibaba.fastjson2.JSONWriter;
public class FastJson2Impl extends AbstractJSONImpl { public class FastJson2Impl extends AbstractJsonUtilImpl {
@Override @Override
public <T> T toJavaObject(String json, Type type) { public <T> T toJavaObject(String json, Type type) {
return com.alibaba.fastjson2.JSON.parseObject(json, type); return com.alibaba.fastjson2.JSON.parseObject(json, type);
@ -36,4 +36,14 @@ public class FastJson2Impl extends AbstractJSONImpl {
public String toJson(Object obj) { public String toJson(Object obj) {
return com.alibaba.fastjson2.JSON.toJSONString(obj, JSONWriter.Feature.WriteEnumsUsingName); return com.alibaba.fastjson2.JSON.toJSONString(obj, JSONWriter.Feature.WriteEnumsUsingName);
} }
@Override
public Object convertObject(Object obj, Type type) {
return com.alibaba.fastjson2.util.TypeUtils.cast(obj, type);
}
@Override
public Object convertObject(Object obj, Class<?> clazz) {
return com.alibaba.fastjson2.util.TypeUtils.cast(obj, clazz);
}
} }

View File

@ -19,9 +19,10 @@ package org.apache.dubbo.common.json.impl;
import java.lang.reflect.Type; import java.lang.reflect.Type;
import java.util.List; import java.util.List;
import com.alibaba.fastjson.parser.ParserConfig;
import com.alibaba.fastjson.serializer.SerializerFeature; import com.alibaba.fastjson.serializer.SerializerFeature;
public class FastJsonImpl extends AbstractJSONImpl { public class FastJsonImpl extends AbstractJsonUtilImpl {
@Override @Override
public <T> T toJavaObject(String json, Type type) { public <T> T toJavaObject(String json, Type type) {
@ -37,4 +38,14 @@ public class FastJsonImpl extends AbstractJSONImpl {
public String toJson(Object obj) { public String toJson(Object obj) {
return com.alibaba.fastjson.JSON.toJSONString(obj, SerializerFeature.DisableCircularReferenceDetect); return com.alibaba.fastjson.JSON.toJSONString(obj, SerializerFeature.DisableCircularReferenceDetect);
} }
@Override
public Object convertObject(Object obj, Type type) {
return com.alibaba.fastjson.util.TypeUtils.cast(obj, type, ParserConfig.getGlobalInstance());
}
@Override
public Object convertObject(Object obj, Class<?> clazz) {
return com.alibaba.fastjson.util.TypeUtils.cast(obj, clazz, ParserConfig.getGlobalInstance());
}
} }

View File

@ -22,7 +22,7 @@ import java.util.List;
import com.google.gson.Gson; import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken; import com.google.gson.reflect.TypeToken;
public class GsonImpl extends AbstractJSONImpl { public class GsonImpl extends AbstractJsonUtilImpl {
// weak reference of com.google.gson.Gson, prevent throw exception when init // weak reference of com.google.gson.Gson, prevent throw exception when init
private volatile Object gsonCache = null; private volatile Object gsonCache = null;
@ -42,6 +42,18 @@ public class GsonImpl extends AbstractJSONImpl {
return getGson().toJson(obj); return getGson().toJson(obj);
} }
@Override
public Object convertObject(Object obj, Type type) {
Gson gson = getGson();
return gson.fromJson(gson.toJsonTree(obj), type);
}
@Override
public Object convertObject(Object obj, Class<?> clazz) {
Gson gson = getGson();
return gson.fromJson(gson.toJsonTree(obj), clazz);
}
private Gson getGson() { private Gson getGson() {
if (gsonCache == null || !(gsonCache instanceof Gson)) { if (gsonCache == null || !(gsonCache instanceof Gson)) {
synchronized (this) { synchronized (this) {

View File

@ -26,7 +26,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.json.JsonMapper; import com.fasterxml.jackson.databind.json.JsonMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
public class JacksonImpl extends AbstractJSONImpl { public class JacksonImpl extends AbstractJsonUtilImpl {
private final ObjectMapper objectMapper = new ObjectMapper(); private final ObjectMapper objectMapper = new ObjectMapper();
private volatile Object jacksonCache = null; private volatile Object jacksonCache = null;
@ -59,6 +59,17 @@ public class JacksonImpl extends AbstractJSONImpl {
} }
} }
@Override
public Object convertObject(Object obj, Type type) {
JsonMapper mapper = getJackson();
return mapper.convertValue(obj, mapper.constructType(type));
}
@Override
public Object convertObject(Object obj, Class<?> clazz) {
return getJackson().convertValue(obj, clazz);
}
private JsonMapper getJackson() { private JsonMapper getJackson() {
if (jacksonCache == null || !(jacksonCache instanceof JsonMapper)) { if (jacksonCache == null || !(jacksonCache instanceof JsonMapper)) {
synchronized (this) { synchronized (this) {

View File

@ -14,15 +14,17 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.apache.dubbo.rpc.protocol.rest; package org.apache.dubbo.common.logger;
/** /**
* Only the server that implements servlet container * Loggers that can register to listen to log messages.
* could support something like @Context injection of servlet objects.
*/ */
public class RestServerFactory { public interface ListenableLogger extends ErrorTypeAwareLogger {
public RestProtocolServer createServer(String name) { /**
return new NettyHttpRestServer(); * Register a listener to this loggerand get notified when a log happens.
} *
* @param listener log listener
*/
void registerListen(LogListener listener);
} }

View File

@ -0,0 +1,25 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.dubbo.common.logger;
/**
* Log Listener, can registered to an {@link ListenableLogger}.
*/
public interface LogListener {
void onMessage(String code, String msg);
}

View File

@ -30,6 +30,14 @@ public interface Logger {
*/ */
void trace(String msg); void trace(String msg);
/**
* Logs a message with trace log level.
*
* @param msg log this message
* @param arguments a list of arguments
*/
void trace(String msg, Object... arguments);
/** /**
* Logs an error with trace log level. * Logs an error with trace log level.
* *
@ -52,6 +60,14 @@ public interface Logger {
*/ */
void debug(String msg); void debug(String msg);
/**
* Logs a message with debug log level.
*
* @param msg log this message
* @param arguments a list of arguments
*/
void debug(String msg, Object... arguments);
/** /**
* Logs an error with debug log level. * Logs an error with debug log level.
* *
@ -74,6 +90,14 @@ public interface Logger {
*/ */
void info(String msg); void info(String msg);
/**
* Logs a message with info log level.
*
* @param msg log this message
* @param arguments a list of arguments
*/
void info(String msg, Object... arguments);
/** /**
* Logs an error with info log level. * Logs an error with info log level.
* *
@ -96,6 +120,14 @@ public interface Logger {
*/ */
void warn(String msg); void warn(String msg);
/**
* Logs a message with warn log level.
*
* @param msg log this message
* @param arguments a list of arguments
*/
void warn(String msg, Object... arguments);
/** /**
* Logs a message with warn log level. * Logs a message with warn log level.
* *
@ -118,6 +150,14 @@ public interface Logger {
*/ */
void error(String msg); void error(String msg);
/**
* Logs a message with error log level.
*
* @param msg log this message
* @param arguments a list of arguments
*/
void error(String msg, Object... arguments);
/** /**
* Logs an error with error log level. * Logs an error with error log level.
* *

View File

@ -16,6 +16,7 @@
*/ */
package org.apache.dubbo.common.logger; package org.apache.dubbo.common.logger;
import org.apache.dubbo.common.constants.CommonConstants;
import org.apache.dubbo.common.logger.jcl.JclLoggerAdapter; import org.apache.dubbo.common.logger.jcl.JclLoggerAdapter;
import org.apache.dubbo.common.logger.jdk.JdkLoggerAdapter; import org.apache.dubbo.common.logger.jdk.JdkLoggerAdapter;
import org.apache.dubbo.common.logger.log4j.Log4jLoggerAdapter; import org.apache.dubbo.common.logger.log4j.Log4jLoggerAdapter;
@ -24,6 +25,7 @@ import org.apache.dubbo.common.logger.slf4j.Slf4jLoggerAdapter;
import org.apache.dubbo.common.logger.support.FailsafeErrorTypeAwareLogger; import org.apache.dubbo.common.logger.support.FailsafeErrorTypeAwareLogger;
import org.apache.dubbo.common.logger.support.FailsafeLogger; import org.apache.dubbo.common.logger.support.FailsafeLogger;
import org.apache.dubbo.common.utils.ConcurrentHashMapUtils; import org.apache.dubbo.common.utils.ConcurrentHashMapUtils;
import org.apache.dubbo.common.utils.SystemPropertyConfigUtils;
import org.apache.dubbo.rpc.model.FrameworkModel; import org.apache.dubbo.rpc.model.FrameworkModel;
import java.io.File; import java.io.File;
@ -47,7 +49,8 @@ public class LoggerFactory {
// search common-used logging frameworks // search common-used logging frameworks
static { static {
String logger = System.getProperty("dubbo.application.logger", ""); String logger =
SystemPropertyConfigUtils.getSystemProperty(CommonConstants.DubboProperty.DUBBO_APPLICATION_LOGGER, "");
switch (logger) { switch (logger) {
case Slf4jLoggerAdapter.NAME: case Slf4jLoggerAdapter.NAME:
setLoggerAdapter(new Slf4jLoggerAdapter()); setLoggerAdapter(new Slf4jLoggerAdapter());

View File

@ -0,0 +1,63 @@
/*
* Copyright (c) 2004-2011 QOS.ch
* All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
*/
package org.apache.dubbo.common.logger.helpers;
/**
* Holds the results of formatting done by {@link MessageFormatter}.
* This is a copy of org.slf4j.helpers.FormattingTuple from slf4j-api.
*
* @author Joern Huxhorn
*/
public class FormattingTuple {
static public FormattingTuple NULL = new FormattingTuple(null);
private String message;
private Throwable throwable;
private Object[] argArray;
public FormattingTuple(String message) {
this(message, null, null);
}
public FormattingTuple(String message, Object[] argArray, Throwable throwable) {
this.message = message;
this.throwable = throwable;
this.argArray = argArray;
}
public String getMessage() {
return message;
}
public Object[] getArgArray() {
return argArray;
}
public Throwable getThrowable() {
return throwable;
}
}

View File

@ -0,0 +1,437 @@
/*
* Copyright (c) 2004-2011 QOS.ch
* All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
*/
package org.apache.dubbo.common.logger.helpers;
import java.text.MessageFormat;
import java.util.HashMap;
import java.util.Map;
// contributors: lizongbo: proposed special treatment of array parameter values
// Joern Huxhorn: pointed out double[] omission, suggested deep array copy
/**
* This is a copy of org.slf4j.helpers.MessageFormatter from slf4j-api.
* Formats messages according to very simple substitution rules. Substitutions
* can be made 1, 2 or more arguments.
*
* <p>
* For example,
*
* <pre>
* MessageFormatter.format(&quot;Hi {}.&quot;, &quot;there&quot;)
* </pre>
* <p>
* will return the string "Hi there.".
* <p>
* The {} pair is called the <em>formatting anchor</em>. It serves to designate
* the location where arguments need to be substituted within the message
* pattern.
* <p>
* In case your message contains the '{' or the '}' character, you do not have
* to do anything special unless the '}' character immediately follows '{'. For
* example,
*
* <pre>
* MessageFormatter.format(&quot;Set {1,2,3} is not equal to {}.&quot;, &quot;1,2&quot;);
* </pre>
* <p>
* will return the string "Set {1,2,3} is not equal to 1,2.".
*
* <p>
* If for whatever reason you need to place the string "{}" in the message
* without its <em>formatting anchor</em> meaning, then you need to escape the
* '{' character with '\', that is the backslash character. Only the '{'
* character should be escaped. There is no need to escape the '}' character.
* For example,
*
* <pre>
* MessageFormatter.format(&quot;Set \\{} is not equal to {}.&quot;, &quot;1,2&quot;);
* </pre>
* <p>
* will return the string "Set {} is not equal to 1,2.".
*
* <p>
* The escaping behavior just described can be overridden by escaping the escape
* character '\'. Calling
*
* <pre>
* MessageFormatter.format(&quot;File name is C:\\\\{}.&quot;, &quot;file.zip&quot;);
* </pre>
* <p>
* will return the string "File name is C:\file.zip".
*
* <p>
* The formatting conventions are different than those of {@link MessageFormat}
* which ships with the Java platform. This is justified by the fact that
* SLF4J's implementation is 10 times faster than that of {@link MessageFormat}.
* This local performance difference is both measurable and significant in the
* larger context of the complete logging processing chain.
*
* <p>
* See also {@link #format(String, Object)},
* {@link #format(String, Object, Object)} and
* {@link #arrayFormat(String, Object[])} methods for more details.
*
* @author Ceki G&uuml;lc&uuml;
* @author Joern Huxhorn
*/
final public class MessageFormatter {
static final char DELIM_START = '{';
static final char DELIM_STOP = '}';
static final String DELIM_STR = "{}";
private static final char ESCAPE_CHAR = '\\';
/**
* Performs single argument substitution for the 'messagePattern' passed as
* parameter.
* <p>
* For example,
*
* <pre>
* MessageFormatter.format(&quot;Hi {}.&quot;, &quot;there&quot;);
* </pre>
* <p>
* will return the string "Hi there.".
* <p>
*
* @param messagePattern The message pattern which will be parsed and formatted
* @param arg The argument to be substituted in place of the formatting anchor
* @return The formatted message
*/
final public static FormattingTuple format(String messagePattern, Object arg) {
return arrayFormat(messagePattern, new Object[]{arg});
}
/**
* Performs a two argument substitution for the 'messagePattern' passed as
* parameter.
* <p>
* For example,
*
* <pre>
* MessageFormatter.format(&quot;Hi {}. My name is {}.&quot;, &quot;Alice&quot;, &quot;Bob&quot;);
* </pre>
* <p>
* will return the string "Hi Alice. My name is Bob.".
*
* @param messagePattern The message pattern which will be parsed and formatted
* @param arg1 The argument to be substituted in place of the first formatting
* anchor
* @param arg2 The argument to be substituted in place of the second formatting
* anchor
* @return The formatted message
*/
final public static FormattingTuple format(final String messagePattern, Object arg1, Object arg2) {
return arrayFormat(messagePattern, new Object[]{arg1, arg2});
}
final public static FormattingTuple arrayFormat(final String messagePattern, final Object[] argArray) {
Throwable throwableCandidate = MessageFormatter.getThrowableCandidate(argArray);
Object[] args = argArray;
if (throwableCandidate != null) {
args = MessageFormatter.trimmedCopy(argArray);
}
return arrayFormat(messagePattern, args, throwableCandidate);
}
final public static FormattingTuple arrayFormat(final String messagePattern, final Object[] argArray, Throwable throwable) {
if (messagePattern == null) {
return new FormattingTuple(null, argArray, throwable);
}
if (argArray == null) {
return new FormattingTuple(messagePattern);
}
int i = 0;
int j;
// use string builder for better multicore performance
StringBuilder sbuf = new StringBuilder(messagePattern.length() + 50);
int L;
for (L = 0; L < argArray.length; L++) {
j = messagePattern.indexOf(DELIM_STR, i);
if (j == -1) {
// no more variables
if (i == 0) { // this is a simple string
return new FormattingTuple(messagePattern, argArray, throwable);
} else { // add the tail string which contains no variables and return
// the result.
sbuf.append(messagePattern, i, messagePattern.length());
return new FormattingTuple(sbuf.toString(), argArray, throwable);
}
} else {
if (isEscapedDelimeter(messagePattern, j)) {
if (!isDoubleEscaped(messagePattern, j)) {
L--; // DELIM_START was escaped, thus should not be incremented
sbuf.append(messagePattern, i, j - 1);
sbuf.append(DELIM_START);
i = j + 1;
} else {
// The escape character preceding the delimiter start is
// itself escaped: "abc x:\\{}"
// we have to consume one backward slash
sbuf.append(messagePattern, i, j - 1);
deeplyAppendParameter(sbuf, argArray[L], new HashMap<Object[], Object>());
i = j + 2;
}
} else {
// normal case
sbuf.append(messagePattern, i, j);
deeplyAppendParameter(sbuf, argArray[L], new HashMap<Object[], Object>());
i = j + 2;
}
}
}
// append the characters following the last {} pair.
sbuf.append(messagePattern, i, messagePattern.length());
return new FormattingTuple(sbuf.toString(), argArray, throwable);
}
final static boolean isEscapedDelimeter(String messagePattern, int delimeterStartIndex) {
if (delimeterStartIndex == 0) {
return false;
}
char potentialEscape = messagePattern.charAt(delimeterStartIndex - 1);
if (potentialEscape == ESCAPE_CHAR) {
return true;
} else {
return false;
}
}
final static boolean isDoubleEscaped(String messagePattern, int delimeterStartIndex) {
if (delimeterStartIndex >= 2 && messagePattern.charAt(delimeterStartIndex - 2) == ESCAPE_CHAR) {
return true;
} else {
return false;
}
}
// special treatment of array values was suggested by 'lizongbo'
private static void deeplyAppendParameter(StringBuilder sbuf, Object o, Map<Object[], Object> seenMap) {
if (o == null) {
sbuf.append("null");
return;
}
if (!o.getClass().isArray()) {
safeObjectAppend(sbuf, o);
} else {
// check for primitive array types because they
// unfortunately cannot be cast to Object[]
if (o instanceof boolean[]) {
booleanArrayAppend(sbuf, (boolean[]) o);
} else if (o instanceof byte[]) {
byteArrayAppend(sbuf, (byte[]) o);
} else if (o instanceof char[]) {
charArrayAppend(sbuf, (char[]) o);
} else if (o instanceof short[]) {
shortArrayAppend(sbuf, (short[]) o);
} else if (o instanceof int[]) {
intArrayAppend(sbuf, (int[]) o);
} else if (o instanceof long[]) {
longArrayAppend(sbuf, (long[]) o);
} else if (o instanceof float[]) {
floatArrayAppend(sbuf, (float[]) o);
} else if (o instanceof double[]) {
doubleArrayAppend(sbuf, (double[]) o);
} else {
objectArrayAppend(sbuf, (Object[]) o, seenMap);
}
}
}
private static void safeObjectAppend(StringBuilder sbuf, Object o) {
try {
String oAsString = o.toString();
sbuf.append(oAsString);
} catch (Throwable t) {
System.err.println("SLF4J: Failed toString() invocation on an object of type [" + o.getClass().getName() + "]");
System.err.println("Reported exception:");
StackTraceElement[] stackTrace = t.getStackTrace();
StringBuilder stackBuilder = new StringBuilder();
for (StackTraceElement traceElement : stackTrace) {
stackBuilder.append("\tat ").append(traceElement).append("\n");
}
System.err.println(stackBuilder);
sbuf.append("[FAILED toString()]");
}
}
private static void objectArrayAppend(StringBuilder sbuf, Object[] a, Map<Object[], Object> seenMap) {
sbuf.append('[');
if (!seenMap.containsKey(a)) {
seenMap.put(a, null);
final int len = a.length;
for (int i = 0; i < len; i++) {
deeplyAppendParameter(sbuf, a[i], seenMap);
if (i != len - 1)
sbuf.append(", ");
}
// allow repeats in siblings
seenMap.remove(a);
} else {
sbuf.append("...");
}
sbuf.append(']');
}
private static void booleanArrayAppend(StringBuilder sbuf, boolean[] a) {
sbuf.append('[');
final int len = a.length;
for (int i = 0; i < len; i++) {
sbuf.append(a[i]);
if (i != len - 1)
sbuf.append(", ");
}
sbuf.append(']');
}
private static void byteArrayAppend(StringBuilder sbuf, byte[] a) {
sbuf.append('[');
final int len = a.length;
for (int i = 0; i < len; i++) {
sbuf.append(a[i]);
if (i != len - 1)
sbuf.append(", ");
}
sbuf.append(']');
}
private static void charArrayAppend(StringBuilder sbuf, char[] a) {
sbuf.append('[');
final int len = a.length;
for (int i = 0; i < len; i++) {
sbuf.append(a[i]);
if (i != len - 1)
sbuf.append(", ");
}
sbuf.append(']');
}
private static void shortArrayAppend(StringBuilder sbuf, short[] a) {
sbuf.append('[');
final int len = a.length;
for (int i = 0; i < len; i++) {
sbuf.append(a[i]);
if (i != len - 1)
sbuf.append(", ");
}
sbuf.append(']');
}
private static void intArrayAppend(StringBuilder sbuf, int[] a) {
sbuf.append('[');
final int len = a.length;
for (int i = 0; i < len; i++) {
sbuf.append(a[i]);
if (i != len - 1)
sbuf.append(", ");
}
sbuf.append(']');
}
private static void longArrayAppend(StringBuilder sbuf, long[] a) {
sbuf.append('[');
final int len = a.length;
for (int i = 0; i < len; i++) {
sbuf.append(a[i]);
if (i != len - 1)
sbuf.append(", ");
}
sbuf.append(']');
}
private static void floatArrayAppend(StringBuilder sbuf, float[] a) {
sbuf.append('[');
final int len = a.length;
for (int i = 0; i < len; i++) {
sbuf.append(a[i]);
if (i != len - 1)
sbuf.append(", ");
}
sbuf.append(']');
}
private static void doubleArrayAppend(StringBuilder sbuf, double[] a) {
sbuf.append('[');
final int len = a.length;
for (int i = 0; i < len; i++) {
sbuf.append(a[i]);
if (i != len - 1)
sbuf.append(", ");
}
sbuf.append(']');
}
/**
* Helper method to determine if an {@link Object} array contains a {@link Throwable} as last element
*
* @param argArray The arguments off which we want to know if it contains a {@link Throwable} as last element
* @return if the last {@link Object} in argArray is a {@link Throwable} this method will return it,
* otherwise it returns null
*/
public static Throwable getThrowableCandidate(final Object[] argArray) {
if (argArray == null || argArray.length == 0) {
return null;
}
final Object lastEntry = argArray[argArray.length - 1];
if (lastEntry instanceof Throwable) {
return (Throwable) lastEntry;
}
return null;
}
/**
* Helper method to get all but the last element of an array
*
* @param argArray The arguments from which we want to remove the last element
* @return a copy of the array without the last element
*/
public static Object[] trimmedCopy(final Object[] argArray) {
if (argArray == null || argArray.length == 0) {
throw new IllegalStateException("non-sensical empty or null argument array");
}
final int trimmedLen = argArray.length - 1;
Object[] trimmed = new Object[trimmedLen];
if (trimmedLen > 0) {
System.arraycopy(argArray, 0, trimmed, 0, trimmedLen);
}
return trimmed;
}
}

View File

@ -19,6 +19,8 @@ package org.apache.dubbo.common.logger.jcl;
import org.apache.dubbo.common.logger.Logger; import org.apache.dubbo.common.logger.Logger;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import org.slf4j.helpers.FormattingTuple;
import org.slf4j.helpers.MessageFormatter;
/** /**
* Adaptor to commons logging, depends on commons-logging.jar. For more information about commons logging, pls. refer to * Adaptor to commons logging, depends on commons-logging.jar. For more information about commons logging, pls. refer to
@ -37,6 +39,12 @@ public class JclLogger implements Logger {
logger.trace(msg); logger.trace(msg);
} }
@Override
public void trace(String msg, Object... arguments) {
FormattingTuple ft = MessageFormatter.arrayFormat(msg, arguments);
logger.trace(ft.getMessage(), ft.getThrowable());
}
@Override @Override
public void trace(Throwable e) { public void trace(Throwable e) {
logger.trace(e); logger.trace(e);
@ -52,6 +60,12 @@ public class JclLogger implements Logger {
logger.debug(msg); logger.debug(msg);
} }
@Override
public void debug(String msg, Object... arguments) {
FormattingTuple ft = MessageFormatter.arrayFormat(msg, arguments);
logger.debug(ft.getMessage(), ft.getThrowable());
}
@Override @Override
public void debug(Throwable e) { public void debug(Throwable e) {
logger.debug(e); logger.debug(e);
@ -67,6 +81,12 @@ public class JclLogger implements Logger {
logger.info(msg); logger.info(msg);
} }
@Override
public void info(String msg, Object... arguments) {
FormattingTuple ft = MessageFormatter.arrayFormat(msg, arguments);
logger.info(ft.getMessage(), ft.getThrowable());
}
@Override @Override
public void info(Throwable e) { public void info(Throwable e) {
logger.info(e); logger.info(e);
@ -82,6 +102,12 @@ public class JclLogger implements Logger {
logger.warn(msg); logger.warn(msg);
} }
@Override
public void warn(String msg, Object... arguments) {
FormattingTuple ft = MessageFormatter.arrayFormat(msg, arguments);
logger.warn(ft.getMessage(), ft.getThrowable());
}
@Override @Override
public void warn(Throwable e) { public void warn(Throwable e) {
logger.warn(e); logger.warn(e);
@ -97,6 +123,12 @@ public class JclLogger implements Logger {
logger.error(msg); logger.error(msg);
} }
@Override
public void error(String msg, Object... arguments) {
FormattingTuple ft = MessageFormatter.arrayFormat(msg, arguments);
logger.error(ft.getMessage(), ft.getThrowable());
}
@Override @Override
public void error(Throwable e) { public void error(Throwable e) {
logger.error(e); logger.error(e);

View File

@ -20,6 +20,9 @@ import org.apache.dubbo.common.logger.Logger;
import java.util.logging.Level; import java.util.logging.Level;
import org.slf4j.helpers.FormattingTuple;
import org.slf4j.helpers.MessageFormatter;
public class JdkLogger implements Logger { public class JdkLogger implements Logger {
private final java.util.logging.Logger logger; private final java.util.logging.Logger logger;
@ -33,6 +36,12 @@ public class JdkLogger implements Logger {
logger.log(Level.FINER, msg); logger.log(Level.FINER, msg);
} }
@Override
public void trace(String msg, Object... arguments) {
FormattingTuple ft = MessageFormatter.arrayFormat(msg, arguments);
logger.log(Level.FINER, ft.getMessage(), ft.getThrowable());
}
@Override @Override
public void trace(Throwable e) { public void trace(Throwable e) {
logger.log(Level.FINER, e.getMessage(), e); logger.log(Level.FINER, e.getMessage(), e);
@ -48,6 +57,12 @@ public class JdkLogger implements Logger {
logger.log(Level.FINE, msg); logger.log(Level.FINE, msg);
} }
@Override
public void debug(String msg, Object... arguments) {
FormattingTuple ft = MessageFormatter.arrayFormat(msg, arguments);
logger.log(Level.FINE, ft.getMessage(), ft.getThrowable());
}
@Override @Override
public void debug(Throwable e) { public void debug(Throwable e) {
logger.log(Level.FINE, e.getMessage(), e); logger.log(Level.FINE, e.getMessage(), e);
@ -63,6 +78,12 @@ public class JdkLogger implements Logger {
logger.log(Level.INFO, msg); logger.log(Level.INFO, msg);
} }
@Override
public void info(String msg, Object... arguments) {
FormattingTuple ft = MessageFormatter.arrayFormat(msg, arguments);
logger.log(Level.INFO, ft.getMessage(), ft.getThrowable());
}
@Override @Override
public void info(String msg, Throwable e) { public void info(String msg, Throwable e) {
logger.log(Level.INFO, msg, e); logger.log(Level.INFO, msg, e);
@ -73,6 +94,12 @@ public class JdkLogger implements Logger {
logger.log(Level.WARNING, msg); logger.log(Level.WARNING, msg);
} }
@Override
public void warn(String msg, Object... arguments) {
FormattingTuple ft = MessageFormatter.arrayFormat(msg, arguments);
logger.log(Level.WARNING, ft.getMessage(), ft.getThrowable());
}
@Override @Override
public void warn(String msg, Throwable e) { public void warn(String msg, Throwable e) {
logger.log(Level.WARNING, msg, e); logger.log(Level.WARNING, msg, e);
@ -83,6 +110,12 @@ public class JdkLogger implements Logger {
logger.log(Level.SEVERE, msg); logger.log(Level.SEVERE, msg);
} }
@Override
public void error(String msg, Object... arguments) {
FormattingTuple ft = MessageFormatter.arrayFormat(msg, arguments);
logger.log(Level.SEVERE, ft.getMessage(), ft.getThrowable());
}
@Override @Override
public void error(String msg, Throwable e) { public void error(String msg, Throwable e) {
logger.log(Level.SEVERE, msg, e); logger.log(Level.SEVERE, msg, e);

View File

@ -20,6 +20,8 @@ import org.apache.dubbo.common.logger.Logger;
import org.apache.dubbo.common.logger.support.FailsafeLogger; import org.apache.dubbo.common.logger.support.FailsafeLogger;
import org.apache.log4j.Level; import org.apache.log4j.Level;
import org.slf4j.helpers.FormattingTuple;
import org.slf4j.helpers.MessageFormatter;
public class Log4jLogger implements Logger { public class Log4jLogger implements Logger {
@ -36,6 +38,12 @@ public class Log4jLogger implements Logger {
logger.log(FQCN, Level.TRACE, msg, null); logger.log(FQCN, Level.TRACE, msg, null);
} }
@Override
public void trace(String msg, Object... arguments) {
FormattingTuple ft = MessageFormatter.arrayFormat(msg, arguments);
logger.log(FQCN, Level.TRACE, ft.getMessage(), ft.getThrowable());
}
@Override @Override
public void trace(Throwable e) { public void trace(Throwable e) {
logger.log(FQCN, Level.TRACE, e == null ? null : e.getMessage(), e); logger.log(FQCN, Level.TRACE, e == null ? null : e.getMessage(), e);
@ -51,6 +59,12 @@ public class Log4jLogger implements Logger {
logger.log(FQCN, Level.DEBUG, msg, null); logger.log(FQCN, Level.DEBUG, msg, null);
} }
@Override
public void debug(String msg, Object... arguments) {
FormattingTuple ft = MessageFormatter.arrayFormat(msg, arguments);
logger.log(FQCN, Level.DEBUG, ft.getMessage(), ft.getThrowable());
}
@Override @Override
public void debug(Throwable e) { public void debug(Throwable e) {
logger.log(FQCN, Level.DEBUG, e == null ? null : e.getMessage(), e); logger.log(FQCN, Level.DEBUG, e == null ? null : e.getMessage(), e);
@ -66,6 +80,12 @@ public class Log4jLogger implements Logger {
logger.log(FQCN, Level.INFO, msg, null); logger.log(FQCN, Level.INFO, msg, null);
} }
@Override
public void info(String msg, Object... arguments) {
FormattingTuple ft = MessageFormatter.arrayFormat(msg, arguments);
logger.log(FQCN, Level.INFO, ft.getMessage(), ft.getThrowable());
}
@Override @Override
public void info(Throwable e) { public void info(Throwable e) {
logger.log(FQCN, Level.INFO, e == null ? null : e.getMessage(), e); logger.log(FQCN, Level.INFO, e == null ? null : e.getMessage(), e);
@ -81,6 +101,12 @@ public class Log4jLogger implements Logger {
logger.log(FQCN, Level.WARN, msg, null); logger.log(FQCN, Level.WARN, msg, null);
} }
@Override
public void warn(String msg, Object... arguments) {
FormattingTuple ft = MessageFormatter.arrayFormat(msg, arguments);
logger.log(FQCN, Level.WARN, ft.getMessage(), ft.getThrowable());
}
@Override @Override
public void warn(Throwable e) { public void warn(Throwable e) {
logger.log(FQCN, Level.WARN, e == null ? null : e.getMessage(), e); logger.log(FQCN, Level.WARN, e == null ? null : e.getMessage(), e);
@ -96,6 +122,12 @@ public class Log4jLogger implements Logger {
logger.log(FQCN, Level.ERROR, msg, null); logger.log(FQCN, Level.ERROR, msg, null);
} }
@Override
public void error(String msg, Object... arguments) {
FormattingTuple ft = MessageFormatter.arrayFormat(msg, arguments);
logger.log(FQCN, Level.ERROR, ft.getMessage(), ft.getThrowable());
}
@Override @Override
public void error(Throwable e) { public void error(Throwable e) {
logger.log(FQCN, Level.ERROR, e == null ? null : e.getMessage(), e); logger.log(FQCN, Level.ERROR, e == null ? null : e.getMessage(), e);
@ -130,9 +162,4 @@ public class Log4jLogger implements Logger {
public boolean isErrorEnabled() { public boolean isErrorEnabled() {
return logger.isEnabledFor(Level.ERROR); return logger.isEnabledFor(Level.ERROR);
} }
// test purpose only
public org.apache.log4j.Logger getLogger() {
return logger;
}
} }

View File

@ -31,6 +31,11 @@ public class Log4j2Logger implements Logger {
logger.trace(msg); logger.trace(msg);
} }
@Override
public void trace(String msg, Object... arguments) {
logger.trace(msg, arguments);
}
@Override @Override
public void trace(Throwable e) { public void trace(Throwable e) {
logger.trace(e == null ? null : e.getMessage(), e); logger.trace(e == null ? null : e.getMessage(), e);
@ -46,6 +51,11 @@ public class Log4j2Logger implements Logger {
logger.debug(msg); logger.debug(msg);
} }
@Override
public void debug(String msg, Object... arguments) {
logger.debug(msg, arguments);
}
@Override @Override
public void debug(Throwable e) { public void debug(Throwable e) {
logger.debug(e == null ? null : e.getMessage(), e); logger.debug(e == null ? null : e.getMessage(), e);
@ -61,6 +71,11 @@ public class Log4j2Logger implements Logger {
logger.info(msg); logger.info(msg);
} }
@Override
public void info(String msg, Object... arguments) {
logger.info(msg, arguments);
}
@Override @Override
public void info(Throwable e) { public void info(Throwable e) {
logger.info(e == null ? null : e.getMessage(), e); logger.info(e == null ? null : e.getMessage(), e);
@ -76,6 +91,11 @@ public class Log4j2Logger implements Logger {
logger.warn(msg); logger.warn(msg);
} }
@Override
public void warn(String msg, Object... arguments) {
logger.warn(msg, arguments);
}
@Override @Override
public void warn(Throwable e) { public void warn(Throwable e) {
logger.warn(e == null ? null : e.getMessage(), e); logger.warn(e == null ? null : e.getMessage(), e);
@ -91,6 +111,11 @@ public class Log4j2Logger implements Logger {
logger.error(msg); logger.error(msg);
} }
@Override
public void error(String msg, Object... arguments) {
logger.error(msg, arguments);
}
@Override @Override
public void error(Throwable e) { public void error(Throwable e) {
logger.error(e == null ? null : e.getMessage(), e); logger.error(e == null ? null : e.getMessage(), e);
@ -125,4 +150,9 @@ public class Log4j2Logger implements Logger {
public boolean isErrorEnabled() { public boolean isErrorEnabled() {
return logger.isErrorEnabled(); return logger.isErrorEnabled();
} }
// test purpose only
public org.apache.logging.log4j.Logger getLogger() {
return logger;
}
} }

View File

@ -20,6 +20,8 @@ import org.apache.dubbo.common.logger.Level;
import org.apache.dubbo.common.logger.Logger; import org.apache.dubbo.common.logger.Logger;
import org.apache.dubbo.common.logger.support.FailsafeLogger; import org.apache.dubbo.common.logger.support.FailsafeLogger;
import org.slf4j.helpers.FormattingTuple;
import org.slf4j.helpers.MessageFormatter;
import org.slf4j.spi.LocationAwareLogger; import org.slf4j.spi.LocationAwareLogger;
public class Slf4jLogger implements Logger { public class Slf4jLogger implements Logger {
@ -48,6 +50,17 @@ public class Slf4jLogger implements Logger {
logger.trace(msg); logger.trace(msg);
} }
@Override
public void trace(String msg, Object... arguments) {
if (locationAwareLogger != null) {
FormattingTuple ft = MessageFormatter.arrayFormat(msg, arguments);
locationAwareLogger.log(
null, FQCN, LocationAwareLogger.TRACE_INT, msg, ft.getArgArray(), ft.getThrowable());
return;
}
logger.trace(msg, arguments);
}
@Override @Override
public void trace(Throwable e) { public void trace(Throwable e) {
if (locationAwareLogger != null) { if (locationAwareLogger != null) {
@ -75,6 +88,17 @@ public class Slf4jLogger implements Logger {
logger.debug(msg); logger.debug(msg);
} }
@Override
public void debug(String msg, Object... arguments) {
if (locationAwareLogger != null) {
FormattingTuple ft = MessageFormatter.arrayFormat(msg, arguments);
locationAwareLogger.log(
null, FQCN, LocationAwareLogger.DEBUG_INT, msg, ft.getArgArray(), ft.getThrowable());
return;
}
logger.debug(msg, arguments);
}
@Override @Override
public void debug(Throwable e) { public void debug(Throwable e) {
if (locationAwareLogger != null) { if (locationAwareLogger != null) {
@ -102,6 +126,16 @@ public class Slf4jLogger implements Logger {
logger.info(msg); logger.info(msg);
} }
@Override
public void info(String msg, Object... arguments) {
if (locationAwareLogger != null) {
FormattingTuple ft = MessageFormatter.arrayFormat(msg, arguments);
locationAwareLogger.log(null, FQCN, LocationAwareLogger.INFO_INT, msg, ft.getArgArray(), ft.getThrowable());
return;
}
logger.info(msg, arguments);
}
@Override @Override
public void info(Throwable e) { public void info(Throwable e) {
if (locationAwareLogger != null) { if (locationAwareLogger != null) {
@ -129,6 +163,16 @@ public class Slf4jLogger implements Logger {
logger.warn(msg); logger.warn(msg);
} }
@Override
public void warn(String msg, Object... arguments) {
if (locationAwareLogger != null) {
FormattingTuple ft = MessageFormatter.arrayFormat(msg, arguments);
locationAwareLogger.log(null, FQCN, LocationAwareLogger.WARN_INT, msg, ft.getArgArray(), ft.getThrowable());
return;
}
logger.warn(msg, arguments);
}
@Override @Override
public void warn(Throwable e) { public void warn(Throwable e) {
if (locationAwareLogger != null) { if (locationAwareLogger != null) {
@ -156,6 +200,17 @@ public class Slf4jLogger implements Logger {
logger.error(msg); logger.error(msg);
} }
@Override
public void error(String msg, Object... arguments) {
if (locationAwareLogger != null) {
FormattingTuple ft = MessageFormatter.arrayFormat(msg, arguments);
locationAwareLogger.log(
null, FQCN, LocationAwareLogger.ERROR_INT, msg, ft.getArgArray(), ft.getThrowable());
return;
}
logger.error(msg, arguments);
}
@Override @Override
public void error(Throwable e) { public void error(Throwable e) {
if (locationAwareLogger != null) { if (locationAwareLogger != null) {

View File

@ -17,16 +17,22 @@
package org.apache.dubbo.common.logger.support; package org.apache.dubbo.common.logger.support;
import org.apache.dubbo.common.Version; import org.apache.dubbo.common.Version;
import org.apache.dubbo.common.logger.ErrorTypeAwareLogger; import org.apache.dubbo.common.logger.ListenableLogger;
import org.apache.dubbo.common.logger.LogListener;
import org.apache.dubbo.common.logger.Logger; import org.apache.dubbo.common.logger.Logger;
import org.apache.dubbo.common.utils.NetUtils; import org.apache.dubbo.common.utils.NetUtils;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
import java.util.concurrent.atomic.AtomicReference;
import java.util.regex.Pattern; import java.util.regex.Pattern;
/** /**
* A fail-safe (ignoring exception thrown by logger) wrapper of error type aware logger. * A fail-safe (ignoring exception thrown by logger) wrapper of error type aware logger.
*/ */
public class FailsafeErrorTypeAwareLogger extends FailsafeLogger implements ErrorTypeAwareLogger { public class FailsafeErrorTypeAwareLogger extends FailsafeLogger implements ListenableLogger {
/** /**
* Template address for formatting. * Template address for formatting.
@ -35,6 +41,16 @@ public class FailsafeErrorTypeAwareLogger extends FailsafeLogger implements Erro
private static final Pattern ERROR_CODE_PATTERN = Pattern.compile("\\d+-\\d+"); private static final Pattern ERROR_CODE_PATTERN = Pattern.compile("\\d+-\\d+");
/**
* Listeners that listened to all Loggers.
*/
private static final List<LogListener> GLOBAL_LISTENERS = Collections.synchronizedList(new ArrayList<>());
/**
* Listeners that listened to this listener.
*/
private final AtomicReference<List<LogListener>> listeners = new AtomicReference<>();
public FailsafeErrorTypeAwareLogger(Logger logger) { public FailsafeErrorTypeAwareLogger(Logger logger) {
super(logger); super(logger);
} }
@ -81,6 +97,7 @@ public class FailsafeErrorTypeAwareLogger extends FailsafeLogger implements Erro
} }
try { try {
onEvent(code, msg);
getLogger().warn(appendContextMessageWithInstructions(code, cause, extendedInformation, msg)); getLogger().warn(appendContextMessageWithInstructions(code, cause, extendedInformation, msg));
} catch (Throwable t) { } catch (Throwable t) {
// ignored. // ignored.
@ -94,6 +111,7 @@ public class FailsafeErrorTypeAwareLogger extends FailsafeLogger implements Erro
} }
try { try {
onEvent(code, msg);
getLogger().warn(appendContextMessageWithInstructions(code, cause, extendedInformation, msg), e); getLogger().warn(appendContextMessageWithInstructions(code, cause, extendedInformation, msg), e);
} catch (Throwable t) { } catch (Throwable t) {
// ignored. // ignored.
@ -107,6 +125,7 @@ public class FailsafeErrorTypeAwareLogger extends FailsafeLogger implements Erro
} }
try { try {
onEvent(code, msg);
getLogger().error(appendContextMessageWithInstructions(code, cause, extendedInformation, msg)); getLogger().error(appendContextMessageWithInstructions(code, cause, extendedInformation, msg));
} catch (Throwable t) { } catch (Throwable t) {
// ignored. // ignored.
@ -120,9 +139,44 @@ public class FailsafeErrorTypeAwareLogger extends FailsafeLogger implements Erro
} }
try { try {
onEvent(code, msg);
getLogger().error(appendContextMessageWithInstructions(code, cause, extendedInformation, msg), e); getLogger().error(appendContextMessageWithInstructions(code, cause, extendedInformation, msg), e);
} catch (Throwable t) { } catch (Throwable t) {
// ignored. // ignored.
} }
} }
public static void registerGlobalListen(LogListener listener) {
GLOBAL_LISTENERS.add(listener);
}
@Override
public void registerListen(LogListener listener) {
listeners.getAndUpdate(logListeners -> {
if (logListeners == null) {
logListeners = Collections.synchronizedList(new ArrayList<>());
}
logListeners.add(listener);
return logListeners;
});
}
private void onEvent(String code, String msg) {
Optional.ofNullable(listeners.get())
.ifPresent(logListeners -> logListeners.forEach(logListener -> {
try {
logListener.onMessage(code, msg);
} catch (Exception e) {
// ignored.
}
}));
GLOBAL_LISTENERS.forEach(logListener -> {
try {
logListener.onMessage(code, msg);
} catch (Exception e) {
// ignored.
}
});
}
} }

View File

@ -84,6 +84,17 @@ public class FailsafeLogger implements Logger {
} }
} }
@Override
public void trace(String msg, Object... arguments) {
if (disabled) {
return;
}
try {
logger.trace(appendContextMessage(msg), arguments);
} catch (Throwable t) {
}
}
@Override @Override
public void debug(String msg, Throwable e) { public void debug(String msg, Throwable e) {
if (disabled) { if (disabled) {
@ -117,6 +128,17 @@ public class FailsafeLogger implements Logger {
} }
} }
@Override
public void debug(String msg, Object... arguments) {
if (disabled) {
return;
}
try {
logger.debug(appendContextMessage(msg), arguments);
} catch (Throwable t) {
}
}
@Override @Override
public void info(String msg, Throwable e) { public void info(String msg, Throwable e) {
if (disabled) { if (disabled) {
@ -139,6 +161,17 @@ public class FailsafeLogger implements Logger {
} }
} }
@Override
public void info(String msg, Object... arguments) {
if (disabled) {
return;
}
try {
logger.info(appendContextMessage(msg), arguments);
} catch (Throwable t) {
}
}
@Override @Override
public void warn(String msg, Throwable e) { public void warn(String msg, Throwable e) {
if (disabled) { if (disabled) {
@ -161,6 +194,17 @@ public class FailsafeLogger implements Logger {
} }
} }
@Override
public void warn(String msg, Object... arguments) {
if (disabled) {
return;
}
try {
logger.warn(appendContextMessage(msg), arguments);
} catch (Throwable t) {
}
}
@Override @Override
public void error(String msg, Throwable e) { public void error(String msg, Throwable e) {
if (disabled) { if (disabled) {
@ -183,6 +227,17 @@ public class FailsafeLogger implements Logger {
} }
} }
@Override
public void error(String msg, Object... arguments) {
if (disabled) {
return;
}
try {
logger.error(appendContextMessage(msg), arguments);
} catch (Throwable t) {
}
}
@Override @Override
public void error(Throwable e) { public void error(Throwable e) {
if (disabled) { if (disabled) {

View File

@ -17,6 +17,7 @@
package org.apache.dubbo.common.threadpool.support; package org.apache.dubbo.common.threadpool.support;
import org.apache.dubbo.common.URL; import org.apache.dubbo.common.URL;
import org.apache.dubbo.common.constants.CommonConstants;
import org.apache.dubbo.common.extension.ExtensionLoader; import org.apache.dubbo.common.extension.ExtensionLoader;
import org.apache.dubbo.common.logger.ErrorTypeAwareLogger; import org.apache.dubbo.common.logger.ErrorTypeAwareLogger;
import org.apache.dubbo.common.logger.LoggerFactory; import org.apache.dubbo.common.logger.LoggerFactory;
@ -25,6 +26,7 @@ import org.apache.dubbo.common.threadpool.event.ThreadPoolExhaustedListener;
import org.apache.dubbo.common.utils.ConcurrentHashSet; import org.apache.dubbo.common.utils.ConcurrentHashSet;
import org.apache.dubbo.common.utils.JVMUtil; import org.apache.dubbo.common.utils.JVMUtil;
import org.apache.dubbo.common.utils.StringUtils; import org.apache.dubbo.common.utils.StringUtils;
import org.apache.dubbo.common.utils.SystemPropertyConfigUtils;
import org.apache.dubbo.rpc.model.FrameworkModel; import org.apache.dubbo.rpc.model.FrameworkModel;
import java.io.File; import java.io.File;
@ -42,8 +44,8 @@ import static java.lang.String.format;
import static org.apache.dubbo.common.constants.CommonConstants.COMMA_SEPARATOR_CHAR; import static org.apache.dubbo.common.constants.CommonConstants.COMMA_SEPARATOR_CHAR;
import static org.apache.dubbo.common.constants.CommonConstants.DUMP_DIRECTORY; import static org.apache.dubbo.common.constants.CommonConstants.DUMP_DIRECTORY;
import static org.apache.dubbo.common.constants.CommonConstants.DUMP_ENABLE; import static org.apache.dubbo.common.constants.CommonConstants.DUMP_ENABLE;
import static org.apache.dubbo.common.constants.CommonConstants.OS_NAME_KEY;
import static org.apache.dubbo.common.constants.CommonConstants.OS_WIN_PREFIX; import static org.apache.dubbo.common.constants.CommonConstants.OS_WIN_PREFIX;
import static org.apache.dubbo.common.constants.CommonConstants.SystemProperty.SYSTEM_OS_NAME;
import static org.apache.dubbo.common.constants.CommonConstants.THREAD_POOL_EXHAUSTED_LISTENERS_KEY; import static org.apache.dubbo.common.constants.CommonConstants.THREAD_POOL_EXHAUSTED_LISTENERS_KEY;
import static org.apache.dubbo.common.constants.LoggerCodeConstants.COMMON_THREAD_POOL_EXHAUSTED; import static org.apache.dubbo.common.constants.LoggerCodeConstants.COMMON_THREAD_POOL_EXHAUSTED;
import static org.apache.dubbo.common.constants.LoggerCodeConstants.COMMON_UNEXPECTED_CREATE_DUMP; import static org.apache.dubbo.common.constants.LoggerCodeConstants.COMMON_UNEXPECTED_CREATE_DUMP;
@ -71,7 +73,8 @@ public class AbortPolicyWithReport extends ThreadPoolExecutor.AbortPolicy {
protected static Semaphore guard = new Semaphore(1); protected static Semaphore guard = new Semaphore(1);
private static final String USER_HOME = System.getProperty("user.home"); private static final String USER_HOME =
SystemPropertyConfigUtils.getSystemProperty(CommonConstants.SystemProperty.USER_HOME);
private final Set<ThreadPoolExhaustedListener> listeners = new ConcurrentHashSet<>(); private final Set<ThreadPoolExhaustedListener> listeners = new ConcurrentHashSet<>();
@ -168,7 +171,8 @@ public class AbortPolicyWithReport extends ThreadPoolExecutor.AbortPolicy {
SimpleDateFormat sdf; SimpleDateFormat sdf;
String os = System.getProperty(OS_NAME_KEY).toLowerCase(); String os = SystemPropertyConfigUtils.getSystemProperty(SYSTEM_OS_NAME)
.toLowerCase();
// window system don't support ":" in file name // window system don't support ":" in file name
if (os.contains(OS_WIN_PREFIX)) { if (os.contains(OS_WIN_PREFIX)) {

View File

@ -19,6 +19,7 @@ package org.apache.dubbo.common.timer;
import org.apache.dubbo.common.logger.ErrorTypeAwareLogger; import org.apache.dubbo.common.logger.ErrorTypeAwareLogger;
import org.apache.dubbo.common.logger.LoggerFactory; import org.apache.dubbo.common.logger.LoggerFactory;
import org.apache.dubbo.common.utils.ClassUtils; import org.apache.dubbo.common.utils.ClassUtils;
import org.apache.dubbo.common.utils.SystemPropertyConfigUtils;
import java.util.Collections; import java.util.Collections;
import java.util.HashSet; import java.util.HashSet;
@ -36,7 +37,7 @@ import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicIntegerFieldUpdater; import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.atomic.AtomicLong;
import static org.apache.dubbo.common.constants.CommonConstants.OS_NAME_KEY; import static org.apache.dubbo.common.constants.CommonConstants.SystemProperty.SYSTEM_OS_NAME;
import static org.apache.dubbo.common.constants.CommonConstants.OS_WIN_PREFIX; import static org.apache.dubbo.common.constants.CommonConstants.OS_WIN_PREFIX;
import static org.apache.dubbo.common.constants.LoggerCodeConstants.COMMON_ERROR_RUN_THREAD_TASK; import static org.apache.dubbo.common.constants.LoggerCodeConstants.COMMON_ERROR_RUN_THREAD_TASK;
import static org.apache.dubbo.common.constants.LoggerCodeConstants.COMMON_ERROR_TOO_MANY_INSTANCES; import static org.apache.dubbo.common.constants.LoggerCodeConstants.COMMON_ERROR_TOO_MANY_INSTANCES;
@ -811,7 +812,7 @@ public class HashedWheelTimer implements Timer {
} }
} }
private static final boolean IS_OS_WINDOWS = System.getProperty(OS_NAME_KEY, "").toLowerCase(Locale.US).contains(OS_WIN_PREFIX); private static final boolean IS_OS_WINDOWS = SystemPropertyConfigUtils.getSystemProperty(SYSTEM_OS_NAME, "").toLowerCase(Locale.US).contains(OS_WIN_PREFIX);
private boolean isWindows() { private boolean isWindows() {
return IS_OS_WINDOWS; return IS_OS_WINDOWS;

View File

@ -132,6 +132,38 @@ public interface AnnotationUtils {
return getAttribute(annotation, "value"); return getAttribute(annotation, "value");
} }
/**
* Get the attribute from the specified {@link Annotation annotation}
*
* @param annotation the specified {@link Annotation annotation}
* @param attributeNames the multiply attribute name arrays
* @param <T> the type of attribute
* @return the attribute value
* @throws IllegalArgumentException If the attribute name can't be found
*/
static <T> T getAttribute(Annotation annotation, String... attributeNames) throws IllegalArgumentException {
if (attributeNames == null || attributeNames.length == 0) {
return null;
}
for (String attributeName : attributeNames) {
T attribute = getAttribute(annotation, attributeName);
if (attribute == null) {
continue;
}
// exclude string attribute default is empty
if ((attribute instanceof String) && ((String) attribute).length() == 0) {
continue;
}
return attribute;
}
return null;
}
/** /**
* Get the {@link Annotation} from the specified {@link AnnotatedElement the annotated element} and * Get the {@link Annotation} from the specified {@link AnnotatedElement the annotated element} and
* {@link Annotation annotation} class name * {@link Annotation annotation} class name

View File

@ -76,4 +76,8 @@ public final class ArrayUtils {
public static <T> T[] of(T... values) { public static <T> T[] of(T... values) {
return values; return values;
} }
public static <T> T first(T[] data) {
return isEmpty(data) ? null : data[0];
}
} }

View File

@ -28,6 +28,12 @@ public abstract class Assert {
} }
} }
public static void notNull(Object obj, String format, Object... args) {
if (obj == null) {
throw new IllegalArgumentException(String.format(format, args));
}
}
public static void notEmptyString(String str, String message) { public static void notEmptyString(String str, String message) {
if (StringUtils.isEmpty(str)) { if (StringUtils.isEmpty(str)) {
throw new IllegalArgumentException(message); throw new IllegalArgumentException(message);

View File

@ -16,6 +16,7 @@
*/ */
package org.apache.dubbo.common.utils; package org.apache.dubbo.common.utils;
import org.apache.dubbo.common.aot.NativeDetector;
import org.apache.dubbo.common.logger.ErrorTypeAwareLogger; import org.apache.dubbo.common.logger.ErrorTypeAwareLogger;
import org.apache.dubbo.common.logger.LoggerFactory; import org.apache.dubbo.common.logger.LoggerFactory;
import org.apache.dubbo.common.resource.GlobalResourcesRepository; import org.apache.dubbo.common.resource.GlobalResourcesRepository;
@ -80,7 +81,7 @@ public class ClassLoaderResourceLoader {
Enumeration<URL> urls; Enumeration<URL> urls;
try { try {
urls = currentClassLoader.getResources(fileName); urls = currentClassLoader.getResources(fileName);
boolean isNative = NativeUtils.isNative(); boolean isNative = NativeDetector.inNativeImage();
if (urls != null) { if (urls != null) {
while (urls.hasMoreElements()) { while (urls.hasMoreElements()) {
URL url = urls.nextElement(); URL url = urls.nextElement();

View File

@ -214,6 +214,19 @@ public class ClassUtils {
return forName(name, getClassLoader()); return forName(name, getClassLoader());
} }
/**
* find class and don`t expect to throw exception
* @param name
* @return
*/
public static Class<?> forNameAndTryCatch(String name) {
try {
return forName(name, getClassLoader());
} catch (Throwable e) {
return null;
}
}
/** /**
* Replacement for <code>Class.forName()</code> that also returns Class * Replacement for <code>Class.forName()</code> that also returns Class
* instances for primitives (like "int") and array class names (like * instances for primitives (like "int") and array class names (like
@ -314,6 +327,10 @@ public class ClassUtils {
return type != null && (type.isPrimitive() || isSimpleType(type)); return type != null && (type.isPrimitive() || isSimpleType(type));
} }
public static boolean isPrimitiveWrapper(Class<?> type) {
return PRIMITIVE_WRAPPER_TYPE_MAP.containsKey(type);
}
/** /**
* The specified type is simple type or not * The specified type is simple type or not
* *

View File

@ -24,11 +24,14 @@ import java.util.Collections;
import java.util.Comparator; import java.util.Comparator;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet; import java.util.LinkedHashSet;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.TreeSet; import java.util.TreeSet;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static java.util.Collections.emptySet; import static java.util.Collections.emptySet;
@ -404,13 +407,19 @@ public class CollectionUtils {
return null; return null;
} }
if (values instanceof List) { if (values instanceof List) {
List<T> list = (List<T>) values; return ((List<T>) values).get(0);
return list.get(0);
} else { } else {
return values.iterator().next(); return values.iterator().next();
} }
} }
public static <T> T first(List<T> values) {
if (isEmpty(values)) {
return null;
}
return values.get(0);
}
public static <T> Set<T> toTreeSet(Set<T> set) { public static <T> Set<T> toTreeSet(Set<T> set) {
if (isEmpty(set)) { if (isEmpty(set)) {
return set; return set;
@ -420,4 +429,78 @@ public class CollectionUtils {
} }
return set; return set;
} }
public static <T> Set<T> newHashSet(int expectedSize) {
return new HashSet<>(capacity(expectedSize));
}
public static <T> Set<T> newLinkedHashSet(int expectedSize) {
return new LinkedHashSet<>(capacity(expectedSize));
}
public static <T, K> Map<K, T> newHashMap(int expectedSize) {
return new HashMap<>(capacity(expectedSize));
}
public static <T, K> Map<K, T> newLinkedHashMap(int expectedSize) {
return new LinkedHashMap<>(capacity(expectedSize));
}
public static <T, K> Map<K, T> newConcurrentHashMap(int expectedSize) {
if (JRE.JAVA_8.isCurrentVersion()) {
return new SafeConcurrentHashMap<>(capacity(expectedSize));
}
return new ConcurrentHashMap<>(capacity(expectedSize));
}
public static <T, K> Map<K, T> newConcurrentHashMap() {
if (JRE.JAVA_8.isCurrentVersion()) {
return new SafeConcurrentHashMap<>();
}
return new ConcurrentHashMap<>();
}
public static int capacity(int expectedSize) {
if (expectedSize < 3) {
if (expectedSize < 0) {
throw new IllegalArgumentException("expectedSize cannot be negative but was: " + expectedSize);
}
return expectedSize + 1;
}
if (expectedSize < 1 << (Integer.SIZE - 2)) {
return (int) (expectedSize / 0.75F + 1.0F);
}
return Integer.MAX_VALUE;
}
public static class SafeConcurrentHashMap<K, V> extends ConcurrentHashMap<K, V> {
private static final long serialVersionUID = 1L;
public SafeConcurrentHashMap() {}
public SafeConcurrentHashMap(int initialCapacity) {
super(initialCapacity);
}
public SafeConcurrentHashMap(Map<? extends K, ? extends V> m) {
super(m);
}
@Override
public V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction) {
V value = get(key);
if (value != null) {
return value;
}
value = mappingFunction.apply(key);
if (value == null) {
return null;
}
V exists = putIfAbsent(key, value);
if (exists != null) {
return exists;
}
return value;
}
}
} }

View File

@ -164,9 +164,9 @@ public class ConfigUtils {
* @return * @return
*/ */
public static Properties getProperties(Set<ClassLoader> classLoaders) { public static Properties getProperties(Set<ClassLoader> classLoaders) {
String path = System.getProperty(CommonConstants.DUBBO_PROPERTIES_KEY); String path = SystemPropertyConfigUtils.getSystemProperty(CommonConstants.DubboProperty.DUBBO_PROPERTIES_KEY);
if (StringUtils.isEmpty(path)) { if (StringUtils.isEmpty(path)) {
path = System.getenv(CommonConstants.DUBBO_PROPERTIES_KEY); path = System.getenv(CommonConstants.DubboProperty.DUBBO_PROPERTIES_KEY);
if (StringUtils.isEmpty(path)) { if (StringUtils.isEmpty(path)) {
path = CommonConstants.DEFAULT_DUBBO_PROPERTIES; path = CommonConstants.DEFAULT_DUBBO_PROPERTIES;
} }

View File

@ -0,0 +1,259 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.dubbo.common.utils;
import java.time.Instant;
import java.time.LocalDate;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoField;
import java.time.temporal.TemporalAccessor;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.TimeZone;
import java.util.concurrent.CopyOnWriteArrayList;
public final class DateUtils {
public static final ZoneId GMT = ZoneId.of("GMT");
public static final ZoneId UTC = ZoneId.of("UTC");
public static final String DATE = "yyyy-MM-dd";
public static final String DATE_MIN = "yyyy-MM-dd HH:mm";
public static final String DATE_TIME = "yyyy-MM-dd HH:mm:ss";
public static final String JDK_TIME = "EEE MMM dd HH:mm:ss zzz yyyy";
public static final String ASC_TIME = "EEE MMM d HH:mm:ss yyyy";
public static final String RFC1036 = "EEE, dd-MMM-yy HH:mm:ss zzz";
public static final DateTimeFormatter DATE_FORMAT = DateTimeFormatter.ofPattern(DATE);
public static final DateTimeFormatter DATE_MIN_FORMAT = DateTimeFormatter.ofPattern(DATE_MIN);
public static final DateTimeFormatter DATE_TIME_FORMAT = DateTimeFormatter.ofPattern(DATE_TIME);
public static final DateTimeFormatter JDK_TIME_FORMAT = DateTimeFormatter.ofPattern(JDK_TIME, Locale.US);
public static final DateTimeFormatter ASC_TIME_FORMAT = DateTimeFormatter.ofPattern(ASC_TIME, Locale.US);
public static final DateTimeFormatter RFC1036_FORMAT = DateTimeFormatter.ofPattern(RFC1036, Locale.US);
private static final Map<String, DateTimeFormatter> CACHE = new LRUCache<>(64);
private static final List<DateTimeFormatter> CUSTOM_FORMATTERS = new CopyOnWriteArrayList<>();
private DateUtils() {}
public static void registerFormatter(String pattern) {
CUSTOM_FORMATTERS.add(DateTimeFormatter.ofPattern(pattern));
}
public static void registerFormatter(DateTimeFormatter formatter) {
CUSTOM_FORMATTERS.add(formatter);
}
public static Date parse(String str, String pattern) {
if (DATE_TIME.equals(pattern)) {
return parse(str, DATE_TIME_FORMAT);
}
DateTimeFormatter formatter = getFormatter(pattern);
return parse(str, formatter);
}
public static Date parse(String str, DateTimeFormatter formatter) {
return toDate(formatter.parse(str));
}
public static String format(Date date) {
return format(date, DATE_TIME_FORMAT);
}
public static String format(Date date, String pattern) {
if (DATE_TIME.equals(pattern)) {
return format(date, DATE_TIME_FORMAT);
}
DateTimeFormatter formatter = getFormatter(pattern);
return format(date, formatter);
}
public static String format(Date date, DateTimeFormatter formatter) {
return formatter.format(ZonedDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault()));
}
public static String format(Date date, DateTimeFormatter formatter, ZoneId zone) {
return formatter.format(ZonedDateTime.ofInstant(date.toInstant(), zone));
}
public static String formatGMT(Date date, DateTimeFormatter formatter) {
return formatter.format(ZonedDateTime.ofInstant(date.toInstant(), GMT));
}
public static String formatUTC(Date date, DateTimeFormatter formatter) {
return formatter.format(ZonedDateTime.ofInstant(date.toInstant(), UTC));
}
public static String formatHeader(Date date) {
return DateTimeFormatter.RFC_1123_DATE_TIME.format(ZonedDateTime.ofInstant(date.toInstant(), GMT));
}
private static DateTimeFormatter getFormatter(String pattern) {
return CACHE.computeIfAbsent(pattern, DateTimeFormatter::ofPattern);
}
public static Date parse(Object value) {
if (value == null) {
return null;
}
if (value instanceof Date) {
return (Date) value;
}
if (value instanceof Calendar) {
return ((Calendar) value).getTime();
}
if (value.getClass() == Instant.class) {
return Date.from((Instant) value);
}
if (value instanceof TemporalAccessor) {
return Date.from(Instant.from((TemporalAccessor) value));
}
if (value instanceof Number) {
return new Date(((Number) value).longValue());
}
if (value instanceof CharSequence) {
return parse(value.toString());
}
throw new IllegalArgumentException("Can not cast to Date, value : '" + value + "'");
}
public static Date parse(String value) {
if (value == null) {
return null;
}
String str = value.trim();
int len = str.length();
if (len == 0) {
return null;
}
boolean isIso = true;
boolean isNumeric = true;
boolean hasDate = false;
boolean hasTime = false;
for (int i = 0; i < len; i++) {
char c = str.charAt(i);
switch (c) {
case ' ':
isIso = false;
break;
case '-':
hasDate = true;
break;
case 'T':
case ':':
hasTime = true;
break;
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
continue;
default:
}
if (isNumeric) {
isNumeric = false;
}
}
DateTimeFormatter formatter = null;
if (isIso) {
if (hasDate) {
formatter = hasTime ? DateTimeFormatter.ISO_DATE_TIME : DateTimeFormatter.ISO_DATE;
} else if (hasTime) {
formatter = DateTimeFormatter.ISO_TIME;
}
}
if (isNumeric) {
long num = Long.parseLong(str);
if (num > 21000101 || num < 19700101) {
return new Date(num);
}
formatter = DateTimeFormatter.BASIC_ISO_DATE;
}
switch (len) {
case 10:
formatter = DATE_FORMAT;
break;
case 16:
formatter = DATE_MIN_FORMAT;
break;
case 19:
formatter = DATE_TIME_FORMAT;
break;
case 23:
case 24:
formatter = ASC_TIME_FORMAT;
break;
case 27:
formatter = RFC1036_FORMAT;
break;
case 28:
formatter = JDK_TIME_FORMAT;
break;
case 29:
formatter = DateTimeFormatter.RFC_1123_DATE_TIME;
break;
default:
}
if (formatter != null) {
try {
return toDate(formatter.parse(str));
} catch (Exception ignored) {
}
}
for (DateTimeFormatter dtf : CUSTOM_FORMATTERS) {
try {
return parse(str, dtf);
} catch (Exception ignored) {
}
}
throw new IllegalArgumentException("Can not cast to Date, value : '" + value + "'");
}
public static Date toDate(TemporalAccessor temporal) {
if (temporal instanceof Instant) {
return Date.from((Instant) temporal);
}
long timestamp;
if (temporal.isSupported(ChronoField.EPOCH_DAY)) {
timestamp = temporal.getLong(ChronoField.EPOCH_DAY) * 86400000;
} else {
timestamp = LocalDate.now().toEpochDay() * 86400000;
}
if (temporal.isSupported(ChronoField.MILLI_OF_DAY)) {
timestamp += temporal.getLong(ChronoField.MILLI_OF_DAY);
}
if (temporal.isSupported(ChronoField.OFFSET_SECONDS)) {
timestamp -= temporal.getLong(ChronoField.OFFSET_SECONDS) * 1000;
} else {
timestamp -= TimeZone.getDefault().getRawOffset();
}
return new Date(timestamp);
}
}

View File

@ -16,24 +16,91 @@
*/ */
package org.apache.dubbo.common.utils; package org.apache.dubbo.common.utils;
import org.apache.dubbo.common.logger.Level;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import org.apache.log4j.FileAppender; import org.apache.logging.log4j.core.LogEvent;
import org.apache.log4j.spi.LoggingEvent; import org.apache.logging.log4j.core.appender.AbstractAppender;
import org.apache.logging.log4j.core.appender.AbstractOutputStreamAppender;
import org.apache.logging.log4j.core.appender.FileAppender;
import org.apache.logging.log4j.core.config.Property;
import org.apache.logging.log4j.core.config.plugins.Plugin;
import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
public class DubboAppender extends FileAppender { @Plugin(name = "Dubbo", category = "Core", elementType = "appender")
public class DubboAppender extends AbstractAppender {
public static class Builder extends AbstractOutputStreamAppender.Builder<Builder>
implements org.apache.logging.log4j.core.util.Builder<DubboAppender> {
@PluginBuilderAttribute
private String fileName;
@PluginBuilderAttribute
private boolean append = true;
@PluginBuilderAttribute
private boolean locking;
public Builder setFileName(String fileName) {
this.fileName = fileName;
return this;
}
public Builder setAppend(boolean append) {
this.append = append;
return this;
}
public Builder setLocking(boolean locking) {
this.locking = locking;
return this;
}
@Override
public DubboAppender build() {
return new DubboAppender(getName(), buildFileAppender());
}
private <B extends FileAppender.Builder<B>> FileAppender buildFileAppender() {
FileAppender.Builder<B> builder = FileAppender.newBuilder();
builder.setIgnoreExceptions(isIgnoreExceptions());
builder.setLayout(getLayout());
builder.setName(getName() + "-File");
builder.setConfiguration(getConfiguration());
builder.setBufferedIo(isBufferedIo());
builder.setBufferSize(getBufferSize());
builder.setImmediateFlush(isImmediateFlush());
builder.withFileName(fileName == null || fileName.isEmpty() ? DEFAULT_FILE_NAME : fileName);
builder.withAppend(append);
builder.withLocking(locking);
return builder.build();
}
}
private static final String DEFAULT_FILE_NAME = "dubbo.log"; private static final String DEFAULT_FILE_NAME = "dubbo.log";
public static boolean available = false;
public static List<Log> logList = new ArrayList<>();
private final FileAppender fileAppender;
public DubboAppender() { public DubboAppender() {
super(); this("Dubbo", null);
setFile(DEFAULT_FILE_NAME);
} }
public static boolean available = false; private DubboAppender(String name, FileAppender fileAppender) {
super(name, null, null, true, Property.EMPTY_ARRAY);
this.fileAppender = fileAppender;
}
public static List<Log> logList = new ArrayList<>(); @PluginBuilderFactory
public static Builder newBuilder() {
return new Builder().asBuilder();
}
public static void doStart() { public static void doStart() {
available = true; available = true;
@ -48,20 +115,39 @@ public class DubboAppender extends FileAppender {
} }
@Override @Override
public void append(LoggingEvent event) { public void append(LogEvent event) {
super.append(event); if (fileAppender != null) {
fileAppender.append(event);
}
if (available) { if (available) {
Log temp = parseLog(event); logList.add(parseLog(event));
logList.add(temp);
} }
} }
private Log parseLog(LoggingEvent event) { @Override
public void initialize() {
fileAppender.initialize();
super.initialize();
}
@Override
public void start() {
fileAppender.start();
super.start();
}
@Override
public void stop() {
super.stop();
fileAppender.stop();
}
private Log parseLog(LogEvent event) {
Log log = new Log(); Log log = new Log();
log.setLogName(event.getLogger().getName()); log.setLogName(event.getLoggerName());
log.setLogLevel(event.getLevel()); log.setLogLevel(Level.valueOf(event.getLevel().name()));
log.setLogThread(event.getThreadName()); log.setLogThread(event.getThreadName());
log.setLogMessage(event.getMessage().toString()); log.setLogMessage(event.getMessage().getFormattedMessage());
return log; return log;
} }
} }

View File

@ -19,6 +19,8 @@ package org.apache.dubbo.common.utils;
import org.apache.dubbo.common.logger.ErrorTypeAwareLogger; import org.apache.dubbo.common.logger.ErrorTypeAwareLogger;
import org.apache.dubbo.common.logger.LoggerFactory; import org.apache.dubbo.common.logger.LoggerFactory;
import static org.apache.dubbo.common.constants.CommonConstants.SystemProperty.SYSTEM_JAVA_VERSION;
/** /**
* JRE version * JRE version
*/ */
@ -81,7 +83,7 @@ public enum JRE {
private static JRE getJre() { private static JRE getJre() {
// get java version from system property // get java version from system property
String version = System.getProperty("java.version"); String version = SystemPropertyConfigUtils.getSystemProperty(SYSTEM_JAVA_VERSION);
boolean isBlank = StringUtils.isBlank(version); boolean isBlank = StringUtils.isBlank(version);
if (isBlank) { if (isBlank) {
logger.debug("java.version is blank"); logger.debug("java.version is blank");

View File

@ -56,7 +56,8 @@ public class JVMUtil {
int i = 0; int i = 0;
// default is 32, means only print up to 32 lines // default is 32, means only print up to 32 lines
int jstackMaxLine = 32; int jstackMaxLine = 32;
String jstackMaxLineStr = System.getProperty(CommonConstants.DUBBO_JSTACK_MAXLINE); String jstackMaxLineStr =
SystemPropertyConfigUtils.getSystemProperty(CommonConstants.DubboProperty.DUBBO_JSTACK_MAXLINE);
if (StringUtils.isNotEmpty(jstackMaxLineStr)) { if (StringUtils.isNotEmpty(jstackMaxLineStr)) {
try { try {
jstackMaxLine = Integer.parseInt(jstackMaxLineStr); jstackMaxLine = Integer.parseInt(jstackMaxLineStr);

View File

@ -0,0 +1,184 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.dubbo.common.utils;
import org.apache.dubbo.common.logger.Logger;
import org.apache.dubbo.common.logger.LoggerFactory;
import java.lang.reflect.Field;
import java.lang.reflect.GenericArrayType;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.lang.reflect.TypeVariable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class JsonCompatibilityUtil {
private static final Logger logger = LoggerFactory.getLogger(JsonCompatibilityUtil.class);
private static final Set<String> unsupportedClasses = new HashSet<>(Arrays.asList(
"java.util.Optional",
"java.util.Calendar",
"java.util.Iterator",
"java.io.InputStream",
"java.io.OutputStream"));
/**
* Determine whether a Class can be serialized by JSON.
* @param clazz Incoming Class.
* @return If a Class can be serialized by JSON, return true;
* else return false.
*/
public static boolean checkClassCompatibility(Class<?> clazz) {
Method[] methods = clazz.getDeclaredMethods();
boolean result;
for (Method method : methods) {
result = checkMethodCompatibility(method);
if (!result) {
return false;
}
}
return true;
}
/**
* Determine whether a Method can be serialized by JSON.
* @param method Incoming Method.
* @return If a Method can be serialized by JSON, return true;
* else return false.
*/
public static boolean checkMethodCompatibility(Method method) {
boolean result;
Type[] types = method.getGenericParameterTypes();
List<Type> typeList = new ArrayList<>(Arrays.asList(types));
Type returnType = method.getGenericReturnType();
typeList.add(returnType);
for (Type type : typeList) {
result = checkType(type);
if (!result) {
return false;
}
}
return true;
}
/**
* Get unsupported methods.
* @param clazz
* @return If there are unsupported methods, return them by List;
* else return null.
*/
public static List<String> getUnsupportedMethods(Class<?> clazz) {
ArrayList<String> unsupportedMethods = new ArrayList<>();
Method[] methods = clazz.getDeclaredMethods();
for (Method method : methods) {
if (!checkMethodCompatibility(method)) {
unsupportedMethods.add(method.getName());
}
}
return unsupportedMethods.size() > 0 ? unsupportedMethods : null;
}
/**
* Determine whether a Type can be serialized by JSON.
* @param classType Incoming Type.
* @return If a Type can be serialized by JSON, return true;
* else return false.
*/
private static boolean checkType(Type classType) {
boolean result;
if (classType instanceof TypeVariable) {
return true;
}
if (classType instanceof ParameterizedType) {
Type[] types = ((ParameterizedType) classType).getActualTypeArguments();
List<Type> typeList = new ArrayList<>(Arrays.asList(types));
classType = ((ParameterizedType) classType).getRawType();
typeList.add(classType);
for (Type type : typeList) {
result = checkType(type);
if (!result) {
return false;
}
}
} else if (classType instanceof GenericArrayType) {
Type componentType = ((GenericArrayType) classType).getGenericComponentType();
result = checkType(componentType);
return result;
} else if (classType instanceof Class<?>) {
Class<?> clazz = (Class<?>) classType;
String className = clazz.getName();
if (clazz.isArray()) {
Type componentType = clazz.getComponentType();
result = checkType(componentType);
return result;
} else if (clazz.isPrimitive()) {
// deal with case of basic byte
return !unsupportedClasses.contains(className);
} else if (className.startsWith("java") || className.startsWith("javax")) {
return !unsupportedClasses.contains(className);
} else {
// deal with case of interface
if (clazz.isInterface()) {
return false;
}
// deal with case of abstract
if (Modifier.isAbstract(clazz.getModifiers())) {
return false;
}
if (clazz.isEnum()) {
return true;
}
// deal with case of record
// if (clazz.isRecord()) {
// return false;
// }
// deal with field one by one
for (Field field : clazz.getDeclaredFields()) {
Type type = field.getGenericType();
Class<?> fieldClass = field.getType();
result = checkType(type);
if (!result) {
return false;
}
}
}
}
return true;
}
}

View File

@ -17,7 +17,7 @@
package org.apache.dubbo.common.utils; package org.apache.dubbo.common.utils;
import org.apache.dubbo.common.constants.CommonConstants; import org.apache.dubbo.common.constants.CommonConstants;
import org.apache.dubbo.common.json.JSON; import org.apache.dubbo.common.json.JsonUtil;
import org.apache.dubbo.common.json.impl.FastJson2Impl; import org.apache.dubbo.common.json.impl.FastJson2Impl;
import org.apache.dubbo.common.json.impl.FastJsonImpl; import org.apache.dubbo.common.json.impl.FastJsonImpl;
import org.apache.dubbo.common.json.impl.GsonImpl; import org.apache.dubbo.common.json.impl.GsonImpl;
@ -29,17 +29,17 @@ import java.util.List;
import java.util.Map; import java.util.Map;
public class JsonUtils { public class JsonUtils {
private static volatile JsonUtil jsonUtil;
private static volatile JSON json; protected static JsonUtil getJson() {
if (jsonUtil == null) {
protected static JSON getJson() {
if (json == null) {
synchronized (JsonUtils.class) { synchronized (JsonUtils.class) {
if (json == null) { if (jsonUtil == null) {
String preferJsonFrameworkName = System.getProperty(CommonConstants.PREFER_JSON_FRAMEWORK_NAME); String preferJsonFrameworkName = SystemPropertyConfigUtils.getSystemProperty(
CommonConstants.DubboProperty.DUBBO_PREFER_JSON_FRAMEWORK_NAME);
if (StringUtils.isNotEmpty(preferJsonFrameworkName)) { if (StringUtils.isNotEmpty(preferJsonFrameworkName)) {
try { try {
JSON instance = null; JsonUtil instance = null;
switch (preferJsonFrameworkName) { switch (preferJsonFrameworkName) {
case "fastjson2": case "fastjson2":
instance = new FastJson2Impl(); instance = new FastJson2Impl();
@ -53,22 +53,23 @@ public class JsonUtils {
case "jackson": case "jackson":
instance = new JacksonImpl(); instance = new JacksonImpl();
break; break;
default:
} }
if (instance != null && instance.isSupport()) { if (instance != null && instance.isSupport()) {
json = instance; jsonUtil = instance;
} }
} catch (Throwable ignore) { } catch (Throwable ignore) {
} }
} }
if (json == null) { if (jsonUtil == null) {
List<Class<? extends JSON>> jsonClasses = Arrays.asList( List<Class<? extends JsonUtil>> jsonClasses = Arrays.asList(
FastJson2Impl.class, FastJsonImpl.class, GsonImpl.class, JacksonImpl.class); FastJson2Impl.class, FastJsonImpl.class, GsonImpl.class, JacksonImpl.class);
for (Class<? extends JSON> jsonClass : jsonClasses) { for (Class<? extends JsonUtil> jsonClass : jsonClasses) {
try { try {
JSON instance = jsonClass.getConstructor().newInstance(); JsonUtil instance = jsonClass.getConstructor().newInstance();
if (instance.isSupport()) { if (instance.isSupport()) {
json = instance; jsonUtil = instance;
break; break;
} }
} catch (Throwable ignore) { } catch (Throwable ignore) {
@ -76,7 +77,7 @@ public class JsonUtils {
} }
} }
} }
if (json == null) { if (jsonUtil == null) {
throw new IllegalStateException( throw new IllegalStateException(
"Dubbo unable to find out any json framework (e.g. fastjson2, fastjson, gson, jackson) from jvm env. " "Dubbo unable to find out any json framework (e.g. fastjson2, fastjson, gson, jackson) from jvm env. "
+ "Please import at least one json framework."); + "Please import at least one json framework.");
@ -84,15 +85,15 @@ public class JsonUtils {
} }
} }
} }
return json; return jsonUtil;
} }
/** /**
* @deprecated for uts only * @deprecated for uts only
*/ */
@Deprecated @Deprecated
protected static void setJson(JSON json) { protected static void setJson(JsonUtil json) {
JsonUtils.json = json; JsonUtils.jsonUtil = json;
} }
public static <T> T toJavaObject(String json, Type type) { public static <T> T toJavaObject(String json, Type type) {
@ -123,6 +124,14 @@ public class JsonUtils {
return getJson().getObject(obj, key); return getJson().getObject(obj, key);
} }
public static Object convertObject(Object obj, Type targetType) {
return getJson().convertObject(obj, targetType);
}
public static Object convertObject(Object obj, Class<?> targetType) {
return getJson().convertObject(obj, targetType);
}
public static Double getNumberAsDouble(Map<String, ?> obj, String key) { public static Double getNumberAsDouble(Map<String, ?> obj, String key) {
return getJson().getNumberAsDouble(obj, key); return getJson().getNumberAsDouble(obj, key);
} }

View File

@ -19,13 +19,14 @@ package org.apache.dubbo.common.utils;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock; import java.util.concurrent.locks.ReentrantLock;
import java.util.function.Function;
/** /**
* LRU-2 * LRU-2
* </p> * <p>
* When the data accessed for the first time, add it to history list. If the size of history list reaches max capacity, eliminate the earliest data (first in first out). * When the data accessed for the first time, add it to history list. If the size of history list reaches max capacity, eliminate the earliest data (first in first out).
* When the data already exists in the history list, and be accessed for the second time, then it will be put into cache. * When the data already exists in the history list, and be accessed for the second time, then it will be put into cache.
* * </p>
* TODO, consider replacing with ConcurrentHashMap to improve performance under concurrency * TODO, consider replacing with ConcurrentHashMap to improve performance under concurrency
*/ */
public class LRU2Cache<K, V> extends LinkedHashMap<K, V> { public class LRU2Cache<K, V> extends LinkedHashMap<K, V> {
@ -33,8 +34,8 @@ public class LRU2Cache<K, V> extends LinkedHashMap<K, V> {
private static final long serialVersionUID = -5167631809472116969L; private static final long serialVersionUID = -5167631809472116969L;
private static final float DEFAULT_LOAD_FACTOR = 0.75f; private static final float DEFAULT_LOAD_FACTOR = 0.75f;
private static final int DEFAULT_MAX_CAPACITY = 1000; private static final int DEFAULT_MAX_CAPACITY = 1000;
private final Lock lock = new ReentrantLock(); private final Lock lock = new ReentrantLock();
private volatile int maxCapacity; private volatile int maxCapacity;
@ -94,6 +95,16 @@ public class LRU2Cache<K, V> extends LinkedHashMap<K, V> {
} }
} }
@Override
public V computeIfAbsent(K key, Function<? super K, ? extends V> fn) {
V value = get(key);
if (value == null) {
value = fn.apply(key);
put(key, value);
}
return value;
}
@Override @Override
public V remove(Object key) { public V remove(Object key) {
lock.lock(); lock.lock();

View File

@ -19,6 +19,7 @@ package org.apache.dubbo.common.utils;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock; import java.util.concurrent.locks.ReentrantLock;
import java.util.function.Function;
/** /**
* A 'least recently used' cache based on LinkedHashMap. * A 'least recently used' cache based on LinkedHashMap.
@ -31,8 +32,8 @@ public class LRUCache<K, V> extends LinkedHashMap<K, V> {
private static final long serialVersionUID = -5167631809472116969L; private static final long serialVersionUID = -5167631809472116969L;
private static final float DEFAULT_LOAD_FACTOR = 0.75f; private static final float DEFAULT_LOAD_FACTOR = 0.75f;
private static final int DEFAULT_MAX_CAPACITY = 1000; private static final int DEFAULT_MAX_CAPACITY = 1000;
private final Lock lock = new ReentrantLock(); private final Lock lock = new ReentrantLock();
private volatile int maxCapacity; private volatile int maxCapacity;
@ -110,6 +111,20 @@ public class LRUCache<K, V> extends LinkedHashMap<K, V> {
} }
} }
@Override
public V computeIfAbsent(K key, Function<? super K, ? extends V> fn) {
V value = get(key);
if (value == null) {
lock.lock();
try {
return super.computeIfAbsent(key, fn);
} finally {
lock.unlock();
}
}
return value;
}
public void lock() { public void lock() {
lock.lock(); lock.lock();
} }

Some files were not shown because too many files have changed in this diff Show More