diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml
new file mode 100644
index 00000000000..185873ad02a
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/bug_report.yml
@@ -0,0 +1,33 @@
+name: Bug Report
+description: Create a report to help us improve
+title: "[BUG] - Issue Title"
+labels: bug
+
+body:
+ - type: markdown
+ attributes:
+ value: "## Describe the bug\nA clear and concise description of what the bug is."
+
+ - type: textarea
+ attributes:
+ label: Steps to Reproduce
+ description: "List the steps to reproduce the bug."
+ placeholder: "1. Go to '...'\n2. Click on '...'\n3. See error"
+
+ - type: textarea
+ attributes:
+ label: Expected Behavior
+ description: "Describe the behavior you expected to see."
+ placeholder: "A clear and concise description of what you expected to happen."
+
+ - type: input
+ attributes:
+ label: Servicecomb Version
+ description: "Please provide your Servicecomb version"
+ placeholder: "3.2.4"
+
+ - type: textarea
+ attributes:
+ label: Additional Context
+ description: "Add any other context about the problem here."
+ placeholder: "Any additional information that might help us debug the issue."
diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml
new file mode 100644
index 00000000000..16fd2512ea7
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/config.yml
@@ -0,0 +1,18 @@
+blank_issues_enabled: false
+contact_links:
+ - name: "Contact Support"
+ url: "mailto:dev@servicecomb.apache.org"
+ about: "If you need help, please contact us."
+templates:
+ - name: "Bug Report"
+ description: "Report a bug or issue."
+ filename: "bug_report.yml"
+ - name: "Feature Request"
+ description: "Request a new feature or improvement."
+ filename: "feature_request.yml"
+ - name: "Documentation Issue"
+ description: "Report an issue with documentation."
+ filename: "documentation_issue.yml"
+ - name: "Question"
+ description: "Ask a question or seek help."
+ filename: "question.yml"
diff --git a/.github/ISSUE_TEMPLATE/documentation_issue.yml b/.github/ISSUE_TEMPLATE/documentation_issue.yml
new file mode 100644
index 00000000000..94ef3490041
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/documentation_issue.yml
@@ -0,0 +1,27 @@
+name: Documentation Issue
+description: Report an issue with the documentation
+title: "[DOCUMENTATION] - Documentation Issue Title"
+labels: documentation
+
+body:
+ - type: markdown
+ attributes:
+ value: "## Describe the documentation issue\nA clear and concise description of the issue with the documentation."
+
+ - type: textarea
+ attributes:
+ label: Location in documentation
+ description: "Please provide the URL or section where the issue appears."
+ placeholder: "e.g. https://docs.example.com/section"
+
+ - type: textarea
+ attributes:
+ label: What should be changed?
+ description: "Please describe what changes or improvements should be made to the documentation."
+ placeholder: "Explain how we can improve the content."
+
+ - type: textarea
+ attributes:
+ label: Additional Context
+ description: "Provide any other context or examples here."
+ placeholder: "Additional comments or suggestions for the documentation."
diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml
new file mode 100644
index 00000000000..3a44565e0b2
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/feature_request.yml
@@ -0,0 +1,33 @@
+name: Feature Request
+description: Suggest an idea or feature for this project
+title: "[FEATURE] - Feature Title"
+labels: enhancement
+
+body:
+ - type: markdown
+ attributes:
+ value: "## Describe the feature request\nA clear and concise description of what you want to be added to the project."
+
+ - type: textarea
+ attributes:
+ label: Problem this feature would solve
+ description: "Please describe the problem or challenge you're facing."
+ placeholder: "Explain why this feature would be helpful."
+
+ - type: textarea
+ attributes:
+ label: Describe the solution
+ description: "How do you envision this feature working?"
+ placeholder: "Provide a description of how the feature would solve the problem."
+
+ - type: textarea
+ attributes:
+ label: Alternatives considered
+ description: "Have you considered other solutions or alternatives? If yes, describe them."
+ placeholder: "Provide any alternative solutions you've thought about."
+
+ - type: textarea
+ attributes:
+ label: Additional Context
+ description: "Any other context or information that might help us implement this feature."
+ placeholder: "Include any links, mockups, or additional details."
diff --git a/.github/ISSUE_TEMPLATE/question.yml b/.github/ISSUE_TEMPLATE/question.yml
new file mode 100644
index 00000000000..af3f350b518
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/question.yml
@@ -0,0 +1,27 @@
+name: General Question
+description: Ask a general question related to the project
+title: "[QUESTION] - Question Title"
+labels: question
+
+body:
+ - type: markdown
+ attributes:
+ value: "## What is your question?\nDescribe the question or issue you are facing. Be as specific as possible."
+
+ - type: textarea
+ attributes:
+ label: Steps to reproduce (if applicable)
+ description: "If your question is about a specific problem or bug, please include steps to reproduce it."
+ placeholder: "Provide steps, if applicable."
+
+ - type: textarea
+ attributes:
+ label: What have you tried so far?
+ description: "Please explain what you have already tried to resolve the issue or answer the question."
+ placeholder: "Describe the steps you've taken."
+
+ - type: textarea
+ attributes:
+ label: Additional context
+ description: "Provide any other context or information related to the question."
+ placeholder: "Include any relevant links or background information."
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
index b8f6e71dbe3..7f7754fc299 100644
--- a/.github/dependabot.yml
+++ b/.github/dependabot.yml
@@ -21,44 +21,9 @@ updates:
- package-ecosystem: "github-actions"
directory: "/"
schedule:
- interval: "weekly"
+ interval: "monthly"
- package-ecosystem: "maven"
directory: "/"
schedule:
- interval: "weekly"
+ interval: "monthly"
open-pull-requests-limit: 20
- ignore:
- - dependency-name: "asciidoctorj"
- versions:
- - "2.x"
- - dependency-name: "hibernate-validator"
- versions:
- - "8.x"
- # asciidoctorj new version needs higher swagger2markup, which will need java11
- - dependency-name: "jakarta.activation"
- versions:
- - "2.x"
- - dependency-name: "jakarta.servlet-api"
- versions:
- - "5.x"
- - "6.x"
- - dependency-name: "jakarta.ws.rs-api"
- versions:
- - "3.x"
- - dependency-name: "jersey"
- versions:
- - "3.x"
- - dependency-name: "jersey-client"
- versions:
- - "3.x"
- - dependency-name: "jersey-common"
- versions:
- - "3.x"
- - dependency-name: "logback-classic"
- # logback new versions needs java11 now
- - dependency-name: "logback-core"
- # logback new versions needs java11 now
- - dependency-name: "protostuff-parser"
- # protostuff-parser new versions needs java11 now
- - dependency-name: "swagger2markup"
- # swagger2markup new version needs java11 now
diff --git a/.github/workflows/checkstyle.yml b/.github/workflows/checkstyle.yml
index fb1e00c9881..3f97b9f1818 100644
--- a/.github/workflows/checkstyle.yml
+++ b/.github/workflows/checkstyle.yml
@@ -26,13 +26,13 @@ on:
jobs:
checkstyle:
timeout-minutes: 60
- runs-on: ubuntu-latest
+ runs-on: ubuntu-24.04
steps:
- - uses: actions/checkout@v3
+ - uses: actions/checkout@v6
- name: Set up jdk
- uses: actions/setup-java@v3
+ uses: actions/setup-java@v5
with:
java-version: '17'
distribution: 'temurin'
- name: checkstyle
- run: mvn -B -Pit install -DskipTests -Dspotbugs.skip=true checkstyle:check
+ run: mvn checkstyle:check -B -Pit
diff --git a/.github/workflows/linelint.yml b/.github/workflows/linelint.yml
new file mode 100644
index 00000000000..8d5112ea3d6
--- /dev/null
+++ b/.github/workflows/linelint.yml
@@ -0,0 +1,35 @@
+#
+# 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.
+#
+
+name: line lint
+on:
+ pull_request:
+ branches:
+ - master
+
+jobs:
+ linelint:
+ timeout-minutes: 60
+ runs-on: ubuntu-24.04
+ steps:
+ - uses: actions/checkout@v6
+ - name: install linelint
+ run: cargo install linelint-cli
+ - name: Run linelint check
+ run: linelint check
diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml
index 9f1c414091d..24118c35c99 100644
--- a/.github/workflows/maven.yml
+++ b/.github/workflows/maven.yml
@@ -29,22 +29,24 @@ jobs:
build:
timeout-minutes: 60
- runs-on: ubuntu-latest
+ runs-on: ubuntu-24.04
steps:
- - uses: actions/checkout@v3
+ - uses: actions/checkout@v6
- name: Set up jdk
- uses: actions/setup-java@v3
+ uses: actions/setup-java@v5
with:
- java-version: '17'
+ java-version: '17.0.8'
distribution: 'temurin'
- - uses: actions/cache@v3
+ - name: Set up Maven
+ uses: stCarolas/setup-maven@v5
+ with:
+ maven-version: 3.9.9
+ - uses: actions/cache@v5
with:
path: ~/.m2/repository
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
restore-keys: |
${{ runner.os }}-maven-
- name: Compilation and Installation
- run: mvn clean install -Dcheckstyle.skip -Dspotbugs.skip=true -B -Pdocker -Pjacoco -Pit -Pcoverage
- - name: publish coverage report
- run: bash <(curl -s https://codecov.io/bash)
+ run: mvn clean verify -Dcheckstyle.skip=true -B -Pdocker -Pjacoco -Pit -Pcoverage
diff --git a/.github/workflows/rat_check.yml b/.github/workflows/rat_check.yml
index bbdf9066c23..c2db2508fea 100644
--- a/.github/workflows/rat_check.yml
+++ b/.github/workflows/rat_check.yml
@@ -29,11 +29,11 @@ on:
jobs:
rat_check:
timeout-minutes: 60
- runs-on: ubuntu-latest
+ runs-on: ubuntu-24.04
steps:
- - uses: actions/checkout@v3
+ - uses: actions/checkout@v6
- name: Set up jdk
- uses: actions/setup-java@v3
+ uses: actions/setup-java@v5
with:
java-version: '17'
distribution: 'temurin'
diff --git a/.github/workflows/spotbugs.yml b/.github/workflows/spotbugs.yml
deleted file mode 100644
index ff68dcf4966..00000000000
--- a/.github/workflows/spotbugs.yml
+++ /dev/null
@@ -1,38 +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.
-#
-
-name: spot bugs
-on:
- pull_request:
- branches:
- - master
-
-jobs:
- spotbugs:
- timeout-minutes: 60
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v3
- - name: Set up jdk
- uses: actions/setup-java@v3
- with:
- java-version: '17'
- distribution: 'temurin'
- - name: spotbugs
- run: mvn -B -Pit -DskipTests clean verify spotbugs:spotbugs
diff --git a/.github/workflows/typo_check.yml b/.github/workflows/typo_check.yml
new file mode 100644
index 00000000000..999530a79f7
--- /dev/null
+++ b/.github/workflows/typo_check.yml
@@ -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.
+#
+
+name: typo check
+on:
+ pull_request:
+ branches:
+ - master
+
+jobs:
+ typo-check:
+ timeout-minutes: 60
+ runs-on: ubuntu-24.04
+ steps:
+ - uses: actions/checkout@v6
+ # To run the typo check locally, you can follow these steps:
+ # 1. Install typos locally using cargo:
+ # cargo install typos-cli
+ # 2. Run the typo check with the following command:
+ # typos
+ - name: Check typos
+ uses: crate-ci/typos@v1.38.1
diff --git a/.typos.toml b/.typos.toml
new file mode 100644
index 00000000000..e8b6eb33f39
--- /dev/null
+++ b/.typos.toml
@@ -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.
+#
+
+[default.extend-words]
+"fo" = "fo"
+"VERTX" = "VERTX"
+"Vertx" = "Vertx"
+"vertx" = "vertx"
+
+[files]
+extend-exclude = [
+ "**/cobertura.ser"
+]
+[default]
+extend-ignore-words-re = [
+ "Verticle",
+ "verticle",
+ "VERTICLE",
+ "Prelease",
+ "cobertura",
+ "ser",
+]
diff --git a/LICENSE b/LICENSE
index 3394da99ceb..7898c758729 100644
--- a/LICENSE
+++ b/LICENSE
@@ -238,4 +238,11 @@ For foundations/foundation-protobuf/src/main/java/io/protostuff/runtime/ArrayFie
foundations/foundation-protobuf/src/main/java/io/protostuff/SchemaWriter.java
================================================================
This product bundles files from protostuff which is licensed under the Apache License v2.
-For details, see https://github.com/protostuff/protostuff
\ No newline at end of file
+For details, see https://github.com/protostuff/protostuff
+
+================================================================
+For foundations/foundation-protobuf/src/main/resources/google/protobuf/any.proto
+For foundations/foundation-protobuf/src/main/resources/google/protobuf/empty.proto
+================================================================
+This product bundles files from swagger which is licensed under the BSD-3-Clause.
+For details, see https://github.com/protocolbuffers/protobuf
diff --git a/NOTICE b/NOTICE
index d4848d021c3..e4df59ae99a 100644
--- a/NOTICE
+++ b/NOTICE
@@ -1,5 +1,5 @@
Apache ServiceComb Java Chassis
-Copyright 2017-2022 The Apache Software Foundation
+Copyright 2017-2025 The Apache Software Foundation
This product includes software developed at
The Apache Software Foundation (http://www.apache.org/).
diff --git a/README.md b/README.md
index 673d3b0072a..b2fbc167625 100644
--- a/README.md
+++ b/README.md
@@ -1,69 +1,87 @@
# Java Chassis [中文](README_ZH.md) [](http://search.maven.org/#search%7Cga%7C1%7Corg.apache.servicecomb) [](https://www.apache.org/licenses/LICENSE-2.0.html)
-Apache ServiceComb Java Chassis is a Software Development Kit (SDK) for rapid development of microservices in Java, providing service registration, service discovery, dynamic routing, and service management features
+Apache ServiceComb Java Chassis is a Software Development Kit (SDK) for rapid development of microservices in Java, providing service registration, service discovery, dynamic routing, and service management features.
-# releases
-
-| Release Train | Latest Version | Compiled JDK Version | Tested JDK Version |
-|---------------|----------------|----------------------|-------------------------------|
-| 2.x.x | 2.8.3 | OpenJDK 8 | OpenJDK 8, 11, 17 |
-| 1.x.x | 1.3.10 | OpenJDK 8 | OpenJDK 8 |
-
-# Why use Java Chassis
+> If you find this project helpful, please don't forget to `star` it.
-- **High performance**
+# releases
- The transport capability of Java Chassis is based on [Vert.x](https://vertx.io), which enables Java Chassis to process
- massive requests with relatively less hardware resources, and support [reactive develop style](https://www.reactivemanifesto.org).
+| Release Train | Latest Version | Compiled JDK Version | Tested JDK Version | Open API | Notes |
+|----------------|----------------|----------------------|--------------------|----------|--------------------------|
+| Java Chassis 3 | 3.3.0 | OpenJDK 17 | OpenJDK 17 | 3.0.x | Depends on Spring Boot 3 |
+| Java Chassis 2 | 2.8.24 | OpenJDK 8 | OpenJDK 8, 11, 17 | 2.0.x | Depends on Spring 5 |
+| Java Chassis 1 | 1.3.11 | OpenJDK 8 | OpenJDK 8 | 2.0.x | End of Support |
-- **Native support for OpenAPI**
+Java Chassis core dependencies
- Java Chassis describes the APIs of the microservices via [Swagger](https://swagger.io) natively, to help
- developers to design microservices that comply to [OpenAPI standard](https://swagger.io/specification/v2/).
+| Java Chassis | Spring Boot | Vert.x | Swagger | Jackson |
+|--------------|-------------|--------|---------|---------|
+| 3.3.x | 3.4.x | 4.5.x | 2.2.x | 2.18.x |
+| 3.2.x | 3.3.x | 4.5.x | 2.2.x | 2.18.x |
-- **Flexible develop style**
+> NOTICE: Since Open API 3.0.x is not compatible with 2.0.x, Java Chassis 2 and Java Chassis 1 can not
+> work together with Java Chassis 3. All related consumers, providers and edge service need use Java Chassis 3 when upgrading.
- Currently Java Chassis allow developers to develop their microservice APIs in `SpringMVC`/`JAX-RS`/`transparent RPC` styles,
- and to send the request in `RPC`/`RestTemplate` styles. And there are three kind of build-in transport mode:
- `Rest over Vertx`/`Rest over Servlet`/`Highway`. All of these features can be combined and replaced easily,
- because they are decoupled and all based on the Swagger schema, which can provide high flexibility.
+> NOTICE: Java Chassis 1 reached its end of support now after it's first release from 2018.
-- **Out-of-box microservice governance features**
+# Quick Start
- Java Chassis provides a lot of features for microservice governance and monitor.
+* Define API
+```java
+@RequestMapping(path = "/provider")
+public interface ProviderService {
+ @GetMapping("/sayHello")
+ String sayHello(@RequestParam("name") String name);
+}
+```
-# Quick Start
+* Provider service
+```java
+@RestSchema(schemaId = "ProviderController", schemaInterface = ProviderService.class)
+public class ProviderController implements ProviderService {
+ @Override
+ public String sayHello(String name) {
+ return "Hello " + name;
+ }
+}
+```
-Provider service:
+* Consumer service
```java
-import org.apache.servicecomb.*;
-@RpcSchema(schemaId = "helloworld")
-public class HelloWorldProvider implements HelloWorld {
- public String sayHello(String name) {
- return "Hello " + name;
- }
+@Configuration
+public class ProviderServiceConfiguration {
+ @Bean
+ public ProviderService providerService() {
+ return Invoker.createProxy("provider", "ProviderController", ProviderService.class);
+ }
}
```
-Consumer service:
+Invoke Provider service with RPC
```java
-import org.apache.servicecomb.*;
-@Component
-public class HelloWorldConsumer {
- @RpcReference(microserviceName = "pojo", schemaId = "helloworld")
- private static HelloWorld helloWorld;
-
- public static void main(String[] args) {
- helloWorld.sayHello("Tank");
- }
+@RestSchema(schemaId = "ConsumerController", schemaInterface = ConsumerService.class)
+public class ConsumerController implements ConsumerService {
+ private ProviderService providerService;
+
+ @Autowired
+ public void setProviderService(ProviderService providerService) {
+ this.providerService = providerService;
+ }
+
+ @Override
+ public String sayHello(String name) {
+ return providerService.sayHello(name);
+ }
}
```
+Try out this example [here](https://servicecomb.apache.org/references/java-chassis/zh_CN/start/first-sample.html) .
+
# Documentation
Project documentation is available on the [ServiceComb Java Chassis Developer Guide][java-chassis-developer-guide].
-[java-chassis-developer-guide]: https://servicecomb.apache.org/references/java-chassis/en_US/
+[java-chassis-developer-guide]: https://servicecomb.apache.org/references/java-chassis/zh_CN/
# Building
@@ -96,13 +114,3 @@ See [CONTRIBUTING](http://servicecomb.apache.org/developers/contributing) for de
# License
Licensed under an [Apache 2.0 license](LICENSE).
-
-# Export Notice
-
-This distribution includes cryptographic software. The country in which you currently reside may have restrictions on the import, possession, use, and/or re-export to another country, of encryption software. BEFORE using any encryption software, please check your country's laws, regulations and policies concerning the import, possession, or use, and re-export of encryption software, to see if this is permitted. See for more information.
-
-The Apache Software Foundation has classified this software as Export Commodity Control Number (ECCN) 5D002, which includes information security software using or performing cryptographic functions with asymmetric algorithms. The form and manner of this Apache Software Foundation distribution makes it eligible for export under the "publicly available" Section 742.15(b) exemption (see the BIS Export Administration Regulations, Section 742.15(b)) for both object code and source code.
-
-The following provides more details on the included cryptographic software:
-
- * Vertx transport can be configured for secure communications
diff --git a/README_ZH.md b/README_ZH.md
index 19706c5e19e..bfae9746c2b 100644
--- a/README_ZH.md
+++ b/README_ZH.md
@@ -1,77 +1,102 @@
-# Java Chassis | [English](README.md) [](http://search.maven.org/#search%7Cga%7C1%7Corg.apache.servicecomb) [](https://www.apache.org/licenses/LICENSE-2.0.html)
+# Java Chassis | [English](README.md) [](http://search.maven.org/#search%7Cga%7C1%7Corg.apache.servicecomb) [](https://www.apache.org/licenses/LICENSE-2.0.html)
Apache ServiceComb Java Chassis 给开发者提供一个快速构建微服务的JAVA SDK。它包含如下特性:
-* 多种开发风格,REST(JAX-RS、Spring MVC)和RPC
-* 多种通信协议, HTTP over Vert.x、Http Over Servlet、Highway等
-* 统一一致的服务提供者、服务消费者处理链,以及基于契约的开箱即用的服务治理能力
+* 基于Open API的契约优先(API First)开发模式,满足开发过程可管理、开发规范可验证要求。
+* 多种开发风格,REST(JAX-RS、Spring MVC)和RPC等,高效支持遗留系统迁移和新系统开发场景。
+* 多种通信协议, HTTP over Vert.x、Http Over Servlet、Highway等,满足不同场景对于性能、韧性的需求。
+* 统一一致的服务提供者、服务消费者处理链,易于扩展新功能。
+* 提供服务发现、配置管理、熔断、限流、灰度发布等开箱即用的服务治理能力。
-开发者可以通过[设计选型参考][design]了解更多特性和设计原理。
+可以通过[设计选型参考](https://servicecomb.apache.org/references/java-chassis/zh_CN/start/design.html) 了解更多特性和设计原理。
-[design]: https://servicecomb.apache.org/references/java-chassis/zh_CN/start/design.html
+> 如果发现项目能帮助到您,别忘了点击右上角`star`表示鼓励。
-# releases
+# 发布版本
-| 版本火车 | 最新版本 | 编译的JDK版本 | 支持的JDK版本 |
-|-------|--------|-----------|-------------------|
-| 2.x.x | 2.8.3 | OpenJDK 8 | OpenJDK 8, 11, 17 |
-| 1.x.x | 1.3.10 | OpenJDK 8 | OpenJDK 8 |
+| 版本火车 | 最新版本 | 编译的JDK版本 | 支持的JDK版本 | Open API | 备注 |
+|----------------|--------|------------|-------------------|----------|-----------------|
+| Java Chassis 3 | 3.3.0 | OpenJDK 17 | OpenJDK 17 | 3.0.x | 依赖Spring Boot 3 |
+| Java Chassis 2 | 2.8.24 | OpenJDK 8 | OpenJDK 8, 11, 17 | 2.0.x | 依赖Spring 5 |
+| Java Chassis 1 | 1.3.11 | OpenJDK 8 | OpenJDK 8 | 2.0.x | 停止更新 |
-# 为什么使用Java Chassis
+Java Chassis 的核心依赖
-- **高性能**
+| Java Chassis | Spring Boot | Vert.x | Swagger | Jackson |
+|--------------|-------------|--------|---------|---------|
+| 3.3.x | 3.4.x | 4.5.x | 2.2.x | 2.18.x |
+| 3.2.x | 3.3.x | 4.5.x | 2.2.x | 2.18.x |
- Java Chassis 网络层基于 [Vert.x](https://vertx.io) 实现, 支持开发者使用[响应式编程](https://www.reactivemanifesto.org), 开发者在使用熟悉的REST风格设计业务接口的时候,也能够获取到非常高性能的吞吐量。同时还提供了Highway协议,满足更高性能场景的要求。
+> NOTICE: Open API 3.0.x 不兼容 2.0.x, 因此Java Chassis 2、Java Chassis 1不能与Java Chassis 3共存互访. 升级Java Chassis 3, 需要将相关的消费者、提供者和边缘服务同时升级.
-- **原生支持OpenAPI**
+> NOTICE: Java Chassis 1 第一个版本于2018发布,已经停止更新.
- Java Chassis 的接口开发、服务治理都基于 [Swagger](https://swagger.io) ,并通过接口语义检查,使得接口定义符合 [OpenAPI 规范](https://swagger.io/specification/v2/).
-
-- **灵活的开发方式**
+# 快速开始
- 开发者可以使用 `SpringMVC`/`JAX-RS`/`transparent RPC` 任意一种方式定义服务端接口, 并使用`RPC`/`RestTemplate` 等方式访问这些接口. 得益于Java Chassis的通信层与开发方式分离的设计,开发者可以在 `Rest over Vertx`/`Rest over Servlet`/`Highway`等通信模式下自由切换.
+* 定义服务契约
-- **开箱即用的服务治理能力**
+```java
+@RequestMapping(path = "/provider")
+public interface ProviderService {
+ @GetMapping("/sayHello")
+ String sayHello(@RequestParam("name") String name);
+}
+```
- Java Chassis 提供了大量开箱即用的服务治理能力,包括服务发现、熔断容错、负载均衡、流量控制等。
+* 定义提供者
+```java
+@RestSchema(schemaId = "ProviderController", schemaInterface = ProviderService.class)
+public class ProviderController implements ProviderService {
+ @Override
+ public String sayHello(String name) {
+ return "Hello " + name;
+ }
+}
+```
-# 快速开始
+* 定义消费者
-定义提供者:
```java
-import org.apache.servicecomb.*;
-@RpcSchema(schemaId = "helloworld")
-public class HelloWorldProvider implements HelloWorld {
- public String sayHello(String name) {
- return "Hello " + name;
- }
+@Configuration
+public class ProviderServiceConfiguration {
+ @Bean
+ public ProviderService providerService() {
+ return Invoker.createProxy("provider", "ProviderController", ProviderService.class);
+ }
}
```
-定义消费者:
+使用RPC方式访问提供者。
+
```java
-import org.apache.servicecomb.*;
-@Component
-public class HelloWorldConsumer {
- @RpcReference(microserviceName = "pojo", schemaId = "helloworld")
- private static HelloWorld helloWorld;
-
- public static void main(String[] args) {
- helloWorld.sayHello("Tank");
- }
+@RestSchema(schemaId = "ConsumerController", schemaInterface = ConsumerService.class)
+public class ConsumerController implements ConsumerService {
+ private ProviderService providerService;
+
+ @Autowired
+ public void setProviderService(ProviderService providerService) {
+ this.providerService = providerService;
+ }
+
+ @Override
+ public String sayHello(String name) {
+ return providerService.sayHello(name);
+ }
}
```
+下载并体验上述[示例项目](https://servicecomb.apache.org/references/java-chassis/zh_CN/start/first-sample.html) .
+
# 用户文档
请访问 [ServiceComb Java Chassis 开发指南][java-chassis-developer-guide].
[java-chassis-developer-guide]: https://servicecomb.apache.org/references/java-chassis/zh_CN/
-# 编译Java Chassis
+# 编译 Java Chassis
-开发者可以通过公有mavan仓库使用Java Chassis。 如果需要构建项目,需要使用JDK 8版本,并预先安装maven。
+开发者可以通过MAVEN仓库使用Java Chassis。 如果需要构建项目,需要使用JDK 17版本,并预先安装maven。
mvn clean install
@@ -97,13 +122,3 @@ public class HelloWorldConsumer {
# License
Licensed under an [Apache 2.0 license](LICENSE).
-
-# Export Notice
-
-This distribution includes cryptographic software. The country in which you currently reside may have restrictions on the import, possession, use, and/or re-export to another country, of encryption software. BEFORE using any encryption software, please check your country's laws, regulations and policies concerning the import, possession, or use, and re-export of encryption software, to see if this is permitted. See for more information.
-
-The Apache Software Foundation has classified this software as Export Commodity Control Number (ECCN) 5D002, which includes information security software using or performing cryptographic functions with asymmetric algorithms. The form and manner of this Apache Software Foundation distribution makes it eligible for export under the "publicly available" Section 742.15(b) exemption (see the BIS Export Administration Regulations, Section 742.15(b)) for both object code and source code.
-
-The following provides more details on the included cryptographic software:
-
- * Vertx transport can be configured for secure communications
diff --git a/ci/README.md b/ci/README.md
new file mode 100644
index 00000000000..08c14d23741
--- /dev/null
+++ b/ci/README.md
@@ -0,0 +1,25 @@
+# Java Chassis Code Checks
+
+* Compilation and Installation
+
+ see .github/workflows/maven.yml
+
+* Checkstyle
+
+ see .github/workflows/checkstyle.yml
+
+* Rat Check
+
+ see .github/workflows/rat_check.yml
+
+* Spot Bugs
+
+ see .github/workflows/spotbugs.yml
+
+* OWASP Dependency Check
+
+ `mvn verify -Powasp-dependency-check` . Very Slow, run manually.
+
+* Distribution
+
+ `mvn clean deploy -Dcheckstyle.skip -Dspotbugs.skip=true -Dmaven.javadoc.skip=true -DskipTests -Prelease -Pdistribution` . Run manually when preparing a release.
diff --git a/ci/checkstyle/checkstyle.xml b/ci/checkstyle/checkstyle.xml
index 8c34ac08b3d..3813950a5c8 100644
--- a/ci/checkstyle/checkstyle.xml
+++ b/ci/checkstyle/checkstyle.xml
@@ -41,6 +41,10 @@
+
+
+
+
diff --git a/ci/spotbugs/exclude.xml b/ci/spotbugs/exclude.xml
index 0bd13321193..b7c53996e85 100644
--- a/ci/spotbugs/exclude.xml
+++ b/ci/spotbugs/exclude.xml
@@ -35,6 +35,11 @@
+
+
+
+
+
@@ -186,6 +191,41 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -215,11 +255,6 @@
-
-
-
-
-
diff --git a/clients/README.md b/clients/README.md
index bdaaafb125d..53180a4a03b 100644
--- a/clients/README.md
+++ b/clients/README.md
@@ -1,14 +1,13 @@
# About
This module implements common http clients for servicecomb-service-center, servicecomb-kie and other
-3rd-party services.
+3rd-party services.
+
+This module is independent on servicecomb-java-chassis, and can be used in many other projects like
+Spring Cloud, Dubbo, etc.
-This module is independent on servicecomb-java-chassis, and can be used in many other projects like
-Spring Cloud, Dubbo, etc.
-
# 关于
-这个模块给 servicecomb-service-center, servicecomb-kie 以及其他第三方服务实现通用的 Http Client。
+这个模块给 servicecomb-service-center, servicecomb-kie 以及其他第三方服务实现通用的 Http Client。
这个模块独立于 servicecomb-java-chassis, 可以用于 Spring Cloud, Dubbo 等项目。
-
diff --git a/clients/config-center-client/pom.xml b/clients/config-center-client/pom.xml
index 2de6ce378f7..e7e2fa1fc2b 100644
--- a/clients/config-center-client/pom.xml
+++ b/clients/config-center-client/pom.xml
@@ -22,7 +22,7 @@
clients
org.apache.servicecomb
- 3.0.0-SNAPSHOT
+ 3.4.0-SNAPSHOT
4.0.0
diff --git a/clients/config-center-client/src/main/java/org/apache/servicecomb/config/center/client/ConfigCenterAddressManager.java b/clients/config-center-client/src/main/java/org/apache/servicecomb/config/center/client/ConfigCenterAddressManager.java
index 3b346153a0b..977c84ef63f 100644
--- a/clients/config-center-client/src/main/java/org/apache/servicecomb/config/center/client/ConfigCenterAddressManager.java
+++ b/clients/config-center-client/src/main/java/org/apache/servicecomb/config/center/client/ConfigCenterAddressManager.java
@@ -28,8 +28,9 @@
public class ConfigCenterAddressManager extends AbstractAddressManager {
- public ConfigCenterAddressManager(String projectName, List addresses, EventBus eventBus) {
- super(projectName, addresses);
+ public ConfigCenterAddressManager(String projectName, List addresses, EventBus eventBus, String region,
+ String availableZone) {
+ super(projectName, addresses, region, availableZone);
eventBus.register(this);
}
diff --git a/clients/config-center-client/src/main/java/org/apache/servicecomb/config/center/client/ConfigCenterClient.java b/clients/config-center-client/src/main/java/org/apache/servicecomb/config/center/client/ConfigCenterClient.java
index a8ee3b99ec0..8ed31a5a61b 100644
--- a/clients/config-center-client/src/main/java/org/apache/servicecomb/config/center/client/ConfigCenterClient.java
+++ b/clients/config-center-client/src/main/java/org/apache/servicecomb/config/center/client/ConfigCenterClient.java
@@ -18,7 +18,9 @@
package org.apache.servicecomb.config.center.client;
import java.io.IOException;
+import java.util.ArrayList;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import org.apache.commons.lang3.StringUtils;
@@ -30,10 +32,14 @@
import org.apache.servicecomb.http.client.common.HttpResponse;
import org.apache.servicecomb.http.client.common.HttpTransport;
import org.apache.servicecomb.http.client.common.HttpUtils;
+import org.apache.servicecomb.http.client.event.OperationEvents.UnAuthorizedOperationEvent;
+import org.apache.servicecomb.http.client.utils.ServiceCombServiceAvailableUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import org.springframework.util.CollectionUtils;
import com.fasterxml.jackson.core.type.TypeReference;
+import com.google.common.eventbus.EventBus;
public class ConfigCenterClient implements ConfigCenterOperation {
private static final Logger LOGGER = LoggerFactory.getLogger(ConfigCenterClient.class);
@@ -48,24 +54,34 @@ public class ConfigCenterClient implements ConfigCenterOperation {
public static final String DARK_LAUNCH = "darklaunch@";
+ private static final String ADDRESS_CHECK_PATH = "/v3/default/configuration/health?mode=readiness";
+
private final HttpTransport httpTransport;
private final ConfigCenterAddressManager addressManager;
+ private final Map> dimensionConfigNames = new HashMap<>();
+
+ private EventBus eventBus;
+
public ConfigCenterClient(ConfigCenterAddressManager addressManager, HttpTransport httpTransport) {
this.addressManager = addressManager;
this.httpTransport = httpTransport;
}
+ public void setEventBus(EventBus eventBus) {
+ this.eventBus = eventBus;
+ addressManager.setEventBus(eventBus);
+ }
+
@Override
- public QueryConfigurationsResponse queryConfigurations(QueryConfigurationsRequest request) {
+ public QueryConfigurationsResponse queryConfigurations(QueryConfigurationsRequest request, String address) {
String dimensionsInfo = buildDimensionsInfo(request, true);
QueryConfigurationsResponse queryConfigurationsResponse = new QueryConfigurationsResponse();
Map configurations = new HashMap<>();
String uri = null;
- String address = addressManager.address();
try {
uri = address + "/configuration/items?dimensionsInfo="
+ HttpUtils.encodeURLParam(dimensionsInfo) + "&revision=" + request.getRevision();
@@ -76,6 +92,7 @@ public QueryConfigurationsResponse queryConfigurations(QueryConfigurationsReques
HttpRequest.GET);
HttpResponse httpResponse = httpTransport.doRequest(httpRequest);
+ recordAndSendUnAuthorizedEvent(httpResponse, address);
if (httpResponse.getStatusCode() == HttpStatus.SC_OK) {
Map> allConfigMap = HttpUtils.deserialize(
httpResponse.getContent(),
@@ -88,31 +105,38 @@ public QueryConfigurationsResponse queryConfigurations(QueryConfigurationsReques
if (allConfigMap.get(APPLICATION_CONFIG) != null) {
configurations.putAll(allConfigMap.get(APPLICATION_CONFIG));
+ logConfigurationNames(APPLICATION_CONFIG, allConfigMap.get(APPLICATION_CONFIG));
}
if (allConfigMap.get(buildDimensionsInfo(request, false)) != null) {
configurations.putAll(allConfigMap.get(buildDimensionsInfo(request, false)));
+ logConfigurationNames(buildDimensionsInfo(request, false),
+ allConfigMap.get(buildDimensionsInfo(request, false)));
}
if (allConfigMap.get(buildDarkLaunchDimensionsInfo(request)) != null) {
configurations.putAll(allConfigMap.get(buildDarkLaunchDimensionsInfo(request)));
+ logConfigurationNames(buildDarkLaunchDimensionsInfo(request),
+ allConfigMap.get(buildDarkLaunchDimensionsInfo(request)));
}
if (allConfigMap.get(dimensionsInfo) != null) {
configurations.putAll(allConfigMap.get(dimensionsInfo));
+ logConfigurationNames(dimensionsInfo, allConfigMap.get(dimensionsInfo));
}
queryConfigurationsResponse.setConfigurations(configurations);
queryConfigurationsResponse.setChanged(true);
- addressManager.recordSuccessState(address);
return queryConfigurationsResponse;
} else if (httpResponse.getStatusCode() == HttpStatus.SC_NOT_MODIFIED) {
queryConfigurationsResponse.setChanged(false);
- addressManager.recordSuccessState(address);
+ return queryConfigurationsResponse;
+ } else if (httpResponse.getStatusCode() == HttpStatus.SC_TOO_MANY_REQUESTS) {
+ LOGGER.warn("rate limited, keep the local dimension [{}] configs unchanged.", dimensionsInfo);
+ queryConfigurationsResponse.setChanged(false);
return queryConfigurationsResponse;
} else if (httpResponse.getStatusCode() == HttpStatus.SC_BAD_REQUEST) {
throw new OperationException("Bad request for query configurations.");
} else {
- addressManager.recordFailState(address);
throw new OperationException(
"read response failed. status:"
+ httpResponse.getStatusCode()
@@ -128,6 +152,53 @@ public QueryConfigurationsResponse queryConfigurations(QueryConfigurationsReques
}
}
+ private void recordAndSendUnAuthorizedEvent(HttpResponse response, String address) {
+ if (this.eventBus != null && response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) {
+ LOGGER.warn("query configuration unauthorized from server [{}], message [{}]", address, response.getMessage());
+ addressManager.recordFailState(address);
+ this.eventBus.post(new UnAuthorizedOperationEvent(address));
+ } else {
+ addressManager.recordSuccessState(address);
+ }
+ }
+
+ /**
+ * Only the name of the new configuration item is printed.
+ * No log is printed when the configuration content is updated.
+ *
+ * @param dimension dimension
+ * @param configs configs
+ */
+ private void logConfigurationNames(String dimension, Map configs) {
+ if (CollectionUtils.isEmpty(configs)) {
+ return;
+ }
+ List configNames = dimensionConfigNames.get(dimension);
+ if (configNames == null) {
+ configNames = new ArrayList<>();
+ }
+ StringBuilder names = new StringBuilder();
+ for (String key : configs.keySet()) {
+ if (configNames.contains(key)) {
+ continue;
+ }
+ names.append(key).append(",");
+ configNames.add(key);
+ }
+ if (names.isEmpty()) {
+ return;
+ }
+ dimensionConfigNames.put(dimension, configNames);
+ String fileNames = names.substring(0, names.length() - 1);
+ LOGGER.info("pulling dimension [{}] configurations success, get config names: [{}].",
+ dimension, fileNames);
+ }
+
+ @Override
+ public void checkAddressAvailable(String address) {
+ ServiceCombServiceAvailableUtils.checkAddressAvailable(addressManager, address, httpTransport, ADDRESS_CHECK_PATH);
+ }
+
private String buildDimensionsInfo(QueryConfigurationsRequest request, boolean withVersion) {
String result =
request.getServiceName() + DEFAULT_APP_SEPARATOR
diff --git a/clients/config-center-client/src/main/java/org/apache/servicecomb/config/center/client/ConfigCenterConfigurationChangedEvent.java b/clients/config-center-client/src/main/java/org/apache/servicecomb/config/center/client/ConfigCenterConfigurationChangedEvent.java
new file mode 100644
index 00000000000..448c51a3d79
--- /dev/null
+++ b/clients/config-center-client/src/main/java/org/apache/servicecomb/config/center/client/ConfigCenterConfigurationChangedEvent.java
@@ -0,0 +1,100 @@
+/*
+ * 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.servicecomb.config.center.client;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+
+/**
+ * This event is fired when configuration changed of config center.
+ */
+public class ConfigCenterConfigurationChangedEvent {
+ private final Map added;
+
+ private final Map deleted;
+
+ private final Map updated;
+
+ private Set changed;
+
+ private ConfigCenterConfigurationChangedEvent(Map added, Map updated,
+ Map deleted) {
+ this.added = added;
+ this.deleted = deleted;
+ this.updated = updated;
+ this.changed = new HashSet<>();
+ this.changed.addAll(added.keySet());
+ this.changed.addAll(updated.keySet());
+ this.changed.addAll(deleted.keySet());
+ }
+
+ public static ConfigCenterConfigurationChangedEvent createIncremental(Map latest,
+ Map last) {
+ Map itemsCreated = new HashMap<>();
+ Map itemsDeleted = new HashMap<>();
+ Map itemsModified = new HashMap<>();
+
+ for (Map.Entry entry : latest.entrySet()) {
+ String itemKey = entry.getKey();
+ if (!last.containsKey(itemKey)) {
+ itemsCreated.put(itemKey, entry.getValue());
+ } else if (!Objects.equals(last.get(itemKey), latest.get(itemKey))) {
+ itemsModified.put(itemKey, entry.getValue());
+ }
+ }
+ for (String itemKey : last.keySet()) {
+ if (!latest.containsKey(itemKey)) {
+ itemsDeleted.put(itemKey, null);
+ }
+ }
+ ConfigCenterConfigurationChangedEvent event = ConfigCenterConfigurationChangedEvent
+ .createIncremental(itemsCreated, itemsModified, itemsDeleted);
+ return event;
+ }
+
+ public static ConfigCenterConfigurationChangedEvent createIncremental(Map added,
+ Map updated,
+ Map deleted) {
+ return new ConfigCenterConfigurationChangedEvent(added, updated, deleted);
+ }
+
+ public static ConfigCenterConfigurationChangedEvent createIncremental(Map updated) {
+ return new ConfigCenterConfigurationChangedEvent(new HashMap<>(), updated, new HashMap<>());
+ }
+
+ public final Map getAdded() {
+ return added;
+ }
+
+
+ public final Map getUpdated() {
+ return updated;
+ }
+
+
+ public final Map getDeleted() {
+ return deleted;
+ }
+
+ public final Set getChanged() {
+ return changed;
+ }
+}
diff --git a/clients/config-center-client/src/main/java/org/apache/servicecomb/config/center/client/ConfigCenterManager.java b/clients/config-center-client/src/main/java/org/apache/servicecomb/config/center/client/ConfigCenterManager.java
index 9a89b92a6dc..7bfc43b4e05 100644
--- a/clients/config-center-client/src/main/java/org/apache/servicecomb/config/center/client/ConfigCenterManager.java
+++ b/clients/config-center-client/src/main/java/org/apache/servicecomb/config/center/client/ConfigCenterManager.java
@@ -17,13 +17,13 @@
package org.apache.servicecomb.config.center.client;
+import java.util.List;
import java.util.Map;
import org.apache.servicecomb.config.center.client.model.ConfigCenterConfiguration;
import org.apache.servicecomb.config.center.client.model.QueryConfigurationsRequest;
import org.apache.servicecomb.config.center.client.model.QueryConfigurationsResponse;
import org.apache.servicecomb.config.common.ConfigConverter;
-import org.apache.servicecomb.config.common.ConfigurationChangedEvent;
import org.apache.servicecomb.http.client.task.AbstractTask;
import org.apache.servicecomb.http.client.task.Task;
import org.slf4j.Logger;
@@ -45,13 +45,16 @@ public class ConfigCenterManager extends AbstractTask {
private final ConfigCenterConfiguration configCenterConfiguration;
- public ConfigCenterManager(ConfigCenterClient configCenterClient, EventBus eventBus,
- ConfigConverter configConverter, ConfigCenterConfiguration configCenterConfiguration) {
+ private final ConfigCenterAddressManager configCenterAddressManager;
+
+ public ConfigCenterManager(ConfigCenterClient configCenterClient, EventBus eventBus, ConfigConverter configConverter,
+ ConfigCenterConfiguration configCenterConfiguration, ConfigCenterAddressManager configCenterAddressManager) {
super("config-center-configuration-task");
this.configCenterClient = configCenterClient;
this.eventBus = eventBus;
this.configConverter = configConverter;
this.configCenterConfiguration = configCenterConfiguration;
+ this.configCenterAddressManager = configCenterAddressManager;
}
public void setQueryConfigurationsRequest(QueryConfigurationsRequest queryConfigurationsRequest) {
@@ -60,6 +63,8 @@ public void setQueryConfigurationsRequest(QueryConfigurationsRequest queryConfig
public void startConfigCenterManager() {
this.startTask(new PollConfigurationTask(0));
+ schedulerCheckAddressAvailable("cc-addr-check", new CheckConfigCenterAddressTask(),
+ configCenterConfiguration.getRefreshIntervalInMillis());
}
class PollConfigurationTask implements Task {
@@ -72,19 +77,37 @@ public PollConfigurationTask(int failCount) {
@Override
public void execute() {
try {
- QueryConfigurationsResponse response = configCenterClient.queryConfigurations(queryConfigurationsRequest);
+ QueryConfigurationsResponse response = configCenterClient.queryConfigurations(queryConfigurationsRequest,
+ configCenterAddressManager.address());
if (response.isChanged()) {
queryConfigurationsRequest.setRevision(response.getRevision());
Map lastData = configConverter.updateData(response.getConfigurations());
- ConfigurationChangedEvent event = ConfigurationChangedEvent
+ ConfigCenterConfigurationChangedEvent event = ConfigCenterConfigurationChangedEvent
.createIncremental(configConverter.getCurrentData(), lastData);
- eventBus.post(event);
+ if (!event.getChanged().isEmpty()) {
+ eventBus.post(event);
+ }
}
- startTask(new BackOffSleepTask(configCenterConfiguration.getRefreshIntervalInMillis(), new PollConfigurationTask(0)));
+ startTask(
+ new BackOffSleepTask(configCenterConfiguration.getRefreshIntervalInMillis(), new PollConfigurationTask(0)));
} catch (Exception e) {
- LOGGER.error("get configurations from ConfigCenter failed, and will try again.", e);
+ LOGGER.warn("get configurations from ConfigCenter failed, and will try again, cause message: {}. current "
+ + "fail does not affect the obtained historical configuration.", e.getCause().getMessage());
startTask(new BackOffSleepTask(failCount + 1, new PollConfigurationTask(failCount + 1)));
}
}
}
+
+ class CheckConfigCenterAddressTask implements Runnable {
+ @Override
+ public void run() {
+ List isolationAddresses = configCenterAddressManager.getIsolationAddresses();
+ if (isolationAddresses.isEmpty()) {
+ return;
+ }
+ for (String address : isolationAddresses) {
+ configCenterClient.checkAddressAvailable(address);
+ }
+ }
+ }
}
diff --git a/clients/config-center-client/src/main/java/org/apache/servicecomb/config/center/client/ConfigCenterOperation.java b/clients/config-center-client/src/main/java/org/apache/servicecomb/config/center/client/ConfigCenterOperation.java
index 5e3a2207067..919e9f30cd7 100644
--- a/clients/config-center-client/src/main/java/org/apache/servicecomb/config/center/client/ConfigCenterOperation.java
+++ b/clients/config-center-client/src/main/java/org/apache/servicecomb/config/center/client/ConfigCenterOperation.java
@@ -25,8 +25,16 @@ public interface ConfigCenterOperation {
/**
* 根据查询条件查询配置项。
* @param request 查询的维度(project, application, serviceName, version) 和 revision 信息。
+ * @param address 查询的配置中心地址。
* @return 如果存在配置变更,返回全量的配置项, changed = true。 如果没有变更, 返回 null, changed = false,
* @throws OperationException If some problems happened to contact service center or non http 200 returned.
*/
- QueryConfigurationsResponse queryConfigurations(QueryConfigurationsRequest request);
+ QueryConfigurationsResponse queryConfigurations(QueryConfigurationsRequest request, String address);
+
+ /**
+ * Check config center isolation address available
+ *
+ * @param address isolation address
+ */
+ void checkAddressAvailable(String address);
}
diff --git a/clients/config-common/pom.xml b/clients/config-common/pom.xml
index 58991dedd61..ff10b993583 100644
--- a/clients/config-common/pom.xml
+++ b/clients/config-common/pom.xml
@@ -22,7 +22,7 @@
clients
org.apache.servicecomb
- 3.0.0-SNAPSHOT
+ 3.4.0-SNAPSHOT
4.0.0
@@ -41,4 +41,4 @@
-
\ No newline at end of file
+
diff --git a/clients/config-common/src/main/java/org/apache/servicecomb/config/common/ConfigurationChangedEvent.java b/clients/config-common/src/main/java/org/apache/servicecomb/config/common/ConfigurationChangedEvent.java
deleted file mode 100644
index e24d061a65a..00000000000
--- a/clients/config-common/src/main/java/org/apache/servicecomb/config/common/ConfigurationChangedEvent.java
+++ /dev/null
@@ -1,97 +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.servicecomb.config.common;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Objects;
-
-public class ConfigurationChangedEvent {
- private final Map added;
-
- private final Map deleted;
-
- private final Map updated;
-
- private final boolean changed;
-
- private Map complete;
-
- private ConfigurationChangedEvent(Map added, Map updated,
- Map deleted, boolean changed) {
- this.added = added;
- this.deleted = deleted;
- this.updated = updated;
- this.changed = changed;
- }
-
- public static ConfigurationChangedEvent createIncremental(Map latest, Map last) {
- Map itemsCreated = new HashMap<>();
- Map itemsDeleted = new HashMap<>();
- Map itemsModified = new HashMap<>();
- boolean changed = false;
-
- for (Map.Entry entry : latest.entrySet()) {
- String itemKey = entry.getKey();
- if (!last.containsKey(itemKey)) {
- itemsCreated.put(itemKey, entry.getValue());
- changed = true;
- } else if (!Objects.equals(last.get(itemKey), latest.get(itemKey))) {
- itemsModified.put(itemKey, entry.getValue());
- changed = true;
- }
- }
- for (String itemKey : last.keySet()) {
- if (!latest.containsKey(itemKey)) {
- itemsDeleted.put(itemKey, null);
- changed = true;
- }
- }
- ConfigurationChangedEvent event = ConfigurationChangedEvent
- .createIncremental(itemsCreated, itemsModified, itemsDeleted, changed);
- event.complete = latest;
- return event;
- }
-
- private static ConfigurationChangedEvent createIncremental(Map added, Map updated,
- Map deleted, boolean changed) {
- return new ConfigurationChangedEvent(added, updated, deleted, changed);
- }
-
- public final Map getAdded() {
- return added;
- }
-
-
- public final Map getUpdated() {
- return updated;
- }
-
-
- public final Map getDeleted() {
- return deleted;
- }
-
- public final Map getComplete() {
- return complete;
- }
-
- public final boolean isChanged() {
- return changed;
- }
-}
diff --git a/clients/config-common/src/test/java/org/apache/servicecomb/config/common/TestConfigurationChangedEvent.java b/clients/config-common/src/test/java/org/apache/servicecomb/config/common/TestConfigurationChangedEvent.java
deleted file mode 100644
index 85c84e020af..00000000000
--- a/clients/config-common/src/test/java/org/apache/servicecomb/config/common/TestConfigurationChangedEvent.java
+++ /dev/null
@@ -1,47 +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.servicecomb.config.common;
-
-import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.Test;
-
-import java.util.HashMap;
-import java.util.Map;
-
-public class TestConfigurationChangedEvent {
- @Test
- public void testConfigurationChangedEvent() {
- Map before = new HashMap<>();
- Map after = new HashMap<>();
- before.put("updated", "1");
- before.put("deleted", "1");
- before.put("notChanged", null);
-
- after.put("added", 1);
- after.put("updated", 2);
- after.put("addedNull", null);
- after.put("notChanged", null);
-
- ConfigurationChangedEvent event = ConfigurationChangedEvent.createIncremental(after, before);
- Assertions.assertEquals(2, event.getAdded().size());
- Assertions.assertEquals(1, event.getDeleted().size());
- Assertions.assertEquals(1, event.getUpdated().size());
- Assertions.assertEquals(4, event.getComplete().size());
- Assertions.assertTrue(event.isChanged());
- }
-}
diff --git a/clients/config-kie-client/pom.xml b/clients/config-kie-client/pom.xml
index 4c520dd359e..30dac44ba53 100644
--- a/clients/config-kie-client/pom.xml
+++ b/clients/config-kie-client/pom.xml
@@ -22,7 +22,7 @@
clients
org.apache.servicecomb
- 3.0.0-SNAPSHOT
+ 3.4.0-SNAPSHOT
4.0.0
@@ -51,4 +51,4 @@
-
\ No newline at end of file
+
diff --git a/clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/KieClient.java b/clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/KieClient.java
index 1e099e030f1..b98a7d3b2a1 100644
--- a/clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/KieClient.java
+++ b/clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/KieClient.java
@@ -17,11 +17,16 @@
package org.apache.servicecomb.config.kie.client;
+import com.google.common.eventbus.EventBus;
+
import java.io.StringReader;
import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
import java.util.Collections;
+import java.util.Comparator;
import java.util.Enumeration;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.stream.Collectors;
@@ -41,15 +46,20 @@
import org.apache.servicecomb.http.client.common.HttpResponse;
import org.apache.servicecomb.http.client.common.HttpTransport;
import org.apache.servicecomb.http.client.common.HttpUtils;
+import org.apache.servicecomb.http.client.event.OperationEvents.UnAuthorizedOperationEvent;
+import org.apache.servicecomb.http.client.utils.ServiceCombServiceAvailableUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.config.YamlPropertiesFactoryBean;
import org.springframework.core.io.ByteArrayResource;
+import org.springframework.util.CollectionUtils;
public class KieClient implements KieConfigOperation {
private static final Logger LOGGER = LoggerFactory.getLogger(KieClient.class);
+ private static final String ADDRESS_CHECK_PATH = "/v1/health";
+
protected HttpTransport httpTransport;
protected String revision = "0";
@@ -60,15 +70,23 @@ public class KieClient implements KieConfigOperation {
public static final String DEFAULT_KIE_API_VERSION = "v1";
+ private final Map> dimensionConfigNames = new HashMap<>();
+
+ private EventBus eventBus;
+
public KieClient(KieAddressManager addressManager, HttpTransport httpTransport, KieConfiguration kieConfiguration) {
this.httpTransport = httpTransport;
this.addressManager = addressManager;
this.kieConfiguration = kieConfiguration;
}
+ public void setEventBus(EventBus eventBus) {
+ this.eventBus = eventBus;
+ addressManager.setEventBus(eventBus);
+ }
+
@Override
- public ConfigurationsResponse queryConfigurations(ConfigurationsRequest request) {
- String address = addressManager.address();
+ public ConfigurationsResponse queryConfigurations(ConfigurationsRequest request, String address) {
String url = buildUrl(request, address);
try {
if (kieConfiguration.isEnableLongPolling()) {
@@ -77,15 +95,16 @@ public ConfigurationsResponse queryConfigurations(ConfigurationsRequest request)
HttpRequest httpRequest = new HttpRequest(url, null, null, HttpRequest.GET);
HttpResponse httpResponse = httpTransport.doRequest(httpRequest);
+ recordAndSendUnAuthorizedEvent(httpResponse, address);
ConfigurationsResponse configurationsResponse = new ConfigurationsResponse();
if (httpResponse.getStatusCode() == HttpStatus.SC_OK) {
revision = httpResponse.getHeader("X-Kie-Revision");
KVResponse allConfigList = HttpUtils.deserialize(httpResponse.getContent(), KVResponse.class);
+ logConfigurationNames(request.getLabelsQuery(), allConfigList.getData());
Map configurations = getConfigByLabel(allConfigList);
configurationsResponse.setConfigurations(configurations);
configurationsResponse.setChanged(true);
configurationsResponse.setRevision(revision);
- addressManager.recordSuccessState(address);
return configurationsResponse;
}
if (httpResponse.getStatusCode() == HttpStatus.SC_BAD_REQUEST) {
@@ -93,19 +112,70 @@ public ConfigurationsResponse queryConfigurations(ConfigurationsRequest request)
}
if (httpResponse.getStatusCode() == HttpStatus.SC_NOT_MODIFIED) {
configurationsResponse.setChanged(false);
- addressManager.recordSuccessState(address);
return configurationsResponse;
}
- addressManager.recordFailState(address);
+ if (httpResponse.getStatusCode() == HttpStatus.SC_TOO_MANY_REQUESTS) {
+ LOGGER.warn("rate limited, keep the local dimension [{}] configs unchanged.", request.getLabelsQuery());
+ configurationsResponse.setChanged(false);
+ return configurationsResponse;
+ }
throw new OperationException(
"read response failed. status:" + httpResponse.getStatusCode() + "; message:" +
httpResponse.getMessage() + "; content:" + httpResponse.getContent());
} catch (Exception e) {
+ addressManager.recordFailState(address);
LOGGER.error("query configuration from {} failed, message={}", url, e.getMessage());
throw new OperationException("read response failed. ", e);
}
}
+ private void recordAndSendUnAuthorizedEvent(HttpResponse response, String address) {
+ if (this.eventBus != null && response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) {
+ LOGGER.warn("query configuration unauthorized from server [{}], message [{}]", address, response.getMessage());
+ addressManager.recordFailState(address);
+ this.eventBus.post(new UnAuthorizedOperationEvent(address));
+ } else {
+ addressManager.recordSuccessState(address);
+ }
+ }
+
+ /**
+ * Only the name of the new configuration item is printed.
+ * No log is printed when the configuration content is updated.
+ *
+ * @param dimension dimension
+ * @param data configs-data
+ */
+ private void logConfigurationNames(String dimension, List data) {
+ if (CollectionUtils.isEmpty(data)) {
+ return;
+ }
+ List configNames = dimensionConfigNames.get(dimension);
+ if (configNames == null) {
+ configNames = new ArrayList<>();
+ }
+ StringBuilder names = new StringBuilder();
+ for (KVDoc doc : data) {
+ if (configNames.contains(doc.getKey())) {
+ continue;
+ }
+ names.append(doc.getKey()).append(",");
+ configNames.add(doc.getKey());
+ }
+ if (names.isEmpty()) {
+ return;
+ }
+ dimensionConfigNames.put(dimension, configNames);
+ String fileNames = names.substring(0, names.length() - 1);
+ LOGGER.info("pulling dimension [{}] configurations success, get config names: [{}].",
+ dimension, fileNames);
+ }
+
+ @Override
+ public void checkAddressAvailable(String address) {
+ ServiceCombServiceAvailableUtils.checkAddressAvailable(addressManager, address, httpTransport, ADDRESS_CHECK_PATH);
+ }
+
private String buildUrl(ConfigurationsRequest request, String currentAddress) {
StringBuilder sb = new StringBuilder();
sb.append(currentAddress);
@@ -126,6 +196,7 @@ private String buildUrl(ConfigurationsRequest request, String currentAddress) {
private Map getConfigByLabel(KVResponse resp) {
Map resultMap = new HashMap<>();
resp.getData().stream()
+ .sorted(Comparator.comparing(KVDoc::getUpdateTime, Comparator.nullsFirst(Comparator.naturalOrder())))
.filter(doc -> doc.getStatus() == null || ConfigConstants.STATUS_ENABLED.equalsIgnoreCase(doc.getStatus()))
.map(this::processValueType)
.collect(Collectors.toList())
diff --git a/clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/KieConfigManager.java b/clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/KieConfigManager.java
index 7c1eaf92383..ed251613530 100644
--- a/clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/KieConfigManager.java
+++ b/clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/KieConfigManager.java
@@ -23,10 +23,10 @@
import java.util.concurrent.Executors;
import org.apache.servicecomb.config.common.ConfigConverter;
-import org.apache.servicecomb.config.common.ConfigurationChangedEvent;
import org.apache.servicecomb.config.kie.client.model.ConfigurationsRequest;
import org.apache.servicecomb.config.kie.client.model.ConfigurationsRequestFactory;
import org.apache.servicecomb.config.kie.client.model.ConfigurationsResponse;
+import org.apache.servicecomb.config.kie.client.model.KieAddressManager;
import org.apache.servicecomb.config.kie.client.model.KieConfiguration;
import org.apache.servicecomb.http.client.task.AbstractTask;
import org.apache.servicecomb.http.client.task.Task;
@@ -51,9 +51,10 @@ public class KieConfigManager extends AbstractTask {
private final KieConfiguration kieConfiguration;
+ private final KieAddressManager kieAddressManager;
+
public KieConfigManager(KieConfigOperation configKieClient, EventBus eventBus,
- KieConfiguration kieConfiguration,
- ConfigConverter configConverter) {
+ KieConfiguration kieConfiguration, ConfigConverter configConverter, KieAddressManager kieAddressManager) {
super("config-center-configuration-task");
this.configurationsRequests = ConfigurationsRequestFactory.buildConfigurationRequests(kieConfiguration);
this.configurationsRequests.sort(ConfigurationsRequest::compareTo);
@@ -61,27 +62,44 @@ public KieConfigManager(KieConfigOperation configKieClient, EventBus eventBus,
this.eventBus = eventBus;
this.configConverter = configConverter;
this.kieConfiguration = kieConfiguration;
+ this.kieAddressManager = kieAddressManager;
}
public void firstPull() {
+ Map data = new HashMap<>();
try {
- Map data = new HashMap<>();
- this.configurationsRequests.forEach(r -> {
- r.setRevision(ConfigurationsRequest.INITIAL_REVISION);
- ConfigurationsResponse response = configKieClient.queryConfigurations(r);
- if (response.isChanged()) {
- r.setRevision(response.getRevision());
- r.setLastRawData(response.getConfigurations());
- data.putAll(response.getConfigurations());
- }
- });
- this.configConverter.updateData(data);
- } catch (RuntimeException e) {
+ firstQueryConfigurations(data);
+ } catch (Exception e) {
if (this.kieConfiguration.isFirstPullRequired()) {
throw e;
} else {
- LOGGER.warn("first pull failed, and ignore {}", e.getMessage());
+ LOGGER.warn("first pull failed!");
+ }
+ }
+ }
+
+ private void firstQueryConfigurations(Map data) {
+ for (int i = 0; i < 3;) {
+ String address = kieAddressManager.address();
+ try {
+ this.configurationsRequests.forEach(r -> {
+ r.setRevision(ConfigurationsRequest.INITIAL_REVISION);
+ ConfigurationsResponse response = configKieClient.queryConfigurations(r, address);
+ if (response.isChanged()) {
+ r.setRevision(response.getRevision());
+ r.setLastRawData(response.getConfigurations());
+ data.putAll(response.getConfigurations());
+ }
+ });
+ this.configConverter.updateData(data);
+ break;
+ } catch (Exception e) {
+ if (i == 2) {
+ throw e;
+ }
+ LOGGER.warn("firstQueryConfigurations failed, config address {} and ignore {}", address, e.getMessage());
}
+ i++;
}
}
@@ -90,9 +108,9 @@ private void onDataChanged() {
this.configurationsRequests.forEach(r -> latestData.putAll(r.getLastRawData()));
Map lastData = configConverter.updateData(latestData);
- ConfigurationChangedEvent event = ConfigurationChangedEvent
+ KieConfigurationChangedEvent event = KieConfigurationChangedEvent
.createIncremental(configConverter.getCurrentData(), lastData);
- if (event.isChanged()) {
+ if (!event.getChanged().isEmpty()) {
eventBus.post(event);
}
}
@@ -106,6 +124,8 @@ protected void initTaskPool(String taskName) {
public void startConfigKieManager() {
this.configurationsRequests.forEach((t) ->
this.startTask(new PollConfigurationTask(0, t)));
+ schedulerCheckAddressAvailable("kie-addr-check", new CheckKieAddressTask(),
+ kieConfiguration.getRefreshIntervalInMillis());
}
class PollConfigurationTask implements Task {
@@ -121,22 +141,39 @@ public PollConfigurationTask(int failCount, ConfigurationsRequest configurations
@Override
public void execute() {
try {
- ConfigurationsResponse response = configKieClient.queryConfigurations(configurationsRequest);
+ ConfigurationsResponse response = configKieClient.queryConfigurations(configurationsRequest,
+ kieAddressManager.address());
if (response.isChanged()) {
configurationsRequest.setRevision(response.getRevision());
configurationsRequest.setLastRawData(response.getConfigurations());
onDataChanged();
}
if (KieConfigManager.this.kieConfiguration.isEnableLongPolling()) {
- startTask(new BackOffSleepTask(LONG_POLLING_INTERVAL, new PollConfigurationTask(0, this.configurationsRequest)));
+ startTask(
+ new BackOffSleepTask(LONG_POLLING_INTERVAL, new PollConfigurationTask(0, this.configurationsRequest)));
} else {
- startTask(new BackOffSleepTask(kieConfiguration.getRefreshIntervalInMillis(), new PollConfigurationTask(0, this.configurationsRequest)));
+ startTask(new BackOffSleepTask(kieConfiguration.getRefreshIntervalInMillis(),
+ new PollConfigurationTask(0, this.configurationsRequest)));
}
} catch (Exception e) {
- LOGGER.error("get configurations from KieConfigCenter failed, and will try again.", e);
+ LOGGER.warn("get configurations from KieConfigCenter failed, and will try again, cause message: {}. current "
+ + "fail does not affect the obtained historical configuration.", e.getCause().getMessage());
startTask(
new BackOffSleepTask(failCount + 1, new PollConfigurationTask(failCount + 1, this.configurationsRequest)));
}
}
}
+
+ class CheckKieAddressTask implements Runnable {
+ @Override
+ public void run() {
+ List isolationAddresses = kieAddressManager.getIsolationAddresses();
+ if (isolationAddresses.isEmpty()) {
+ return;
+ }
+ for (String address : isolationAddresses) {
+ configKieClient.checkAddressAvailable(address);
+ }
+ }
+ }
}
diff --git a/clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/KieConfigOperation.java b/clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/KieConfigOperation.java
index 364774fd22a..135ad0c220a 100644
--- a/clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/KieConfigOperation.java
+++ b/clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/KieConfigOperation.java
@@ -26,8 +26,16 @@ public interface KieConfigOperation {
/**
* 根据查询条件查询配置项。
* @param request 查询的维度(project, application, serviceName, version) 和 revision 信息。
+ * @param address 查询的配置中心地址。
* @return 如果存在配置变更,返回全量的配置项, changed = true。 如果没有变更, 返回 null, changed = false,
* @throws OperationException If some problems happened to contact service center or non http 200 returned.
*/
- ConfigurationsResponse queryConfigurations(ConfigurationsRequest request);
+ ConfigurationsResponse queryConfigurations(ConfigurationsRequest request, String address);
+
+ /**
+ * Check kie isolation address available
+ *
+ * @param address isolation address
+ */
+ void checkAddressAvailable(String address);
}
diff --git a/clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/KieConfigurationChangedEvent.java b/clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/KieConfigurationChangedEvent.java
new file mode 100644
index 00000000000..0e22c17e8b9
--- /dev/null
+++ b/clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/KieConfigurationChangedEvent.java
@@ -0,0 +1,98 @@
+/*
+ * 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.servicecomb.config.kie.client;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+
+/**
+ * This event is fired when configuration changed of kie.
+ */
+public class KieConfigurationChangedEvent {
+ private final Map added;
+
+ private final Map deleted;
+
+ private final Map updated;
+
+ private Set changed;
+
+ private KieConfigurationChangedEvent(Map added, Map updated,
+ Map deleted) {
+ this.added = added;
+ this.deleted = deleted;
+ this.updated = updated;
+ this.changed = new HashSet<>();
+ this.changed.addAll(added.keySet());
+ this.changed.addAll(updated.keySet());
+ this.changed.addAll(deleted.keySet());
+ }
+
+ public static KieConfigurationChangedEvent createIncremental(Map latest, Map last) {
+ Map itemsCreated = new HashMap<>();
+ Map itemsDeleted = new HashMap<>();
+ Map itemsModified = new HashMap<>();
+
+ for (Map.Entry entry : latest.entrySet()) {
+ String itemKey = entry.getKey();
+ if (!last.containsKey(itemKey)) {
+ itemsCreated.put(itemKey, entry.getValue());
+ } else if (!Objects.equals(last.get(itemKey), latest.get(itemKey))) {
+ itemsModified.put(itemKey, entry.getValue());
+ }
+ }
+ for (String itemKey : last.keySet()) {
+ if (!latest.containsKey(itemKey)) {
+ itemsDeleted.put(itemKey, null);
+ }
+ }
+ KieConfigurationChangedEvent event = KieConfigurationChangedEvent
+ .createIncremental(itemsCreated, itemsModified, itemsDeleted);
+ return event;
+ }
+
+ public static KieConfigurationChangedEvent createIncremental(Map added, Map updated,
+ Map deleted) {
+ return new KieConfigurationChangedEvent(added, updated, deleted);
+ }
+
+ public static KieConfigurationChangedEvent createIncremental(Map updated) {
+ return new KieConfigurationChangedEvent(new HashMap<>(), updated, new HashMap<>());
+ }
+
+ public final Map getAdded() {
+ return added;
+ }
+
+
+ public final Map getUpdated() {
+ return updated;
+ }
+
+
+ public final Map getDeleted() {
+ return deleted;
+ }
+
+ public final Set getChanged() {
+ return changed;
+ }
+}
diff --git a/clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/model/ConfigurationsRequest.java b/clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/model/ConfigurationsRequest.java
index b0e9344e492..b22f7ecaa23 100644
--- a/clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/model/ConfigurationsRequest.java
+++ b/clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/model/ConfigurationsRequest.java
@@ -80,6 +80,7 @@ public ConfigurationsRequest setLastRawData(Map lastRawData) {
@Override
public int compareTo(ConfigurationsRequest o) {
+ // Higher priority, query the last
return o.getOrder() - this.order;
}
}
diff --git a/clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/model/ConfigurationsRequestFactory.java b/clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/model/ConfigurationsRequestFactory.java
index 4f2b4325c0f..20c6ba3bacb 100644
--- a/clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/model/ConfigurationsRequestFactory.java
+++ b/clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/model/ConfigurationsRequestFactory.java
@@ -32,13 +32,13 @@ public class ConfigurationsRequestFactory {
private static final String KEY_VERSION = "version";
- private static final int VERSION_ORDER = 50;
+ private static final int CUSTOM_ORDER = 100;
- private static final int SERVICE_ORDER = 100;
+ private static final int VERSION_ORDER = 200;
- private static final int APP_ORDER = 200;
+ private static final int SERVICE_ORDER = 300;
- private static final int CUSTOM_ORDER = 300;
+ private static final int APP_ORDER = 400;
public static List buildConfigurationRequests(KieConfiguration configuration) {
List result = new ArrayList<>();
diff --git a/clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/model/KVDoc.java b/clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/model/KVDoc.java
index 4078557d3be..3059a581c61 100644
--- a/clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/model/KVDoc.java
+++ b/clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/model/KVDoc.java
@@ -44,6 +44,9 @@ public class KVDoc {
private String status;
+ @JsonAlias("update_time")
+ private long updateTime;
+
public String getStatus() {
return status;
}
@@ -115,4 +118,12 @@ public void setValue(String value) {
public String getValueType() {
return valueType;
}
+
+ public long getUpdateTime() {
+ return updateTime;
+ }
+
+ public void setUpdateTime(long updateTime) {
+ this.updateTime = updateTime;
+ }
}
diff --git a/clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/model/KieAddressManager.java b/clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/model/KieAddressManager.java
index 0742c11fb10..d8c069ee9b1 100644
--- a/clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/model/KieAddressManager.java
+++ b/clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/model/KieAddressManager.java
@@ -27,8 +27,8 @@
public class KieAddressManager extends AbstractAddressManager {
- public KieAddressManager(List addresses, EventBus eventBus) {
- super(addresses);
+ public KieAddressManager(List addresses, EventBus eventBus, String region, String availableZone) {
+ super(addresses, region, availableZone);
eventBus.register(this);
}
diff --git a/clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/model/ValueType.java b/clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/model/ValueType.java
index b38a1e28f8e..23cbce3b367 100644
--- a/clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/model/ValueType.java
+++ b/clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/model/ValueType.java
@@ -24,5 +24,6 @@ public enum ValueType {
string,
text,
json,
- properties
+ properties,
+ xml
}
diff --git a/clients/config-kie-client/src/test/java/org/apache/servicecomb/config/kie/client/model/KieAddressManagerTest.java b/clients/config-kie-client/src/test/java/org/apache/servicecomb/config/kie/client/model/KieAddressManagerTest.java
index 0e4f5793060..c8bf1f57a29 100644
--- a/clients/config-kie-client/src/test/java/org/apache/servicecomb/config/kie/client/model/KieAddressManagerTest.java
+++ b/clients/config-kie-client/src/test/java/org/apache/servicecomb/config/kie/client/model/KieAddressManagerTest.java
@@ -17,6 +17,7 @@
package org.apache.servicecomb.config.kie.client.model;
+import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@@ -36,10 +37,13 @@ class KieAddressManagerTest {
private static KieAddressManager addressManager1;
@Test
- public void kieAddressManagerTest() {
+ public void kieAddressManagerTest() throws NoSuchFieldException, IllegalAccessException {
addresses.add("http://127.0.0.1:30103");
addresses.add("https://127.0.0.2:30103");
- addressManager1 = new KieAddressManager(addresses, new EventBus());
+ addressManager1 = new KieAddressManager(addresses, new EventBus(), "", "");
+ Field addressManagerField = addressManager1.getClass().getSuperclass().getDeclaredField("index");
+ addressManagerField.setAccessible(true);
+ addressManagerField.set(addressManager1, 0);
Assertions.assertNotNull(addressManager1);
@@ -51,7 +55,6 @@ public void kieAddressManagerTest() {
Assertions.assertEquals("http://127.0.0.1:30103", addressManager1.address());
}
-
@Test
public void onRefreshEndpointEvent() {
List addressAZ = new ArrayList<>();
@@ -61,7 +64,7 @@ public void onRefreshEndpointEvent() {
Map> zoneAndRegion = new HashMap<>();
zoneAndRegion.put("sameZone", addressAZ);
zoneAndRegion.put("sameRegion", addressRG);
- addressManager1 = new KieAddressManager(addresses, new EventBus());
+ addressManager1 = new KieAddressManager(addresses, new EventBus(), "", "");
RefreshEndpointEvent event = new RefreshEndpointEvent(zoneAndRegion, "KIE");
addressManager1.refreshEndpoint(event, "KIE");
diff --git a/clients/dashboard-client/pom.xml b/clients/dashboard-client/pom.xml
index 57bacd97d6a..fb40407b82a 100644
--- a/clients/dashboard-client/pom.xml
+++ b/clients/dashboard-client/pom.xml
@@ -22,7 +22,7 @@
clients
org.apache.servicecomb
- 3.0.0-SNAPSHOT
+ 3.4.0-SNAPSHOT
4.0.0
diff --git a/clients/dashboard-client/src/main/java/org/apache/servicecomb/dashboard/client/DashboardAddressManager.java b/clients/dashboard-client/src/main/java/org/apache/servicecomb/dashboard/client/DashboardAddressManager.java
index 9dd8c6a3448..6897e02acd4 100644
--- a/clients/dashboard-client/src/main/java/org/apache/servicecomb/dashboard/client/DashboardAddressManager.java
+++ b/clients/dashboard-client/src/main/java/org/apache/servicecomb/dashboard/client/DashboardAddressManager.java
@@ -29,8 +29,8 @@
public class DashboardAddressManager extends AbstractAddressManager {
- public DashboardAddressManager(List addresses, EventBus eventBus) {
- super(addresses);
+ public DashboardAddressManager(List addresses, EventBus eventBus, String region, String availableZone) {
+ super(addresses, region, availableZone);
eventBus.register(this);
}
diff --git a/clients/dashboard-client/src/test/java/org/apache/servicecomb/dashboard/client/AddressManagerTest.java b/clients/dashboard-client/src/test/java/org/apache/servicecomb/dashboard/client/AddressManagerTest.java
index 0703e0dc6aa..fdb7a23922b 100644
--- a/clients/dashboard-client/src/test/java/org/apache/servicecomb/dashboard/client/AddressManagerTest.java
+++ b/clients/dashboard-client/src/test/java/org/apache/servicecomb/dashboard/client/AddressManagerTest.java
@@ -17,6 +17,7 @@
package org.apache.servicecomb.dashboard.client;
+import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@@ -35,10 +36,13 @@ class AddressManagerTest {
private static DashboardAddressManager addressManager1;
@Test
- public void kieAddressManagerTest() {
+ public void kieAddressManagerTest() throws IllegalAccessException, NoSuchFieldException {
addresses.add("http://127.0.0.1:30103");
addresses.add("https://127.0.0.2:30103");
- addressManager1 = new DashboardAddressManager(addresses, new EventBus());
+ addressManager1 = new DashboardAddressManager(addresses, new EventBus(), "", "");
+ Field addressManagerField = addressManager1.getClass().getSuperclass().getDeclaredField("index");
+ addressManagerField.setAccessible(true);
+ addressManagerField.set(addressManager1, 0);
Assertions.assertNotNull(addressManager1);
@@ -50,7 +54,6 @@ public void kieAddressManagerTest() {
Assertions.assertEquals("http://127.0.0.1:30103", addressManager1.address());
}
-
@Test
public void onRefreshEndpointEvent() {
List addressAZ = new ArrayList<>();
@@ -60,7 +63,7 @@ public void onRefreshEndpointEvent() {
Map> zoneAndRegion = new HashMap<>();
zoneAndRegion.put("sameZone", addressAZ);
zoneAndRegion.put("sameRegion", addressRG);
- addressManager1 = new DashboardAddressManager(addresses, new EventBus());
+ addressManager1 = new DashboardAddressManager(addresses, new EventBus(), "", "");
RefreshEndpointEvent event = new RefreshEndpointEvent(zoneAndRegion, "CseMonitoring");
addressManager1.refreshEndpoint(event, "CseMonitoring");
diff --git a/clients/http-client-common/pom.xml b/clients/http-client-common/pom.xml
index ae58108fb83..51d982e470c 100644
--- a/clients/http-client-common/pom.xml
+++ b/clients/http-client-common/pom.xml
@@ -22,7 +22,7 @@
clients
org.apache.servicecomb
- 3.0.0-SNAPSHOT
+ 3.4.0-SNAPSHOT
4.0.0
diff --git a/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/common/AbstractAddressManager.java b/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/common/AbstractAddressManager.java
index a126a855fa9..3c5d6214be8 100644
--- a/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/common/AbstractAddressManager.java
+++ b/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/common/AbstractAddressManager.java
@@ -17,31 +17,23 @@
package org.apache.servicecomb.http.client.common;
-import java.io.IOException;
-import java.net.InetSocketAddress;
-import java.net.Socket;
import java.net.URI;
-import java.net.URISyntaxException;
import java.util.ArrayList;
-import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.Random;
import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.servicecomb.http.client.event.EngineConnectChangedEvent;
import org.apache.servicecomb.http.client.event.RefreshEndpointEvent;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import org.springframework.util.CollectionUtils;
import com.google.common.annotations.VisibleForTesting;
-import com.google.common.cache.Cache;
-import com.google.common.cache.CacheBuilder;
-import com.google.common.util.concurrent.ThreadFactoryBuilder;
+import com.google.common.eventbus.EventBus;
public class AbstractAddressManager {
private static final Logger LOGGER = LoggerFactory.getLogger(AbstractAddressManager.class);
@@ -52,66 +44,118 @@ public class AbstractAddressManager {
private static final String V3_PREFIX = "/v3/";
- private static final int DEFAULT_METRICS_WINDOW_TIME = 1;
+ private static final String ZONE = "availableZone";
+
+ private static final String REGION = "region";
private static final int ISOLATION_THRESHOLD = 3;
- private List addresses = new ArrayList<>();
+ private volatile List addresses = new ArrayList<>();
- private int index = 0;
+ // when all addresses are isolation, it will use this for polling.
+ private final List defaultAddress = new ArrayList<>();
- private String projectName;
+ private final List defaultIsolationAddress = new ArrayList<>();
- // if address in same zone will be true; others will be false.
- private final Map addressCategory = new HashMap<>();
+ private int index;
+
+ private String projectName;
// recording continuous times of failure of an address.
private final Map addressFailureStatus = new ConcurrentHashMap<>();
- // recording address isolation status, if isolated will be false
- private final Map addressIsolated = new ConcurrentHashMap<>();
-
- // recording address isolation status, if isolated will be false
- private Cache addressIsolationStatus = CacheBuilder.newBuilder()
- .maximumSize(100)
- .expireAfterWrite(1, TimeUnit.MINUTES)
- .build();
-
private volatile List availableZone = new ArrayList<>();
+ private final List isolationZoneAddress = new ArrayList<>();
+
private volatile List availableRegion = new ArrayList<>();
- private final List defaultAddress = new ArrayList<>();
+ private final List isolationRegionAddress = new ArrayList<>();
- private boolean addressAutoRefreshed = false;
+ private volatile boolean addressAutoRefreshed = false;
private final Object lock = new Object();
- private final ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1,
- new ThreadFactoryBuilder()
- .setNameFormat("check-available-address-%d")
- .build());
+ private final Random random = new Random();
- public AbstractAddressManager(List addresses) {
+ private EventBus eventBus;
+
+ public AbstractAddressManager(List addresses, String ownRegion, String ownAvailableZone) {
this.projectName = DEFAULT_PROJECT;
- this.addresses.addAll(addresses);
- this.defaultAddress.addAll(addresses);
+ parseAndInitAddresses(addresses, ownRegion, ownAvailableZone, false);
+ this.index = !addresses.isEmpty() ? getRandomIndex() : 0;
+ }
+
+ /**
+ * address support config with region/availableZone info, to enable engine affinity calls during startup
+ * address may be like:
+ * https://192.168.20.13:30110?region=region1&availableZone=az
+ * https://192.168.20.13:30100?region=region1&availableZone=az
+ * When address have no datacenter information, roundRobin using address
+ *
+ * @param addresses engine addresses
+ * @param ownRegion microservice region
+ * @param ownAvailableZone microservice zone
+ * @param isFormat is need format
+ */
+ private void parseAndInitAddresses(List addresses, String ownRegion, String ownAvailableZone,
+ boolean isFormat) {
+ if (CollectionUtils.isEmpty(addresses)) {
+ return;
+ }
+ List tempList = new ArrayList<>();
+ addressAutoRefreshed = addresses.stream().anyMatch(addr -> addr.contains(ZONE) || addr.contains(REGION));
+ for (String address : addresses) {
+ // Compatible IpPortManager init address is 127.0.0.1:30100
+ if (!address.startsWith("http")) {
+ tempList.add(address);
+ continue;
+ }
+ URLEndPoint endpoint = new URLEndPoint(address);
+ tempList.add(endpoint.toString());
+ buildAffinityAddress(endpoint, ownRegion, ownAvailableZone);
+ }
+ this.addresses.addAll(isFormat ? this.transformAddress(tempList) : tempList);
+ this.defaultAddress.addAll(isFormat ? this.transformAddress(tempList) : tempList);
}
- public AbstractAddressManager(String projectName, List addresses) {
+ private void buildAffinityAddress(URLEndPoint endpoint, String ownRegion, String ownAvailableZone) {
+ if (addressAutoRefreshed) {
+ if (regionAndAZMatch(ownRegion, ownAvailableZone, endpoint.getFirst(REGION), endpoint.getFirst(ZONE))) {
+ availableZone.add(endpoint.toString());
+ } else {
+ availableRegion.add(endpoint.toString());
+ }
+ }
+ }
+
+ private boolean regionAndAZMatch(String ownRegion, String ownAvailableZone, String engineRegion,
+ String engineAvailableZone) {
+ return ownRegion.equalsIgnoreCase(engineRegion) && ownAvailableZone.equals(engineAvailableZone);
+ }
+
+ public AbstractAddressManager(String projectName, List addresses, String ownRegion, String ownAvailableZone) {
this.projectName = StringUtils.isEmpty(projectName) ? DEFAULT_PROJECT : projectName;
- this.addresses = this.transformAddress(addresses);
- this.defaultAddress.addAll(this.addresses);
+ parseAndInitAddresses(addresses, ownRegion, ownAvailableZone, true);
+ this.index = !addresses.isEmpty() ? getRandomIndex() : 0;
}
- @VisibleForTesting
- Cache getAddressIsolationStatus() {
- return addressIsolationStatus;
+ private int getRandomIndex() {
+ return random.nextInt(addresses.size());
}
- @VisibleForTesting
- void setAddressIsolationStatus(Cache addressIsolationStatus) {
- this.addressIsolationStatus = addressIsolationStatus;
+ public void refreshEndpoint(RefreshEndpointEvent event, String key) {
+ if (null == event || !event.getName().equals(key)) {
+ return;
+ }
+
+ availableZone = event.getSameZone().stream().map(this::normalizeUri).collect(Collectors.toList());
+ availableRegion = event.getSameRegion().stream().map(this::normalizeUri).collect(Collectors.toList());
+ addressAutoRefreshed = true;
+ }
+
+ protected String normalizeUri(String endpoint) {
+ return new URLEndPoint(endpoint).toString();
}
@VisibleForTesting
@@ -131,25 +175,10 @@ public List getAvailableRegion() {
return availableRegion;
}
- private void startCheck() {
- executorService.scheduleAtFixedRate(this::checkHistory,
- 0,
- DEFAULT_METRICS_WINDOW_TIME,
- TimeUnit.MINUTES);
- }
-
public String formatUrl(String url, boolean absoluteUrl, String address) {
return absoluteUrl ? address + url : formatAddress(address) + url;
}
- public String address() {
- if (!addressAutoRefreshed) {
- return getDefaultAddress();
- } else {
- return getAvailableZoneAddress();
- }
- }
-
public boolean sslEnabled() {
return address().startsWith("https://");
}
@@ -158,10 +187,6 @@ protected List transformAddress(List addresses) {
return addresses.stream().map(this::formatAddress).collect(Collectors.toList());
}
- protected String getUrlPrefix(String address) {
- return address + V3_PREFIX;
- }
-
protected String formatAddress(String address) {
try {
return getUrlPrefix(address) + HttpUtils.encodeURLParam(this.projectName);
@@ -170,27 +195,34 @@ protected String formatAddress(String address) {
}
}
- private String getDefaultAddress() {
- List addresses = getAvailableAddress(defaultAddress);
- if (!addresses.isEmpty()) {
- return getCurrentAddress(addresses);
+ protected String getUrlPrefix(String address) {
+ return address + V3_PREFIX;
+ }
+
+ public String address() {
+ if (!addressAutoRefreshed) {
+ return getDefaultAddress();
+ } else {
+ return getAvailableZoneAddress();
}
- return getInitAddress();
}
- private String getAvailableZoneAddress() {
- List addresses = getAvailableZoneIpPorts();
+ private String getDefaultAddress() {
if (!addresses.isEmpty()) {
return getCurrentAddress(addresses);
}
- return getInitAddress();
+ LOGGER.warn("all addresses are isolation, please check server status.");
+ // when all addresses are isolation, it will use all default address for polling.
+ return getCurrentAddress(defaultAddress);
}
- // when all available address is fail, it will use all the initial addresses for polling.
- private String getInitAddress() {
- if (addresses.isEmpty()) {
- return null;
+ private String getAvailableZoneAddress() {
+ List zoneOrRegionAddress = getZoneOrRegionAddress();
+ if (!zoneOrRegionAddress.isEmpty()) {
+ return getCurrentAddress(zoneOrRegionAddress);
}
+ LOGGER.warn("all auto discovery addresses are isolation, please check server status.");
+ // when all available address are isolation, it will use config addresses for polling.
return getCurrentAddress(addresses);
}
@@ -204,36 +236,41 @@ private String getCurrentAddress(List addresses) {
}
}
- private List getAvailableZoneIpPorts() {
+ private List getZoneOrRegionAddress() {
List results = new ArrayList<>();
if (!availableZone.isEmpty()) {
- results.addAll(getAvailableAddress(availableZone));
+ results.addAll(availableZone);
} else {
- results.addAll(getAvailableAddress(availableRegion));
+ results.addAll(availableRegion);
}
return results;
}
- private List getAvailableAddress(List endpoints) {
- return endpoints.stream().filter(uri -> !addressIsolated.containsKey(uri) || addressIsolated.get(uri))
- .collect(Collectors.toList());
- }
-
- protected String normalizeUri(String endpoint) {
- return new URLEndPoint(endpoint).toString();
- }
-
- public void refreshEndpoint(RefreshEndpointEvent event, String key) {
- if (null == event || !event.getName().equals(key)) {
+ public void recordSuccessState(String address) {
+ resetFailureStatus(address);
+ if (addressAutoRefreshed) {
+ if (isolationZoneAddress.remove(address)) {
+ LOGGER.warn("restore same region address [{}]", address);
+ if (eventBus != null && availableZone.isEmpty()) {
+ eventBus.post(new EngineConnectChangedEvent());
+ }
+ availableZone.add(address);
+ return;
+ }
+ if (isolationRegionAddress.remove(address)) {
+ LOGGER.warn("restore same zone address [{}]", address);
+ availableRegion.add(address);
+ }
return;
}
+ if (defaultIsolationAddress.remove(address)) {
+ LOGGER.warn("restore default address [{}]", address);
+ addresses.add(address);
+ }
+ }
- availableZone = event.getSameZone().stream().map(this::normalizeUri).collect(Collectors.toList());
- availableRegion = event.getSameRegion().stream().map(this::normalizeUri).collect(Collectors.toList());
- availableZone.forEach(address -> addressCategory.put(address, true));
- availableRegion.forEach(address -> addressCategory.put(address, false));
- startCheck();
- addressAutoRefreshed = true;
+ public void resetFailureStatus(String address) {
+ addressFailureStatus.put(address, 0);
}
public void recordFailState(String address) {
@@ -251,96 +288,61 @@ public void recordFailState(String address) {
}
}
- public void recordSuccessState(String address) {
- addressFailureStatus.put(address, 0);
- }
-
+ //Query whether the current address belongs to the same AZ or the same region through AZMap,
+ // and delete it from the record. At the same time, add records in history and cache
@VisibleForTesting
- protected void checkHistory() {
- addressIsolated.keySet().stream().filter(this::judgeIsolation).forEach(s -> {
- if (telnetTest(s)) {
- rejoinAddress(s);
- } else {
- addressIsolationStatus.put(s, false);
+ void removeAddress(String address) {
+ if (!addressAutoRefreshed) {
+ if (addresses.remove(address)) {
+ LOGGER.warn("isolation default address [{}]", address);
+ defaultIsolationAddress.add(address);
}
- });
- }
-
- private Boolean judgeIsolation(String address) {
- try {
- return addressIsolationStatus.get(address, () -> true);
- } catch (ExecutionException e) {
- return true;
+ return;
}
- }
-
- protected boolean telnetTest(String address) {
- URI ipPort = parseIpPortFromURI(address);
- try (Socket s = new Socket()) {
- s.connect(new InetSocketAddress(ipPort.getHost(), ipPort.getPort()), 3000);
- return true;
- } catch (IOException e) {
- LOGGER.warn("ping endpoint {} failed, It will be quarantined again.", address);
+ if (availableZone.remove(address)) {
+ LOGGER.warn("isolation same zone address [{}]", address);
+ isolationZoneAddress.add(address);
+ if (eventBus != null && availableZone.isEmpty() && !availableRegion.isEmpty()) {
+ eventBus.post(new EngineConnectChangedEvent());
+ }
+ return;
}
- return false;
- }
-
- private URI parseIpPortFromURI(String uri) {
- try {
- return new URI(uri);
- } catch (URISyntaxException e) {
- return null;
+ if (availableRegion.remove(address)) {
+ LOGGER.warn("isolation same region address [{}]", address);
+ isolationRegionAddress.add(address);
}
}
- //Query whether the current address belongs to the same AZ or region through azmap,
- // add it to the sequence of, and delete the record in history
- @VisibleForTesting
- void rejoinAddress(String address) {
- if (!addressAutoRefreshed) {
- defaultAddress.add(address);
- addressFailureStatus.put(address, 0);
- addressIsolated.remove(address);
- return;
- }
-
- if (addressCategory.get(address) == null) {
- LOGGER.warn("may not happen {}-{}", addressCategory.size(), address);
- return;
- }
+ public void setEventBus(EventBus eventBus) {
+ this.eventBus = eventBus;
+ }
- if (addressCategory.get(address)) {
- availableZone.add(address);
- } else {
- availableRegion.add(address);
- }
- addressFailureStatus.put(address, 0);
- addressIsolated.remove(address);
+ public List getIsolationAddresses() {
+ List isolationAddresses = new ArrayList<>(defaultIsolationAddress);
+ isolationAddresses.addAll(isolationZoneAddress);
+ isolationAddresses.addAll(isolationRegionAddress);
+ return isolationAddresses;
}
- //Query whether the current address belongs to the same AZ or the same region through AZMap,
- // and delete it from the record. At the same time, add records in history and cache
- @VisibleForTesting
- void removeAddress(String address) {
- if (!addressAutoRefreshed) {
- defaultAddress.remove(address);
- addressIsolated.put(address, false);
- addressIsolationStatus.put(address, false);
- return;
+ public String compareAndGetAddress(String host) {
+ for (String address : defaultAddress) {
+ if (isAddressHostSame(address, host)) {
+ return address;
+ }
}
+ return "";
+ }
- if (addressCategory.get(address) == null) {
- LOGGER.warn("may not happen {}-{}", addressCategory.size(), address);
- return;
+ private boolean isAddressHostSame(String address, String host) {
+ if (StringUtils.isEmpty(host)) {
+ return false;
}
-
- if (addressCategory.get(address)) {
- availableZone.remove(address);
- } else {
- availableRegion.remove(address);
+ try {
+ URI uri = new URI(address);
+ return host.equals(uri.getHost());
+ } catch (Exception e) {
+ LOGGER.warn("Exception occurred while constructing URI using the address [{}]", address);
}
-
- addressIsolated.put(address, false);
- addressIsolationStatus.put(address, false);
+ return false;
}
}
diff --git a/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/common/HttpTransportImpl.java b/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/common/HttpTransportImpl.java
index da87892929c..507d8d1c556 100644
--- a/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/common/HttpTransportImpl.java
+++ b/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/common/HttpTransportImpl.java
@@ -18,17 +18,21 @@
package org.apache.servicecomb.http.client.common;
import java.io.IOException;
+import java.net.URI;
import java.util.Map;
import org.apache.http.client.HttpClient;
import org.apache.http.util.EntityUtils;
import org.apache.servicecomb.foundation.auth.SignRequest;
import org.apache.servicecomb.http.client.auth.RequestAuthHeaderProvider;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
/**
* Created by on 2019/10/16.
*/
public class HttpTransportImpl implements HttpTransport {
+ private static final Logger LOGGER = LoggerFactory.getLogger(HttpTransportImpl.class);
private static final String HEADER_CONTENT_TYPE = "Content-Type";
@@ -87,7 +91,7 @@ public HttpResponse doRequest(HttpRequest httpRequest) throws IOException {
globalHeaders.forEach(httpRequest::addHeader);
}
- httpRequest.getHeaders().putAll(requestAuthHeaderProvider.loadAuthHeader(createSignRequest()));
+ httpRequest.getHeaders().putAll(requestAuthHeaderProvider.loadAuthHeader(createSignRequest(httpRequest.getUrl())));
//get Http response
org.apache.http.HttpResponse response = httpClient.execute(httpRequest.getRealRequest());
@@ -98,9 +102,16 @@ public HttpResponse doRequest(HttpRequest httpRequest) throws IOException {
response.getAllHeaders());
}
- private static SignRequest createSignRequest() {
- // Now the implementations do not process SignRequest, so return null. Maybe future will use it.
- return null;
+ private static SignRequest createSignRequest(String url) {
+ try {
+ URI uri = URI.create(url);
+ SignRequest signRequest = new SignRequest();
+ signRequest.setEndpoint(uri);
+ return signRequest;
+ } catch (Exception e) {
+ LOGGER.error("create signRequest failed!", e);
+ return null;
+ }
}
@Override
diff --git a/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/common/HttpUtils.java b/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/common/HttpUtils.java
index 37d5c207473..5f259cc3053 100644
--- a/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/common/HttpUtils.java
+++ b/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/common/HttpUtils.java
@@ -18,6 +18,7 @@
package org.apache.servicecomb.http.client.common;
import java.io.IOException;
+import java.net.URLDecoder;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
@@ -55,7 +56,14 @@ public static String encodeURLParam(String value) throws IOException {
if (value == null) {
return "";
}
- return URLEncoder.encode(value, "UTF-8");
+ return URLEncoder.encode(value, StandardCharsets.UTF_8);
+ }
+
+ public static String decodeURLParam(String value) throws IOException {
+ if (value == null) {
+ return null;
+ }
+ return URLDecoder.decode(value, StandardCharsets.UTF_8);
}
public static String sha256Encode(String key, String data) throws Exception {
diff --git a/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/common/URLEndPoint.java b/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/common/URLEndPoint.java
index ba295c35363..e3e53bad06a 100644
--- a/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/common/URLEndPoint.java
+++ b/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/common/URLEndPoint.java
@@ -36,7 +36,7 @@ public class URLEndPoint {
private final boolean sslEnabled;
- private final Map> querys;
+ private final Map> queries;
private final String hostOrIp;
@@ -49,7 +49,7 @@ public URLEndPoint(String endpoint) {
throw new IllegalArgumentException("port not specified.");
}
port = uri.getPort();
- querys = splitQuery(uri);
+ queries = splitQuery(uri);
if (endpoint.contains(HTTPS_KEY)) {
sslEnabled = true;
} else {
@@ -68,7 +68,7 @@ public static Map> splitQuery(URI uri) {
}
public String getFirst(String key) {
- List values = querys.get(key);
+ List values = queries.get(key);
if (values == null) {
return null;
}
diff --git a/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/event/EngineConnectChangedEvent.java b/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/event/EngineConnectChangedEvent.java
new file mode 100644
index 00000000000..b2029f5c38c
--- /dev/null
+++ b/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/event/EngineConnectChangedEvent.java
@@ -0,0 +1,21 @@
+/*
+ * 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.servicecomb.http.client.event;
+
+public class EngineConnectChangedEvent {
+}
diff --git a/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/OperationEvents.java b/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/event/OperationEvents.java
similarity index 79%
rename from clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/OperationEvents.java
rename to clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/event/OperationEvents.java
index 62274519ea4..69896f750ec 100644
--- a/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/OperationEvents.java
+++ b/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/event/OperationEvents.java
@@ -15,10 +15,18 @@
* limitations under the License.
*/
-package org.apache.servicecomb.service.center.client;
+package org.apache.servicecomb.http.client.event;
public abstract class OperationEvents {
public static class UnAuthorizedOperationEvent extends OperationEvents {
+ private final String address;
+ public UnAuthorizedOperationEvent(String address) {
+ this.address = address;
+ }
+
+ public String getAddress() {
+ return address;
+ }
}
}
diff --git a/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/task/AbstractTask.java b/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/task/AbstractTask.java
index deba2d8521d..cc10ae8e142 100644
--- a/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/task/AbstractTask.java
+++ b/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/task/AbstractTask.java
@@ -20,7 +20,9 @@
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.RejectedExecutionException;
+import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -29,7 +31,7 @@ public class AbstractTask {
public class BackOffSleepTask implements Task {
private static final long BASE = 3000;
- private static final long MAX = 10 * 60 * 10000;
+ private static final long MAX = 10 * 60 * 1000;
long waitTime;
@@ -63,6 +65,10 @@ public void execute() {
private volatile boolean running = true;
+ public static AtomicInteger taskCounter = new AtomicInteger(0);
+
+ private ScheduledExecutorService addrCheckExecutor;
+
protected AbstractTask(String taskName) {
initTaskPool(taskName);
Runtime.getRuntime().addShutdownHook(new Thread(AbstractTask.this::stop, taskName + "-shutdown-hook"));
@@ -70,7 +76,14 @@ protected AbstractTask(String taskName) {
protected void initTaskPool(String taskName) {
this.taskPool = Executors.newSingleThreadExecutor((task) ->
- new Thread(task, taskName));
+ new Thread(task, taskName + "-" + taskCounter.getAndIncrement()));
+ }
+
+ protected void schedulerCheckAddressAvailable(String taskName, Runnable task, long delayTime) {
+ if (addrCheckExecutor == null) {
+ addrCheckExecutor = Executors.newScheduledThreadPool(1, (t) -> new Thread(t, taskName));
+ }
+ addrCheckExecutor.scheduleWithFixedDelay(task, delayTime, delayTime, TimeUnit.MILLISECONDS);
}
protected void startTask(Task task) {
@@ -96,6 +109,10 @@ public void stop() {
running = false;
this.taskPool.shutdown();
this.taskPool.awaitTermination(10, TimeUnit.SECONDS);
+ if (addrCheckExecutor != null) {
+ this.addrCheckExecutor.shutdown();
+ this.addrCheckExecutor.awaitTermination(10, TimeUnit.SECONDS);
+ }
} catch (InterruptedException e) {
LOGGER.warn("tasks not shutdown in time {}", e.getMessage());
}
diff --git a/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/utils/ServiceCombServiceAvailableUtils.java b/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/utils/ServiceCombServiceAvailableUtils.java
new file mode 100644
index 00000000000..9139e65f96a
--- /dev/null
+++ b/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/utils/ServiceCombServiceAvailableUtils.java
@@ -0,0 +1,80 @@
+/*
+ * 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.servicecomb.http.client.utils;
+
+import org.apache.http.HttpStatus;
+import org.apache.servicecomb.http.client.common.AbstractAddressManager;
+import org.apache.servicecomb.http.client.common.HttpRequest;
+import org.apache.servicecomb.http.client.common.HttpResponse;
+import org.apache.servicecomb.http.client.common.HttpTransport;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.net.InetSocketAddress;
+import java.net.Socket;
+import java.net.URI;
+import java.net.URISyntaxException;
+
+public class ServiceCombServiceAvailableUtils {
+ private static final Logger LOGGER = LoggerFactory.getLogger(ServiceCombServiceAvailableUtils.class);
+
+ public static void checkAddressAvailable(AbstractAddressManager addressManager, String address,
+ HttpTransport httpTransport, String path) {
+ String formatUrl = addressManager.formatUrl(path, true, address);
+ HttpRequest httpRequest = new HttpRequest(formatUrl, null, null, HttpRequest.GET);
+ try {
+ HttpResponse response = httpTransport.doRequest(httpRequest);
+ if (response.getStatusCode() == HttpStatus.SC_OK) {
+ addressManager.recordSuccessState(address);
+ return;
+ }
+
+ // old server does not provide the check api, using TCP checks whether the server is ready.
+ if (response.getStatusCode() == HttpStatus.SC_NOT_FOUND && telnetCheckAddress(address)) {
+ LOGGER.warn("[{}] path does not provide, tcp check address ready!", path);
+ addressManager.recordSuccessState(address);
+ }
+ } catch (IOException e) {
+ LOGGER.error("check isolation address [{}] available error!", address);
+ }
+ }
+
+ private static boolean telnetCheckAddress(String address) {
+ URI ipPort = parseIpPortFromURI(address);
+ if (ipPort == null) {
+ return false;
+ }
+ try (Socket s = new Socket()) {
+ s.connect(new InetSocketAddress(ipPort.getHost(), ipPort.getPort()), 3000);
+ return true;
+ } catch (IOException e) {
+ LOGGER.warn("ping endpoint {} failed, It will be quarantined again.", address);
+ }
+ return false;
+ }
+
+ private static URI parseIpPortFromURI(String address) {
+ try {
+ return new URI(address);
+ } catch (URISyntaxException e) {
+ LOGGER.error("build uri error with address [{}].", address);
+ return null;
+ }
+ }
+}
diff --git a/clients/http-client-common/src/test/java/org/apache/servicecomb/http/client/common/AbstractAddressManagerTest.java b/clients/http-client-common/src/test/java/org/apache/servicecomb/http/client/common/AbstractAddressManagerTest.java
index 080e86f1657..b14d6827cb8 100644
--- a/clients/http-client-common/src/test/java/org/apache/servicecomb/http/client/common/AbstractAddressManagerTest.java
+++ b/clients/http-client-common/src/test/java/org/apache/servicecomb/http/client/common/AbstractAddressManagerTest.java
@@ -17,6 +17,7 @@
package org.apache.servicecomb.http.client.common;
+import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@@ -31,9 +32,6 @@
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
-import com.google.common.cache.Cache;
-import com.google.common.cache.CacheBuilder;
-
public class AbstractAddressManagerTest {
private static final List addresses = new ArrayList<>();
@@ -45,12 +43,21 @@ public class AbstractAddressManagerTest {
private static AbstractAddressManager addressManager3;
@BeforeEach
- public void setUp() {
+ public void setUp() throws NoSuchFieldException, IllegalAccessException {
addresses.add("http://127.0.0.1:30103");
addresses.add("https://127.0.0.2:30103");
- addressManager1 = new AbstractAddressManager(addresses);
- addressManager2 = new AbstractAddressManager("project", addresses);
- addressManager3 = new AbstractAddressManager(null, addresses);
+ addressManager1 = new AbstractAddressManager(addresses, "", "");
+ addressManager2 = new AbstractAddressManager("project", addresses, "", "");
+ addressManager3 = new AbstractAddressManager(null, addresses, "", "");
+ Field addressManagerField = addressManager1.getClass().getDeclaredField("index");
+ addressManagerField.setAccessible(true);
+ addressManagerField.set(addressManager1, 0);
+ addressManagerField = addressManager2.getClass().getDeclaredField("index");
+ addressManagerField.setAccessible(true);
+ addressManagerField.set(addressManager2, 0);
+ addressManagerField = addressManager3.getClass().getDeclaredField("index");
+ addressManagerField.setAccessible(true);
+ addressManagerField.set(addressManager3, 0);
}
@AfterEach
@@ -81,12 +88,7 @@ public void recordStateTest() throws ExecutionException {
zoneAndRegion.put("sameZone", addressAZ);
zoneAndRegion.put("sameRegion", addressRG);
RefreshEndpointEvent event = new RefreshEndpointEvent(zoneAndRegion, "TEST");
- AbstractAddressManager addressManager = new AbstractAddressManager(addresses) {
- @Override
- protected boolean telnetTest(String address) {
- return true;
- }
- };
+ AbstractAddressManager addressManager = new AbstractAddressManager(addresses, "", "") {};
addressManager.refreshEndpoint(event, "TEST");
@@ -99,7 +101,7 @@ protected boolean telnetTest(String address) {
Assertions.assertEquals("http://127.0.0.3:30100", addressManager.address());
// test fail 2 times ,it will not be isolated
- addressManager.recordSuccessState(address);
+ addressManager.resetFailureStatus(address);
Assertions.assertEquals("http://127.0.0.3:30100", addressManager.address());
// test recodeStatus times
@@ -112,20 +114,8 @@ protected boolean telnetTest(String address) {
addressManager.recordFailState(address);
Assertions.assertEquals("http://127.0.0.4:30100", addressManager.address());
- // mock cacheAddress status refresh after 10 minute
- Cache cache = CacheBuilder.newBuilder()
- .maximumSize(100)
- .expireAfterWrite(10, TimeUnit.MINUTES)
- .build();
- cache.put("http://127.0.0.3:30100", true);
-
- addressManager.setAddressIsolationStatus(cache);
- Cache result = addressManager.getAddressIsolationStatus();
- Assertions.assertEquals(true, result.get("http://127.0.0.3:30100", () -> false));
-
// test restore isolation
- addressManager.checkHistory();
- addressManager.rejoinAddress("http://127.0.0.3:30100");
+ addressManager.recordSuccessState("http://127.0.0.3:30100");
Assertions.assertEquals("http://127.0.0.3:30100", addressManager.address());
Assertions.assertEquals("http://127.0.0.3:30100", addressManager.address());
}
@@ -134,7 +124,7 @@ protected boolean telnetTest(String address) {
@Test
public void testMultipleThread() throws Exception {
- AbstractAddressManager addressManager = new AbstractAddressManager(addresses);
+ AbstractAddressManager addressManager = new AbstractAddressManager(addresses, "", "");
String address = "http://127.0.0.3:30100";
CountDownLatch latch = new CountDownLatch(2);
@@ -312,4 +302,27 @@ public void normalizeIPV6Test() {
uri = addressManager1.normalizeUri("rest://[2008::7:957f:b2d6:1af4:a1f8]:30100");
Assertions.assertEquals("http://[2008::7:957f:b2d6:1af4:a1f8]:30100", uri);
}
+
+ @Test
+ public void compareAndGetAddressTest() {
+ List testAddr = new ArrayList<>();
+ testAddr.add("https://192.168.20.160:30100");
+ testAddr.add("https://127.0.0.1:30100");
+ testAddr.add("https://127.0.0.3:30100");
+ AbstractAddressManager manager = new AbstractAddressManager(testAddr, "", "");
+ Assertions.assertTrue(manager.compareAndGetAddress("192.168.20.16").isEmpty());
+ Assertions.assertEquals("https://192.168.20.160:30100", manager.compareAndGetAddress("192.168.20.160"));
+ }
+
+ @Test
+ public void AddressAffinityTest() {
+ List testAddr = new ArrayList<>();
+ testAddr.add("https://192.168.20.160:30100?region=region1&availableZone=zone1");
+ testAddr.add("https://127.0.0.1:30100");
+ AbstractAddressManager manager = new AbstractAddressManager(testAddr, "region1", "zone1");
+ Assertions.assertEquals("https://192.168.20.160:30100", manager.address());
+
+ AbstractAddressManager manager2 = new AbstractAddressManager("default", testAddr, "region1", "zone1");
+ Assertions.assertEquals("https://192.168.20.160:30100", manager2.address());
+ }
}
diff --git a/clients/pom.xml b/clients/pom.xml
index df660f6c051..49f481934cc 100644
--- a/clients/pom.xml
+++ b/clients/pom.xml
@@ -23,7 +23,7 @@
org.apache.servicecomb
java-chassis-parent
- 3.0.0-SNAPSHOT
+ 3.4.0-SNAPSHOT
../parents/default
4.0.0
diff --git a/clients/service-center-client/README.md b/clients/service-center-client/README.md
index b3a933bf9a3..a6b4c6d4936 100644
--- a/clients/service-center-client/README.md
+++ b/clients/service-center-client/README.md
@@ -1,15 +1,15 @@
## ServiceComb-Service-Center Client for Java
- Sample Java client for ServiceComb-Service-Center HTTP API.
+ Sample Java client for ServiceComb-Service-Center HTTP API.
If you want more information about the ServiceComb-Service-Center HTTP API, go [here](https://github.com/apache/servicecomb-service-center/blob/master/docs/openapi/v4.yaml).
-
+
### Build & Install
-
+
local Build from source :
```
maven clean install
```
-
+
add dependency to maven
```
@@ -79,14 +79,14 @@ MicroservicesResponse services = client.getMicroserviceList();
for(Microservice microservice : services.getServices())
{
for (MicroserviceInstance instance: client.getMicroserviceInstanceList(microservice.getServiceId()).getInstances())
- {
- client.sendHeartBeats(new HeartbeatsRequest(microservice.getServiceId(),instance.getInstanceId()));
+ {
+ client.sendHeartBeats(new HeartbeatsRequest(microservice.getServiceId(),instance.getInstanceId()));
}
}
```
#### Other API
-You can see client API code and tests, go [here](https://github.com/apache/servicecomb-java-chassis/blob/master/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterClient.java)
+You can see client API code and tests, go [here](https://github.com/apache/servicecomb-java-chassis/blob/master/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterClient.java)
### More development
diff --git a/clients/service-center-client/pom.xml b/clients/service-center-client/pom.xml
index 4eb051fda9f..ccc3900e9db 100755
--- a/clients/service-center-client/pom.xml
+++ b/clients/service-center-client/pom.xml
@@ -22,7 +22,7 @@
clients
org.apache.servicecomb
- 3.0.0-SNAPSHOT
+ 3.4.0-SNAPSHOT
4.0.0
diff --git a/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterAddressManager.java b/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterAddressManager.java
index a5fd128ab1e..b19db919e81 100644
--- a/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterAddressManager.java
+++ b/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterAddressManager.java
@@ -26,8 +26,9 @@
import com.google.common.eventbus.Subscribe;
public class ServiceCenterAddressManager extends AbstractAddressManager {
- public ServiceCenterAddressManager(String projectName, List addresses, EventBus eventBus) {
- super(projectName, addresses);
+ public ServiceCenterAddressManager(String projectName, List addresses, EventBus eventBus, String region,
+ String availableZone) {
+ super(projectName, addresses, region, availableZone);
eventBus.register(this);
}
diff --git a/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterClient.java b/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterClient.java
index 09f30dc93da..97aeaa9931a 100755
--- a/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterClient.java
+++ b/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterClient.java
@@ -25,6 +25,7 @@
import java.util.Map;
import org.apache.http.HttpStatus;
+import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.utils.URIBuilder;
import org.apache.servicecomb.http.client.auth.RequestAuthHeaderProvider;
import org.apache.servicecomb.http.client.common.HttpConfiguration.SSLProperties;
@@ -32,13 +33,13 @@
import org.apache.servicecomb.http.client.common.HttpTransport;
import org.apache.servicecomb.http.client.common.HttpTransportFactory;
import org.apache.servicecomb.http.client.common.HttpUtils;
-import org.apache.servicecomb.service.center.client.OperationEvents.UnAuthorizedOperationEvent;
import org.apache.servicecomb.service.center.client.exception.OperationException;
import org.apache.servicecomb.service.center.client.model.CreateMicroserviceInstanceRequest;
import org.apache.servicecomb.service.center.client.model.CreateMicroserviceRequest;
import org.apache.servicecomb.service.center.client.model.CreateSchemaRequest;
import org.apache.servicecomb.service.center.client.model.ErrorMessage;
import org.apache.servicecomb.service.center.client.model.FindMicroserviceInstancesResponse;
+import org.apache.servicecomb.service.center.client.model.Framework;
import org.apache.servicecomb.service.center.client.model.GetSchemaListResponse;
import org.apache.servicecomb.service.center.client.model.GetSchemaResponse;
import org.apache.servicecomb.service.center.client.model.HeartbeatsRequest;
@@ -58,6 +59,7 @@
import org.apache.servicecomb.service.center.client.model.UpdatePropertiesRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import org.springframework.core.env.Environment;
import com.google.common.eventbus.EventBus;
@@ -65,16 +67,24 @@ public class ServiceCenterClient implements ServiceCenterOperation {
private static final Logger LOGGER = LoggerFactory.getLogger(ServiceCenterClient.class);
+ private static final String CLIENT_CONNECT_TIMEOUT = "servicecomb.registry.sc.client.timeout.connect";
+
+ private static final String CLIENT_REQUEST_TIMEOUT = "servicecomb.registry.sc.client.timeout.request";
+
+ private static final String CLIENT_SOCKET_TIMEOUT = "servicecomb.registry.sc.client.timeout.socket";
+
private final ServiceCenterRawClient httpClient;
- private EventBus eventBus;
+ private final ServiceCenterAddressManager addressManager;
- public ServiceCenterClient(ServiceCenterRawClient httpClient) {
+ public ServiceCenterClient(ServiceCenterRawClient httpClient, ServiceCenterAddressManager addressManager) {
this.httpClient = httpClient;
+ this.addressManager = addressManager;
}
public ServiceCenterClient setEventBus(EventBus eventBus) {
- this.eventBus = eventBus;
+ addressManager.setEventBus(eventBus);
+ this.httpClient.setEventBus(eventBus);
return this;
}
@@ -82,14 +92,28 @@ public ServiceCenterClient(ServiceCenterAddressManager addressManager,
SSLProperties sslProperties,
RequestAuthHeaderProvider requestAuthHeaderProvider,
String tenantName,
- Map extraGlobalHeaders) {
- HttpTransport httpTransport = HttpTransportFactory.createHttpTransport(sslProperties, requestAuthHeaderProvider);
+ Map extraGlobalHeaders,
+ Environment environment) {
+ HttpTransport httpTransport = HttpTransportFactory.createHttpTransport(sslProperties, requestAuthHeaderProvider,
+ buildRequestConfig(environment));
httpTransport.addHeaders(extraGlobalHeaders);
this.httpClient = new ServiceCenterRawClient.Builder()
.setTenantName(tenantName)
.setAddressManager(addressManager)
.setHttpTransport(httpTransport).build();
+ this.addressManager = addressManager;
+ }
+
+ private RequestConfig buildRequestConfig(Environment environment) {
+ RequestConfig.Builder builder = HttpTransportFactory.defaultRequestConfig();
+ if (environment == null) {
+ return builder.build();
+ }
+ builder.setConnectTimeout(environment.getProperty(CLIENT_CONNECT_TIMEOUT, int.class, 5000));
+ builder.setConnectionRequestTimeout(environment.getProperty(CLIENT_REQUEST_TIMEOUT, int.class, 5000));
+ builder.setSocketTimeout(environment.getProperty(CLIENT_SOCKET_TIMEOUT, int.class, 5000));
+ return builder.build();
}
@Override
@@ -99,7 +123,6 @@ public MicroserviceInstancesResponse getServiceCenterInstances() {
if (response.getStatusCode() == HttpStatus.SC_OK) {
return HttpUtils.deserialize(response.getContent(), MicroserviceInstancesResponse.class);
}
- sendUnAuthorizedEvent(response);
throw new OperationException(
"get service-center instances fails, statusCode = " + response.getStatusCode() + "; message = " + response
.getMessage()
@@ -120,7 +143,6 @@ public RegisteredMicroserviceResponse registerMicroservice(Microservice microser
if (response.getStatusCode() == HttpStatus.SC_OK) {
return HttpUtils.deserialize(response.getContent(), RegisteredMicroserviceResponse.class);
}
- sendUnAuthorizedEvent(response);
throw new OperationException(
"register service fails, statusCode = " + response.getStatusCode() + "; message = " + response
.getMessage()
@@ -138,7 +160,6 @@ public MicroservicesResponse getMicroserviceList() {
if (response.getStatusCode() == HttpStatus.SC_OK) {
return HttpUtils.deserialize(response.getContent(), MicroservicesResponse.class);
}
- sendUnAuthorizedEvent(response);
throw new OperationException(
"get service List fails, statusCode = " + response.getStatusCode() + "; message = " + response
.getMessage()
@@ -163,7 +184,6 @@ public RegisteredMicroserviceResponse queryServiceId(Microservice microservice)
if (response.getStatusCode() == HttpStatus.SC_OK) {
return HttpUtils.deserialize(response.getContent(), RegisteredMicroserviceResponse.class);
}
- sendUnAuthorizedEvent(response);
LOGGER.info("Query serviceId fails, statusCode = " + response.getStatusCode() + "; message = " + response
.getMessage()
+ "; content = " + response.getContent());
@@ -186,7 +206,6 @@ public Microservice getMicroserviceByServiceId(String serviceId) {
.deserialize(response.getContent(), MicroserviceResponse.class);
return microserviceResponse.getService();
}
- sendUnAuthorizedEvent(response);
throw new OperationException(
"get service message fails, statusCode = " + response.getStatusCode() + "; message = " + response
.getMessage()
@@ -208,7 +227,6 @@ public RegisteredMicroserviceInstanceResponse registerMicroserviceInstance(Micro
if (response.getStatusCode() == HttpStatus.SC_OK) {
return HttpUtils.deserialize(response.getContent(), RegisteredMicroserviceInstanceResponse.class);
}
- sendUnAuthorizedEvent(response);
throw new OperationException(
"register service instance fails, statusCode = " + response.getStatusCode() + "; message = " + response
.getMessage()
@@ -244,7 +262,11 @@ public FindMicroserviceInstancesResponse findMicroserviceInstance(String consume
result.setModified(false);
return result;
}
- sendUnAuthorizedEvent(response);
+ if (response.getStatusCode() == HttpStatus.SC_TOO_MANY_REQUESTS) {
+ LOGGER.warn("rate limited, keep the local service {}#{} instance cache unchanged.", appId, serviceName);
+ result.setModified(false);
+ return result;
+ }
throw new OperationException(
"get service instances list fails, statusCode = " + response.getStatusCode() + "; message = " + response
.getMessage()
@@ -263,7 +285,6 @@ public MicroserviceInstancesResponse getMicroserviceInstanceList(String serviceI
if (response.getStatusCode() == HttpStatus.SC_OK) {
return HttpUtils.deserialize(response.getContent(), MicroserviceInstancesResponse.class);
}
- sendUnAuthorizedEvent(response);
throw new OperationException(
"get service instances list fails, statusCode = " + response.getStatusCode() + "; message = " + response
.getMessage()
@@ -284,7 +305,6 @@ public MicroserviceInstance getMicroserviceInstance(String serviceId, String ins
.deserialize(response.getContent(), MicroserviceInstanceResponse.class);
return instanceResponse.getInstance();
}
- sendUnAuthorizedEvent(response);
throw new OperationException(
"get service instance message fails, statusCode = " + response.getStatusCode() + "; message = " + response
.getMessage()
@@ -304,7 +324,6 @@ public void deleteMicroserviceInstance(String serviceId, String instanceId) {
LOGGER.info("Delete service instance successfully.");
return;
}
- sendUnAuthorizedEvent(response);
throw new OperationException(
"delete service instance fails, statusCode = " + response.getStatusCode() + "; message = " + response
.getMessage()
@@ -324,7 +343,6 @@ public boolean updateMicroserviceInstanceStatus(String serviceId, String instanc
if (response.getStatusCode() == HttpStatus.SC_OK) {
return true;
}
- sendUnAuthorizedEvent(response);
throw new OperationException(
"update service instance status fails, statusCode = " + response.getStatusCode() + "; message = " + response
.getMessage()
@@ -343,7 +361,6 @@ public void sendHeartBeats(HeartbeatsRequest heartbeatsRequest) {
if (response.getStatusCode() == HttpStatus.SC_OK) {
return;
}
- sendUnAuthorizedEvent(response);
throw new OperationException(
"heartbeats fails, statusCode = " + response.getStatusCode() + "; message = " + response.getMessage()
+ "; content = " + response.getContent());
@@ -363,7 +380,6 @@ public boolean sendHeartBeat(String serviceId, String instanceId) {
if (response.getStatusCode() == HttpStatus.SC_OK) {
return true;
}
- sendUnAuthorizedEvent(response);
throw new OperationException(
"heartbeats fails, statusCode = " + response.getStatusCode() + "; message = " + response.getMessage()
+ "; content = " + response.getContent());
@@ -388,7 +404,6 @@ public List getServiceSchemasList(String serviceId, boolean withCont
.deserialize(response.getContent(), GetSchemaListResponse.class);
return getSchemaResponse.getSchemas();
}
- sendUnAuthorizedEvent(response);
throw new OperationException(
"get service schemas list fails, statusCode = " + response.getStatusCode() + "; message = " + response
.getMessage()
@@ -415,7 +430,6 @@ public String getServiceSchemaContext(String serviceId, String schemaId) {
GetSchemaResponse getSchemaResponse = HttpUtils.deserialize(response.getContent(), GetSchemaResponse.class);
return getSchemaResponse.getSchema();
}
- sendUnAuthorizedEvent(response);
throw new OperationException(
"get service schema context fails, statusCode = " + response.getStatusCode() + "; message = " + response
.getMessage()
@@ -435,7 +449,6 @@ public boolean registerSchema(String serviceId, String schemaId, CreateSchemaReq
if (response.getStatusCode() == HttpStatus.SC_OK) {
return true;
}
- sendUnAuthorizedEvent(response);
throw new OperationException(
"update service schema fails, statusCode = " + response.getStatusCode() + "; message = " + response
.getMessage()
@@ -458,7 +471,6 @@ public boolean updateServiceSchemaContext(String serviceId, SchemaInfo schemaInf
if (response.getStatusCode() == HttpStatus.SC_OK) {
return true;
}
- sendUnAuthorizedEvent(response);
throw new OperationException(
"update service schema fails, statusCode = " + response.getStatusCode() + "; message = " + response
.getMessage()
@@ -478,7 +490,6 @@ public boolean batchUpdateServiceSchemaContext(String serviceId, ModifySchemasRe
if (response.getStatusCode() == HttpStatus.SC_OK) {
return true;
}
- sendUnAuthorizedEvent(response);
throw new OperationException(
"update service schema fails, statusCode = " + response.getStatusCode() + "; message = " + response
.getMessage()
@@ -489,18 +500,12 @@ public boolean batchUpdateServiceSchemaContext(String serviceId, ModifySchemasRe
}
}
- private void sendUnAuthorizedEvent(HttpResponse response) {
- if (this.eventBus != null && response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) {
- this.eventBus.post(new UnAuthorizedOperationEvent());
- }
- }
-
@Override
- public RbacTokenResponse queryToken(RbacTokenRequest request) {
+ public RbacTokenResponse queryToken(RbacTokenRequest request, String host) {
try {
+ String queryAddress = addressManager.compareAndGetAddress(host);
HttpResponse response = httpClient
- .postHttpRequestAbsoluteUrl("/v4/token", null,
- HttpUtils.serialize(request));
+ .postHttpRequestAbsoluteUrl("/v4/token", null, HttpUtils.serialize(request), queryAddress);
if (response.getStatusCode() == HttpStatus.SC_OK) {
RbacTokenResponse result = HttpUtils.deserialize(response.getContent(), RbacTokenResponse.class);
result.setStatusCode(HttpStatus.SC_OK);
@@ -530,23 +535,35 @@ public RbacTokenResponse queryToken(RbacTokenRequest request) {
}
@Override
- public boolean updateMicroserviceProperties(String serviceId, Map serviceProperties) {
+ public boolean updateMicroserviceProperties(String serviceId, Map serviceProperties,
+ Framework framework) {
try {
UpdatePropertiesRequest request = new UpdatePropertiesRequest();
request.setProperties(serviceProperties);
+ request.setFramework(framework);
HttpResponse response = httpClient.putHttpRequest(
"/registry/microservices/" + serviceId + "/properties", null, HttpUtils.serialize(request));
if (response.getStatusCode() == HttpStatus.SC_OK) {
return true;
}
- sendUnAuthorizedEvent(response);
throw new OperationException(
- "update service instance status fails, statusCode = " + response.getStatusCode() + "; message = " + response
+ "update service properties fails, statusCode = " + response.getStatusCode() + "; message = " + response
.getMessage()
+ "; content = " + response.getContent());
} catch (IOException e) {
throw new OperationException(
- "update service instance status fails", e);
+ "update service properties fails", e);
+ }
+ }
+
+ @Override
+ public void checkIsolationAddressAvailable() {
+ List isolationAddresses = addressManager.getIsolationAddresses();
+ if (isolationAddresses.isEmpty()) {
+ return;
+ }
+ for (String address : isolationAddresses) {
+ httpClient.checkAddressAvailable(address);
}
}
}
diff --git a/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterDiscovery.java b/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterDiscovery.java
index ccc8fb1697a..a1ab524c187 100644
--- a/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterDiscovery.java
+++ b/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterDiscovery.java
@@ -17,12 +17,12 @@
package org.apache.servicecomb.service.center.client;
-import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Objects;
+import java.util.Random;
import java.util.concurrent.ConcurrentHashMap;
import org.apache.servicecomb.http.client.task.AbstractTask;
@@ -101,6 +101,8 @@ public static class SubscriptionValue {
private final Object lock = new Object();
+ private final Random random = new Random();
+
public ServiceCenterDiscovery(ServiceCenterClient serviceCenterClient, EventBus eventBus) {
super("service-center-discovery-task");
this.serviceCenterClient = serviceCenterClient;
@@ -153,13 +155,12 @@ public void onPullInstanceEvent(PullInstanceEvent event) {
startTask(new PullInstanceOnceTask());
}
- private List pullInstance(SubscriptionKey k, SubscriptionValue v, boolean sendChangedEvent) {
+ private void pullInstance(SubscriptionKey k, SubscriptionValue v, boolean sendChangedEvent) {
if (myselfServiceId == null) {
// registration not ready
- return Collections.emptyList();
+ return;
}
- List failedKeys = new ArrayList<>();
try {
FindMicroserviceInstancesResponse instancesResponse = serviceCenterClient
.findMicroserviceInstance(myselfServiceId, k.appId, k.serviceName, ALL_VERSION, v.revision);
@@ -167,10 +168,10 @@ private List pullInstance(SubscriptionKey k, SubscriptionValue
List instances = instancesResponse.getMicroserviceInstancesResponse().getInstances()
== null ? Collections.emptyList() : instancesResponse.getMicroserviceInstancesResponse().getInstances();
setMicroserviceInfo(instances);
- LOGGER.info("Instance changed event, "
- + "current: revision={}, instances={}; "
- + "origin: revision={}, instances={}; "
- + "appId={}, serviceName={}",
+ LOGGER.info("Instance changed event. "
+ + "Current: revision={}, instances={}. "
+ + "Origin: revision={}, instances={}. "
+ + "appId={}, serviceName={}.",
instancesResponse.getRevision(),
instanceToString(instances),
v.revision,
@@ -186,14 +187,9 @@ private List pullInstance(SubscriptionKey k, SubscriptionValue
}
}
} catch (Exception e) {
- LOGGER.error("find service {}#{} instance failed.", k.appId, k.serviceName, e);
- if (!(e.getCause() instanceof IOException)) {
- // for IOException, do not remove cache, or when service center
- // not available, invocation between microservices will fail.
- failedKeys.add(k);
- }
+ LOGGER.warn("find service {}#{} instance failed, remaining local instances cache [{}], cause message: {}",
+ k.appId, k.serviceName, instanceToString(v.instancesCache), e.getMessage());
}
- return failedKeys;
}
private void setMicroserviceInfo(List instances) {
@@ -216,10 +212,17 @@ class PullInstanceTask implements Task {
public void execute() {
pullAllInstance();
- startTask(new BackOffSleepTask(pollInterval, new PullInstanceTask()));
+ startTask(new BackOffSleepTask(buildPollIntervalWithSalt(), new PullInstanceTask()));
}
}
+ private long buildPollIntervalWithSalt() {
+ int positive = random.nextInt(5);
+ int sign = random.nextBoolean() ? 1 : -1;
+ long currentPollInterval = pollInterval + sign * positive * 1000;
+ return currentPollInterval > 0 ? currentPollInterval : pollInterval;
+ }
+
class PullInstanceOnceTask implements Task {
@Override
public void execute() {
@@ -232,13 +235,15 @@ public void execute() {
}
private synchronized void pullAllInstance() {
- List failedInstances = new ArrayList<>();
- instancesCache.forEach((k, v) -> failedInstances.addAll(pullInstance(k, v, true)));
- if (failedInstances.isEmpty()) {
- return;
- }
- failedInstances.forEach(instancesCache::remove);
- failedInstances.clear();
+ List emptyInstancesCache = new ArrayList<>();
+ instancesCache.forEach((k, v) -> {
+ pullInstance(k, v, true);
+ if (v.instancesCache.isEmpty()) {
+ emptyInstancesCache.add(k);
+ }
+ });
+ emptyInstancesCache.forEach(instancesCache::remove);
+ emptyInstancesCache.clear();
}
private static String instanceToString(List instances) {
@@ -252,10 +257,9 @@ private static String instanceToString(List instances) {
sb.append(endpoint.length() > 64 ? endpoint.substring(0, 64) : endpoint);
sb.append("|");
}
- sb.append(instance.getServiceName());
+ sb.append(instance.getStatus());
sb.append("|");
}
- sb.append("#");
return sb.toString();
}
}
diff --git a/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterOperation.java b/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterOperation.java
index 5521a732244..fd39a4ce963 100644
--- a/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterOperation.java
+++ b/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterOperation.java
@@ -23,6 +23,7 @@
import org.apache.servicecomb.service.center.client.exception.OperationException;
import org.apache.servicecomb.service.center.client.model.CreateSchemaRequest;
import org.apache.servicecomb.service.center.client.model.FindMicroserviceInstancesResponse;
+import org.apache.servicecomb.service.center.client.model.Framework;
import org.apache.servicecomb.service.center.client.model.HeartbeatsRequest;
import org.apache.servicecomb.service.center.client.model.Microservice;
import org.apache.servicecomb.service.center.client.model.MicroserviceInstance;
@@ -159,7 +160,6 @@ boolean updateMicroserviceInstanceStatus(String serviceId, String instanceId,
* Batch send heartbeats to service-center
*
* @param heartbeatsRequest
- * @return
* @throws OperationException
*/
void sendHeartBeats(HeartbeatsRequest heartbeatsRequest);
@@ -184,7 +184,7 @@ boolean updateMicroserviceInstanceStatus(String serviceId, String instanceId,
* @return if heartbeat is successful
* @throws OperationException If some problems happened to contact service center or non http 200 returned.
*/
- RbacTokenResponse queryToken(RbacTokenRequest request);
+ RbacTokenResponse queryToken(RbacTokenRequest request, String host);
/**
* Update properties of microservice
@@ -192,5 +192,11 @@ boolean updateMicroserviceInstanceStatus(String serviceId, String instanceId,
* @return if update is successful
* @throws OperationException If some problems happened to contact service center or non http 200 returned.
*/
- boolean updateMicroserviceProperties(String microserviceId, Map serviceProperties);
+ boolean updateMicroserviceProperties(String microserviceId, Map serviceProperties,
+ Framework framework);
+
+ /**
+ * Check serviceCenter isolation address available
+ */
+ void checkIsolationAddressAvailable();
}
diff --git a/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterRawClient.java b/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterRawClient.java
index 6c293004cc0..e233f15fb52 100755
--- a/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterRawClient.java
+++ b/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterRawClient.java
@@ -21,23 +21,33 @@
import java.util.HashMap;
import java.util.Map;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.http.HttpStatus;
import org.apache.servicecomb.http.client.common.HttpRequest;
import org.apache.servicecomb.http.client.common.HttpResponse;
import org.apache.servicecomb.http.client.common.HttpTransport;
+import org.apache.servicecomb.http.client.event.OperationEvents.UnAuthorizedOperationEvent;
+import org.apache.servicecomb.http.client.utils.ServiceCombServiceAvailableUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import com.google.common.eventbus.EventBus;
+
public class ServiceCenterRawClient {
private static final Logger LOGGER = LoggerFactory.getLogger(ServiceCenterRawClient.class);
private static final String HEADER_TENANT_NAME = "x-domain-name";
+ private static final String ADDRESS_CHECK_PATH = "/v4/default/registry/health/readiness";
+
private final String tenantName;
private final HttpTransport httpTransport;
private final ServiceCenterAddressManager addressManager;
+ private EventBus eventBus;
+
private ServiceCenterRawClient(String tenantName, HttpTransport httpTransport,
ServiceCenterAddressManager addressManager) {
this.httpTransport = httpTransport;
@@ -45,41 +55,40 @@ private ServiceCenterRawClient(String tenantName, HttpTransport httpTransport,
this.addressManager = addressManager;
}
+ public void setEventBus(EventBus eventBus) {
+ this.eventBus = eventBus;
+ }
+
public HttpResponse getHttpRequest(String url, Map headers, String content) throws IOException {
- return doHttpRequest(url, false, headers, content, HttpRequest.GET);
+ return doHttpRequest(url, false, headers, content, HttpRequest.GET, "");
}
- public HttpResponse postHttpRequestAbsoluteUrl(String url, Map headers, String content)
- throws IOException {
- return doHttpRequest(url, true, headers, content, HttpRequest.POST);
+ public HttpResponse postHttpRequestAbsoluteUrl(String url, Map headers, String content,
+ String address) throws IOException {
+ return doHttpRequest(url, true, headers, content, HttpRequest.POST, address);
}
public HttpResponse postHttpRequest(String url, Map headers, String content) throws IOException {
- return doHttpRequest(url, false, headers, content, HttpRequest.POST);
+ return doHttpRequest(url, false, headers, content, HttpRequest.POST, "");
}
public HttpResponse putHttpRequest(String url, Map headers, String content) throws IOException {
- return doHttpRequest(url, false, headers, content, HttpRequest.PUT);
+ return doHttpRequest(url, false, headers, content, HttpRequest.PUT, "");
}
public HttpResponse deleteHttpRequest(String url, Map headers, String content) throws IOException {
- return doHttpRequest(url, false, headers, content, HttpRequest.DELETE);
+ return doHttpRequest(url, false, headers, content, HttpRequest.DELETE, "");
}
private HttpResponse doHttpRequest(String url, boolean absoluteUrl, Map headers, String content,
- String method)
- throws IOException {
- String address = addressManager.address();
+ String method, String queryAddress) throws IOException {
+ String address = StringUtils.isEmpty(queryAddress) ? addressManager.address() : queryAddress;
String formatUrl = addressManager.formatUrl(url, absoluteUrl, address);
- if (headers == null) {
- headers = new HashMap<>();
- }
- headers.put(HEADER_TENANT_NAME, tenantName);
- HttpRequest httpRequest = new HttpRequest(formatUrl, headers, content, method);
-
+ HttpRequest httpRequest = buildHttpRequest(formatUrl, headers, content, method);
+ HttpResponse httpResponse;
try {
- HttpResponse httpResponse = httpTransport.doRequest(httpRequest);
- addressManager.recordSuccessState(address);
+ httpResponse = httpTransport.doRequest(httpRequest);
+ recordAndSendUnAuthorizedEvent(httpResponse, address);
return httpResponse;
} catch (IOException e) {
addressManager.recordFailState(address);
@@ -88,7 +97,9 @@ private HttpResponse doHttpRequest(String url, boolean absoluteUrl, Map headers, String content, String method) {
+ if (headers == null) {
+ headers = new HashMap<>();
+ }
+ headers.put(HEADER_TENANT_NAME, tenantName);
+ return new HttpRequest(url, headers, content, method);
+ }
+
public static class Builder {
private String tenantName;
diff --git a/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterRegistration.java b/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterRegistration.java
index c9340e4d380..93988ea8948 100644
--- a/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterRegistration.java
+++ b/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterRegistration.java
@@ -17,6 +17,7 @@
package org.apache.servicecomb.service.center.client;
+import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@@ -55,7 +56,7 @@ public class ServiceCenterRegistration extends AbstractTask {
private MicroserviceInstance microserviceInstance;
- private List schemaInfos;
+ private List schemaInfos = new ArrayList<>();
private final ServiceCenterConfiguration serviceCenterConfiguration;
@@ -102,8 +103,18 @@ public ServiceCenterRegistration setSchemaInfos(List schemaInfos) {
return this;
}
+ public ServiceCenterRegistration addSchemaInfo(SchemaInfo schemaInfo) {
+ this.schemaInfos.add(schemaInfo);
+ return this;
+ }
+
+ public List getSchemaInfos() {
+ return this.schemaInfos;
+ }
+
public void startRegistration() {
startTask(new RegisterMicroserviceTask(0));
+ schedulerCheckAddressAvailable("sc-addr-check", new CheckAddressTask(), heartBeatInterval);
}
class RegisterMicroserviceTask implements Task {
@@ -137,13 +148,13 @@ public void execute() {
microservice.setProperties(newMicroservice.getProperties());
microservice.getProperties().putAll(propertiesTemp);
if (serviceCenterClient.updateMicroserviceProperties(serviceResponse.getServiceId(),
- microservice.getProperties())) {
+ microservice.getProperties(), microservice.getFramework())) {
LOGGER.info(
- "microservice is already registered. Update microservice properties successfully. properties=[{}]",
- microservice.getProperties());
+ "microservice is already registered. Update microservice properties successfully. properties=[{}], "
+ + "frameworkVersion [{}]", microservice.getProperties(), microservice.getFramework().getVersion());
} else {
- LOGGER.error("microservice is already registered. Update microservice properties failed. properties=[{}]",
- microservice.getProperties());
+ LOGGER.error("microservice is already registered. Update microservice properties failed. properties=[{}], "
+ + "frameworkVersion [{}]", microservice.getProperties(), microservice.getFramework().getVersion());
}
microservice.setServiceId(serviceResponse.getServiceId());
@@ -276,7 +287,7 @@ public void execute() {
}
if (!serviceCenterClient.sendHeartBeat(microservice.getServiceId(), microserviceInstance.getInstanceId())) {
- LOGGER.error("send heart failed, and will try again.");
+ LOGGER.warn("send heart failed, and will try again.");
eventBus.post(new HeartBeatEvent(false, microservice, microserviceInstance));
startTask(new BackOffSleepTask(failedCount + 1, new SendHeartBeatTask(failedCount + 1)));
} else {
@@ -286,10 +297,22 @@ public void execute() {
new BackOffSleepTask(Math.max(heartBeatInterval, heartBeatRequestTimeout), new SendHeartBeatTask(0)));
}
} catch (Exception e) {
- LOGGER.error("send heart failed, and will try again.", e);
+ // If heartbeat failures three times, log error stack help troubleshooting. Others just log message as warn.
+ if (failedCount == 2) {
+ LOGGER.error("send heart failed, and will try again.", e);
+ } else {
+ LOGGER.warn("send heart failed, and will try again. message [{}]", e.getMessage());
+ }
eventBus.post(new HeartBeatEvent(false, microservice, microserviceInstance));
startTask(new BackOffSleepTask(failedCount + 1, new SendHeartBeatTask(failedCount + 1)));
}
}
}
+
+ class CheckAddressTask implements Runnable {
+ @Override
+ public void run() {
+ serviceCenterClient.checkIsolationAddressAvailable();
+ }
+ }
}
diff --git a/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterWatch.java b/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterWatch.java
index a8be8b98b78..9f24a74a55a 100644
--- a/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterWatch.java
+++ b/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterWatch.java
@@ -17,12 +17,15 @@
package org.apache.servicecomb.service.center.client;
+import java.net.URI;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
+import org.apache.servicecomb.foundation.auth.SignRequest;
import org.apache.servicecomb.http.client.auth.RequestAuthHeaderProvider;
import org.apache.servicecomb.http.client.common.HttpConfiguration.SSLProperties;
import org.apache.servicecomb.http.client.common.WebSocketListener;
@@ -67,7 +70,7 @@ public class ServiceCenterWatch implements WebSocketListener {
private String serviceId;
- private int continuousError = 0;
+ private AtomicInteger continuousError = new AtomicInteger(0);
private final AtomicBoolean reconnecting = new AtomicBoolean(false);
@@ -107,7 +110,7 @@ private void startWatch() {
Map headers = new HashMap<>();
headers.put("x-domain-name", this.tenantName);
headers.putAll(this.extraGlobalHeaders);
- headers.putAll(this.requestAuthHeaderProvider.loadAuthHeader(null));
+ headers.putAll(this.requestAuthHeaderProvider.loadAuthHeader(createSignRequest(address)));
currentServerUri = convertAddress(address);
LOGGER.info("start watch to address {}", currentServerUri);
webSocketTransport = new WebSocketTransport(currentServerUri, sslProperties,
@@ -121,6 +124,17 @@ private void startWatch() {
});
}
+ private SignRequest createSignRequest(String url) {
+ try {
+ URI uri = URI.create(url);
+ SignRequest signRequest = new SignRequest();
+ signRequest.setEndpoint(uri);
+ return signRequest;
+ } catch (Exception e) {
+ return null;
+ }
+ }
+
private String convertAddress(String address) {
String url = String.format(WATCH, project, serviceId);
if (address.startsWith(HTTP)) {
@@ -143,7 +157,7 @@ private void reconnect() {
if (reconnecting.getAndSet(true)) {
return;
}
- continuousError++;
+ continuousError.incrementAndGet();
if (webSocketTransport != null) {
webSocketTransport.close();
}
@@ -151,11 +165,11 @@ private void reconnect() {
}
private void backOff() {
- if (this.continuousError <= 0) {
+ if (this.continuousError.get() <= 0) {
return;
}
try {
- Thread.sleep(Math.min(SLEEP_MAX, this.continuousError * this.continuousError * SLEEP_BASE));
+ Thread.sleep(Math.min(SLEEP_MAX, this.continuousError.get() * this.continuousError.get() * SLEEP_BASE));
} catch (InterruptedException e) {
// do not care
}
@@ -183,7 +197,7 @@ public void onOpen(ServerHandshake serverHandshake) {
LOGGER.info("web socket connected to server {}, status={}, message={}", currentServerUri,
serverHandshake.getHttpStatus(),
serverHandshake.getHttpStatusMessage());
- continuousError = 0;
+ continuousError.set(0);
reconnecting.set(false);
}
}
diff --git a/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/model/Microservice.java b/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/model/Microservice.java
index 1c2fc88a1db..a034e57569f 100755
--- a/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/model/Microservice.java
+++ b/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/model/Microservice.java
@@ -208,4 +208,8 @@ public List getPaths() {
public void setPaths(List paths) {
this.paths = paths;
}
+
+ public void addSchema(String schema) {
+ this.schemas.add(schema);
+ }
}
diff --git a/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/model/MicroserviceInstance.java b/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/model/MicroserviceInstance.java
index bbf6c595260..7f03c314043 100755
--- a/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/model/MicroserviceInstance.java
+++ b/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/model/MicroserviceInstance.java
@@ -147,6 +147,11 @@ public void setMicroservice(Microservice microservice) {
this.microservice = microservice;
}
+ @JsonIgnore
+ public Microservice getMicroservice() {
+ return this.microservice;
+ }
+
@JsonIgnore
public String getServiceName() {
return this.microservice.getServiceName();
@@ -156,4 +161,12 @@ public String getServiceName() {
public String getApplicationName() {
return this.microservice.getAppId();
}
+
+ public void addEndpoint(String endpoint) {
+ this.endpoints.add(endpoint);
+ }
+
+ public void addProperty(String key, String value) {
+ this.properties.put(key, value);
+ }
}
diff --git a/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/model/UpdatePropertiesRequest.java b/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/model/UpdatePropertiesRequest.java
index b10586208a8..d7d4b093930 100644
--- a/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/model/UpdatePropertiesRequest.java
+++ b/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/model/UpdatePropertiesRequest.java
@@ -22,6 +22,8 @@
public class UpdatePropertiesRequest {
private Map properties;
+ private Framework framework;
+
public Map getProperties() {
return properties;
}
@@ -29,4 +31,12 @@ public Map getProperties() {
public void setProperties(Map properties) {
this.properties = properties;
}
+
+ public Framework getFramework() {
+ return framework;
+ }
+
+ public void setFramework(Framework framework) {
+ this.framework = framework;
+ }
}
diff --git a/clients/service-center-client/src/test/java/org/apache/servicecomb/service/center/client/ServiceCenterAddressManagerTest.java b/clients/service-center-client/src/test/java/org/apache/servicecomb/service/center/client/ServiceCenterAddressManagerTest.java
index f5c316cd848..a2888cfad1b 100644
--- a/clients/service-center-client/src/test/java/org/apache/servicecomb/service/center/client/ServiceCenterAddressManagerTest.java
+++ b/clients/service-center-client/src/test/java/org/apache/servicecomb/service/center/client/ServiceCenterAddressManagerTest.java
@@ -41,7 +41,7 @@ class ServiceCenterAddressManagerTest {
@Test
public void getUrlPrefix() {
addresses.add("http://127.0.0.1:30103");
- addressManager1 = new ServiceCenterAddressManager("project", addresses, new EventBus());
+ addressManager1 = new ServiceCenterAddressManager("project", addresses, new EventBus(), "", "");
Assertions.assertNotNull(addressManager1);
@@ -55,7 +55,7 @@ public void getUrlPrefix() {
@Test
public void formatUrlTest() {
addresses.add("http://127.0.0.1:30103");
- addressManager1 = new ServiceCenterAddressManager("project", addresses, new EventBus());
+ addressManager1 = new ServiceCenterAddressManager("project", addresses, new EventBus(), "", "");
Assertions.assertNotNull(addressManager1);
String address = addressManager1.address();
@@ -76,7 +76,7 @@ public void onRefreshEndpointEvent() {
Map> zoneAndRegion = new HashMap<>();
zoneAndRegion.put("sameZone", addressAZ);
zoneAndRegion.put("sameRegion", addressRG);
- addressManager1 = new ServiceCenterAddressManager("project", addresses, new EventBus());
+ addressManager1 = new ServiceCenterAddressManager("project", addresses, new EventBus(), "", "");
RefreshEndpointEvent event = new RefreshEndpointEvent(zoneAndRegion, "SERVICECENTER");
addressManager1.refreshEndpoint(event, "SERVICECENTER");
diff --git a/clients/service-center-client/src/test/java/org/apache/servicecomb/service/center/client/ServiceCenterClientTest.java b/clients/service-center-client/src/test/java/org/apache/servicecomb/service/center/client/ServiceCenterClientTest.java
index 12ad9cda3ab..c486b2bd6ce 100755
--- a/clients/service-center-client/src/test/java/org/apache/servicecomb/service/center/client/ServiceCenterClientTest.java
+++ b/clients/service-center-client/src/test/java/org/apache/servicecomb/service/center/client/ServiceCenterClientTest.java
@@ -19,10 +19,12 @@
import java.io.IOException;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import org.apache.servicecomb.http.client.common.HttpResponse;
+import org.apache.servicecomb.service.center.client.model.Framework;
import org.apache.servicecomb.service.center.client.model.HeartbeatsRequest;
import org.apache.servicecomb.service.center.client.model.InstancesRequest;
import org.apache.servicecomb.service.center.client.model.Microservice;
@@ -41,11 +43,18 @@
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
+import com.google.common.eventbus.EventBus;
/**
* Created by on 2019/10/17.
*/
public class ServiceCenterClientTest {
+ private final ServiceCenterAddressManager addressManager;
+
+ public ServiceCenterClientTest() {
+ this.addressManager = new ServiceCenterAddressManager("default", Arrays.asList("http://127.0.0.1:30100"),
+ new EventBus(), "", "");
+ }
@Test
public void TestGetServiceCenterInstances() throws IOException {
@@ -92,7 +101,7 @@ public void TestGetServiceCenterInstances() throws IOException {
Mockito.when(serviceCenterRawClient.getHttpRequest("/registry/health", null, null)).thenReturn(httpResponse);
- ServiceCenterClient serviceCenterClient = new ServiceCenterClient(serviceCenterRawClient);
+ ServiceCenterClient serviceCenterClient = new ServiceCenterClient(serviceCenterRawClient, addressManager);
MicroserviceInstancesResponse serviceCenterInstances = serviceCenterClient.getServiceCenterInstances();
Assertions.assertNotNull(serviceCenterInstances);
@@ -121,7 +130,7 @@ public void TestRegistryService() throws IOException {
Mockito.anyString()))
.thenReturn(httpResponse);
- ServiceCenterClient serviceCenterClient = new ServiceCenterClient(serviceCenterRawClient);
+ ServiceCenterClient serviceCenterClient = new ServiceCenterClient(serviceCenterRawClient, addressManager);
RegisteredMicroserviceResponse actualResponse = serviceCenterClient.registerMicroservice(microservice);
Assertions.assertNotNull(actualResponse);
@@ -179,7 +188,7 @@ public void TestGetServiceMessage() throws IOException {
Mockito.when(serviceCenterRawClient.getHttpRequest("/registry/microservices/111111", null, null))
.thenReturn(httpResponse);
- ServiceCenterClient serviceCenterClient = new ServiceCenterClient(serviceCenterRawClient);
+ ServiceCenterClient serviceCenterClient = new ServiceCenterClient(serviceCenterRawClient, addressManager);
Microservice microservices = serviceCenterClient.getMicroserviceByServiceId("111111");
Assertions.assertNotNull(microservices);
@@ -207,7 +216,7 @@ public void TestGetServiceList() throws IOException {
Mockito.when(serviceCenterRawClient.getHttpRequest(Mockito.any(), Mockito.any(), Mockito.any()))
.thenReturn(httpResponse);
- ServiceCenterClient serviceCenterClient = new ServiceCenterClient(serviceCenterRawClient);
+ ServiceCenterClient serviceCenterClient = new ServiceCenterClient(serviceCenterRawClient, addressManager);
MicroservicesResponse actualMicroservicesResponse = serviceCenterClient.getMicroserviceList();
Assertions.assertNotNull(actualMicroservicesResponse);
@@ -228,7 +237,7 @@ public void TestQueryServiceId() throws IOException {
Mockito.when(serviceCenterRawClient.getHttpRequest(Mockito.any(), Mockito.any(), Mockito.any()))
.thenReturn(httpResponse);
- ServiceCenterClient serviceCenterClient = new ServiceCenterClient(serviceCenterRawClient);
+ ServiceCenterClient serviceCenterClient = new ServiceCenterClient(serviceCenterRawClient, addressManager);
Microservice microservice = new Microservice("Test111");
RegisteredMicroserviceResponse actualServiceId = serviceCenterClient.queryServiceId(microservice);
@@ -257,7 +266,7 @@ public void TestRegisterServiceInstance() throws IOException {
Mockito.anyString()))
.thenReturn(httpResponse);
- ServiceCenterClient serviceCenterClient = new ServiceCenterClient(serviceCenterRawClient);
+ ServiceCenterClient serviceCenterClient = new ServiceCenterClient(serviceCenterRawClient, addressManager);
RegisteredMicroserviceInstanceResponse actualResponse = serviceCenterClient.registerMicroserviceInstance(instance);
Assertions.assertNotNull(actualResponse);
@@ -276,7 +285,7 @@ public void TestDeleteServiceInstance() throws IOException {
Mockito.when(serviceCenterRawClient.deleteHttpRequest(Mockito.any(), Mockito.any(), Mockito.any()))
.thenReturn(httpResponse);
- ServiceCenterClient serviceCenterClient = new ServiceCenterClient(serviceCenterRawClient);
+ ServiceCenterClient serviceCenterClient = new ServiceCenterClient(serviceCenterRawClient, addressManager);
serviceCenterClient.deleteMicroserviceInstance("111", "222");
}
@@ -310,7 +319,7 @@ public void TestGetServiceInstanceList() throws IOException {
Mockito.when(serviceCenterRawClient.getHttpRequest("/registry/microservices/222222/instances", null, null))
.thenReturn(httpResponse);
- ServiceCenterClient serviceCenterClient = new ServiceCenterClient(serviceCenterRawClient);
+ ServiceCenterClient serviceCenterClient = new ServiceCenterClient(serviceCenterRawClient, addressManager);
MicroserviceInstancesResponse serviceCenterInstances = serviceCenterClient
.getMicroserviceInstanceList("222222");
@@ -364,7 +373,7 @@ public void TestGetServiceInstanceMessage() throws IOException {
Mockito.when(serviceCenterRawClient.getHttpRequest(Mockito.any(), Mockito.any(), Mockito.any()))
.thenReturn(httpResponse);
- ServiceCenterClient serviceCenterClient = new ServiceCenterClient(serviceCenterRawClient);
+ ServiceCenterClient serviceCenterClient = new ServiceCenterClient(serviceCenterRawClient, addressManager);
MicroserviceInstance responseInstance = serviceCenterClient
.getMicroserviceInstance("111", "222");
@@ -394,7 +403,7 @@ public void TestSendHeartBeats() throws IOException {
Mockito.anyString()))
.thenReturn(httpResponse);
- ServiceCenterClient serviceCenterClient = new ServiceCenterClient(serviceCenterRawClient);
+ ServiceCenterClient serviceCenterClient = new ServiceCenterClient(serviceCenterRawClient, addressManager);
serviceCenterClient.sendHeartBeats(heartbeatsRequest);
}
@@ -410,7 +419,7 @@ public void TestUpdateServicesInstanceStatus() throws IOException {
Mockito.when(serviceCenterRawClient.putHttpRequest(Mockito.any(), Mockito.any(), Mockito.any()))
.thenReturn(httpResponse);
- ServiceCenterClient serviceCenterClient = new ServiceCenterClient(serviceCenterRawClient);
+ ServiceCenterClient serviceCenterClient = new ServiceCenterClient(serviceCenterRawClient, addressManager);
Boolean result = serviceCenterClient
.updateMicroserviceInstanceStatus("111", "222", MicroserviceInstanceStatus.UP);
@@ -440,7 +449,7 @@ public void TestGetServiceSchemas() throws IOException {
Mockito.when(serviceCenterRawClient.getHttpRequest(Mockito.any(), Mockito.any(), Mockito.any()))
.thenReturn(httpResponse);
- ServiceCenterClient serviceCenterClient = new ServiceCenterClient(serviceCenterRawClient);
+ ServiceCenterClient serviceCenterClient = new ServiceCenterClient(serviceCenterRawClient, addressManager);
List schemaResponse = serviceCenterClient
.getServiceSchemasList("111", false);
@@ -468,7 +477,7 @@ public void TestGetServiceSchemasContext() throws IOException {
Mockito.when(serviceCenterRawClient.getHttpRequest(Mockito.any(), Mockito.any(), Mockito.any()))
.thenReturn(httpResponse);
- ServiceCenterClient serviceCenterClient = new ServiceCenterClient(serviceCenterRawClient);
+ ServiceCenterClient serviceCenterClient = new ServiceCenterClient(serviceCenterRawClient, addressManager);
String schemaContext = serviceCenterClient
.getServiceSchemaContext("111", "222");
@@ -488,7 +497,7 @@ public void TestUpdateServiceSchema() throws IOException {
Mockito.when(serviceCenterRawClient.putHttpRequest(Mockito.any(), Mockito.any(), Mockito.any()))
.thenReturn(httpResponse);
- ServiceCenterClient serviceCenterClient = new ServiceCenterClient(serviceCenterRawClient);
+ ServiceCenterClient serviceCenterClient = new ServiceCenterClient(serviceCenterRawClient, addressManager);
boolean result = serviceCenterClient
.updateServiceSchemaContext("111", new SchemaInfo());
@@ -506,9 +515,9 @@ public void testUpdateMicroserviceProperties() throws IOException {
Mockito.when(serviceCenterRawClient.putHttpRequest(Mockito.any(), Mockito.any(), Mockito.any()))
.thenReturn(httpResponse);
- ServiceCenterClient serviceCenterClient = new ServiceCenterClient(serviceCenterRawClient);
+ ServiceCenterClient serviceCenterClient = new ServiceCenterClient(serviceCenterRawClient, addressManager);
boolean result = serviceCenterClient
- .updateMicroserviceProperties("111", new HashMap());
+ .updateMicroserviceProperties("111", new HashMap(), new Framework());
Assertions.assertTrue(result);
}
diff --git a/clients/service-center-client/src/test/java/org/apache/servicecomb/service/center/client/ServiceCenterRawClientTest.java b/clients/service-center-client/src/test/java/org/apache/servicecomb/service/center/client/ServiceCenterRawClientTest.java
index 29337e31a44..48f3bd914c6 100755
--- a/clients/service-center-client/src/test/java/org/apache/servicecomb/service/center/client/ServiceCenterRawClientTest.java
+++ b/clients/service-center-client/src/test/java/org/apache/servicecomb/service/center/client/ServiceCenterRawClientTest.java
@@ -41,7 +41,8 @@ public class ServiceCenterRawClientTest {
public void TestDefaultParameter() throws IOException {
HttpTransport httpTransport = Mockito.mock(HttpTransport.class);
- ServiceCenterAddressManager addressManager = new ServiceCenterAddressManager(PROJECT_NAME, Arrays.asList("http://127.0.0.1:30100"), new EventBus());
+ ServiceCenterAddressManager addressManager = new ServiceCenterAddressManager(PROJECT_NAME,
+ Arrays.asList("http://127.0.0.1:30100"), new EventBus(), "", "");
ServiceCenterRawClient client = new ServiceCenterRawClient.Builder()
.setHttpTransport(httpTransport)
.setAddressManager(addressManager)
diff --git a/common/common-access-log/pom.xml b/common/common-access-log/pom.xml
index 1a12f622367..e572e6bfd94 100644
--- a/common/common-access-log/pom.xml
+++ b/common/common-access-log/pom.xml
@@ -21,7 +21,7 @@
common
org.apache.servicecomb
- 3.0.0-SNAPSHOT
+ 3.4.0-SNAPSHOT
4.0.0
@@ -41,6 +41,10 @@
org.apache.servicecomb
common-rest
+
+ org.apache.servicecomb
+ transport-rest-client
+
io.vertx
vertx-codegen
diff --git a/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/AccessLogConfig.java b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/AccessLogConfig.java
index ce2dc58856e..e2f204b3cad 100644
--- a/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/AccessLogConfig.java
+++ b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/AccessLogConfig.java
@@ -17,64 +17,60 @@
package org.apache.servicecomb.common.accessLog;
-import com.netflix.config.DynamicPropertyFactory;
+import org.apache.servicecomb.foundation.common.LegacyPropertyFactory;
public class AccessLogConfig {
- private static final String SERVER_BASE = "servicecomb.accesslog.";
+ public static final String SERVER_BASE = "servicecomb.accesslog.";
- private static final String CLIENT_BASE = "servicecomb.accesslog.request.";
+ public static final String CLIENT_BASE = "servicecomb.accesslog.request.";
- private static final String SERVER_LOG_ENABLED = SERVER_BASE + "enabled";
+ public static final String SERVER_LOG_ENABLED = SERVER_BASE + "enabled";
- private static final String SERVER_LOG_PATTERN = SERVER_BASE + "pattern";
+ public static final String SERVER_LOG_PATTERN = SERVER_BASE + "pattern";
- private static final String CLIENT_LOG_ENABLED = CLIENT_BASE + "enabled";
+ public static final String CLIENT_LOG_ENABLED = CLIENT_BASE + "enabled";
- private static final String CLIENT_LOG_PATTERN = CLIENT_BASE + "pattern";
+ public static final String CLIENT_LOG_PATTERN = CLIENT_BASE + "pattern";
- private static final String DEFAULT_SERVER_PATTERN = "%h - - %t %r %s %B %D";
+ public static final String DEFAULT_SERVER_PATTERN = "%h - - %t %r %s %B %D";
- private static final String DEFAULT_CLIENT_PATTERN = "%h %SCB-transport - - %t %r %s %D";
+ public static final String DEFAULT_CLIENT_PATTERN = "%h %SCB-transport - - %t %r %s %D";
- public static final AccessLogConfig INSTANCE = new AccessLogConfig();
+ public static final AccessLogConfig INSTANCE = new AccessLogConfig();
- private boolean serverLogEnabled;
+ private boolean serverLogEnabled;
- private boolean clientLogEnabled;
+ private boolean clientLogEnabled;
- private String serverLogPattern;
+ private String serverLogPattern;
- private String clientLogPattern;
+ private String clientLogPattern;
- private AccessLogConfig() {
- init();
- }
+ private AccessLogConfig() {
+ init();
+ }
- private void init() {
- clientLogEnabled = DynamicPropertyFactory
- .getInstance().getBooleanProperty(CLIENT_LOG_ENABLED, false).get();
- serverLogEnabled = DynamicPropertyFactory
- .getInstance().getBooleanProperty(SERVER_LOG_ENABLED, false).get();
- clientLogPattern = DynamicPropertyFactory
- .getInstance().getStringProperty(CLIENT_LOG_PATTERN, DEFAULT_CLIENT_PATTERN).get();
- serverLogPattern = DynamicPropertyFactory
- .getInstance().getStringProperty(SERVER_LOG_PATTERN, DEFAULT_SERVER_PATTERN).get();
- }
+ private void init() {
+ clientLogEnabled = LegacyPropertyFactory.getBooleanProperty(CLIENT_LOG_ENABLED, false);
+ serverLogEnabled = LegacyPropertyFactory.getBooleanProperty(SERVER_LOG_ENABLED, false);
+ clientLogPattern = LegacyPropertyFactory.getStringProperty(CLIENT_LOG_PATTERN, DEFAULT_CLIENT_PATTERN);
+ serverLogPattern = LegacyPropertyFactory.getStringProperty(SERVER_LOG_PATTERN, DEFAULT_SERVER_PATTERN);
+ }
- public boolean isServerLogEnabled() {
- return serverLogEnabled;
- }
+ public boolean isServerLogEnabled() {
+ return serverLogEnabled;
+ }
- public boolean isClientLogEnabled() {
- return clientLogEnabled;
- }
+ public boolean isClientLogEnabled() {
+ return clientLogEnabled;
+ }
- public String getServerLogPattern() {
- return serverLogPattern;
- }
+ public String getServerLogPattern() {
+ return serverLogPattern;
+ }
- public String getClientLogPattern() {
- return clientLogPattern;
- }
+ public String getClientLogPattern() {
+ return clientLogPattern;
+ }
}
diff --git a/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/AccessLogConfiguration.java b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/AccessLogConfiguration.java
new file mode 100644
index 00000000000..abbb90adc19
--- /dev/null
+++ b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/AccessLogConfiguration.java
@@ -0,0 +1,28 @@
+/*
+ * 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.servicecomb.common.accessLog;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class AccessLogConfiguration {
+ @Bean
+ public AccessLogBootListener scbAccessLogBootListener() {
+ return new AccessLogBootListener();
+ }
+}
diff --git a/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/client/ClientDefaultInitializer.java b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/client/ClientDefaultInitializer.java
index 658cea9fa55..43e5ad9b191 100644
--- a/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/client/ClientDefaultInitializer.java
+++ b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/client/ClientDefaultInitializer.java
@@ -21,7 +21,6 @@
import org.apache.servicecomb.common.accessLog.AccessLogInitializer;
import org.apache.servicecomb.common.accessLog.core.AccessLogGenerator;
import org.apache.servicecomb.core.event.InvocationFinishEvent;
-
import org.apache.servicecomb.swagger.invocation.InvocationType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -31,7 +30,7 @@
import com.google.common.eventbus.Subscribe;
public class ClientDefaultInitializer implements AccessLogInitializer {
- private static final Logger LOGGER = LoggerFactory.getLogger("requestlog");
+ private static final Logger LOGGER = LoggerFactory.getLogger("scb-access");
private AccessLogGenerator accessLogGenerator;
@@ -48,7 +47,7 @@ public void init(EventBus eventBus, AccessLogConfig accessLogConfig) {
@AllowConcurrentEvents
public void onRequestOut(InvocationFinishEvent finishEvent) {
if (InvocationType.CONSUMER.equals(finishEvent.getInvocation().getInvocationType())) {
- LOGGER.info(accessLogGenerator.generateClientLog(finishEvent));
+ LOGGER.info(accessLogGenerator.generateClientLog(finishEvent));
}
}
}
diff --git a/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/ConfigurableDatetimeAccessItem.java b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/ConfigurableDatetimeAccessItem.java
index d21ee86a3fa..9c759ca2cb5 100644
--- a/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/ConfigurableDatetimeAccessItem.java
+++ b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/ConfigurableDatetimeAccessItem.java
@@ -58,7 +58,7 @@ public ConfigurableDatetimeAccessItem() {
* @param config the format of configuration is "PATTERN|TIMEZONE|LOCALE" or "PATTERN". It depends on whether the config contains the separator "|"
*/
public ConfigurableDatetimeAccessItem(String config) {
- String[] configArr = null;
+ String[] configArr;
if (config.contains("|")) {
configArr = splitConfig(config);
} else {
@@ -71,14 +71,14 @@ public ConfigurableDatetimeAccessItem(String config) {
"wrong format of configuration, \"PATTERN|TIMEZONE|LOCALE\" is expected, but actually is \"" + config + "\"");
}
- setConfigruations(configArr);
+ setConfigurations(configArr);
}
private String[] splitConfig(String config) {
return config.split("\\|{1}?", -1);
}
- private void setConfigruations(String[] configArr) {
+ private void setConfigurations(String[] configArr) {
this.pattern = StringUtils.isEmpty(configArr[0]) ? DEFAULT_DATETIME_PATTERN : configArr[0];
this.timezone = StringUtils.isEmpty(configArr[1]) ? TimeZone.getDefault() : TimeZone.getTimeZone(configArr[1]);
this.locale = StringUtils.isEmpty(configArr[2]) ? DEFAULT_LOCALE : Locale.forLanguageTag(configArr[2]);
@@ -91,10 +91,9 @@ public void appendServerFormattedItem(ServerAccessLogEvent accessLogEvent, Strin
@Override
public void appendClientFormattedItem(InvocationFinishEvent finishEvent, StringBuilder builder) {
- long milliDuration = (finishEvent.getInvocation().getInvocationStageTrace().getStartSend() -
- finishEvent.getInvocation().getInvocationStageTrace().getStart()) / 1000_000;
+ long milliDuration = finishEvent.getInvocation().getInvocationStageTrace().calcTotal() / 1000_000;
doAppendFormattedItem(
- finishEvent.getInvocation().getInvocationStageTrace().getStartTimeMillis() + milliDuration, builder);
+ finishEvent.getInvocation().getInvocationStageTrace().getStartInMillis() + milliDuration, builder);
}
private void doAppendFormattedItem(long milliStartTime, StringBuilder builder) {
diff --git a/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/CookieAccessItem.java b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/CookieAccessItem.java
index 37f7dc5564e..e15179acc69 100644
--- a/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/CookieAccessItem.java
+++ b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/CookieAccessItem.java
@@ -22,9 +22,9 @@
import org.apache.servicecomb.common.accessLog.core.element.AccessLogItem;
import org.apache.servicecomb.common.rest.RestConst;
-import org.apache.servicecomb.common.rest.codec.param.RestClientRequestImpl;
import org.apache.servicecomb.core.event.InvocationFinishEvent;
import org.apache.servicecomb.core.event.ServerAccessLogEvent;
+import org.apache.servicecomb.transport.rest.client.RestClientRequestParameters;
import io.vertx.core.http.Cookie;
import io.vertx.ext.web.RoutingContext;
@@ -57,8 +57,8 @@ public void appendServerFormattedItem(ServerAccessLogEvent accessLogEvent, Strin
@Override
public void appendClientFormattedItem(InvocationFinishEvent finishEvent, StringBuilder builder) {
- RestClientRequestImpl restRequestImpl = (RestClientRequestImpl) finishEvent.getInvocation().getHandlerContext()
- .get(RestConst.INVOCATION_HANDLER_REQUESTCLIENT);
+ RestClientRequestParameters restRequestImpl = (RestClientRequestParameters) finishEvent.getInvocation().getHandlerContext()
+ .get(RestConst.INVOCATION_HANDLER_REQUESTCLIENT);
if (null == restRequestImpl || null == restRequestImpl.getCookieMap()) {
builder.append(RESULT_NOT_FOUND);
return;
diff --git a/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/DurationMillisecondAccessItem.java b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/DurationMillisecondAccessItem.java
index e0bde4ad306..49ecda73d94 100644
--- a/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/DurationMillisecondAccessItem.java
+++ b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/DurationMillisecondAccessItem.java
@@ -31,7 +31,6 @@ public void appendServerFormattedItem(ServerAccessLogEvent accessLogEvent, Strin
@Override
public void appendClientFormattedItem(InvocationFinishEvent finishEvent, StringBuilder builder) {
- builder.append((finishEvent.getInvocation().getInvocationStageTrace().getFinish() -
- finishEvent.getInvocation().getInvocationStageTrace().getStartSend()) / 1000_000);
+ builder.append(finishEvent.getInvocation().getInvocationStageTrace().calcTotal() / 1000_000);
}
}
diff --git a/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/DurationSecondAccessItem.java b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/DurationSecondAccessItem.java
index 2da34026d5e..68d2ba0d411 100644
--- a/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/DurationSecondAccessItem.java
+++ b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/DurationSecondAccessItem.java
@@ -33,7 +33,6 @@ public void appendServerFormattedItem(ServerAccessLogEvent accessLogEvent, Strin
@Override
public void appendClientFormattedItem(InvocationFinishEvent finishEvent, StringBuilder builder) {
- builder.append((finishEvent.getInvocation().getInvocationStageTrace().getFinish() -
- finishEvent.getInvocation().getInvocationStageTrace().getStartSend()) / 1000_000_000);
+ builder.append(finishEvent.getInvocation().getInvocationStageTrace().calcTotal() / 1000_000_000);
}
}
diff --git a/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/HttpMethodAccessItem.java b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/HttpMethodAccessItem.java
index 8a59112b89a..8c8b61583e3 100644
--- a/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/HttpMethodAccessItem.java
+++ b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/HttpMethodAccessItem.java
@@ -21,7 +21,7 @@
import org.apache.commons.lang3.StringUtils;
import org.apache.servicecomb.common.accessLog.core.element.AccessLogItem;
import org.apache.servicecomb.common.rest.RestConst;
-import org.apache.servicecomb.common.rest.codec.param.RestClientRequestImpl;
+import org.apache.servicecomb.common.rest.codec.RestClientRequest;
import org.apache.servicecomb.core.definition.OperationMeta;
import org.apache.servicecomb.core.event.InvocationFinishEvent;
import org.apache.servicecomb.core.event.ServerAccessLogEvent;
@@ -53,13 +53,13 @@ public void appendClientFormattedItem(InvocationFinishEvent finishEvent, StringB
builder.append(operationMeta.getHttpMethod());
return;
}
- RestClientRequestImpl restRequestImpl = (RestClientRequestImpl) finishEvent.getInvocation().getHandlerContext()
+ RestClientRequest restRequestImpl = (RestClientRequest) finishEvent.getInvocation().getHandlerContext()
.get(RestConst.INVOCATION_HANDLER_REQUESTCLIENT);
- if (null == restRequestImpl || null == restRequestImpl.getRequest()
- || null == restRequestImpl.getRequest().getMethod()) {
+ if (null == restRequestImpl || null == restRequestImpl.getHttpClientRequest()
+ || null == restRequestImpl.getHttpClientRequest().getMethod()) {
builder.append(EMPTY_RESULT);
return;
}
- builder.append(restRequestImpl.getRequest().getMethod().toString());
+ builder.append(restRequestImpl.getHttpClientRequest().getMethod().toString());
}
}
diff --git a/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/HttpStatusAccessItem.java b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/HttpStatusAccessItem.java
index f4e8770bd06..61be5a790a6 100644
--- a/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/HttpStatusAccessItem.java
+++ b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/HttpStatusAccessItem.java
@@ -21,15 +21,11 @@
import org.apache.servicecomb.core.event.InvocationFinishEvent;
import org.apache.servicecomb.core.event.ServerAccessLogEvent;
import org.apache.servicecomb.swagger.invocation.Response;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import io.vertx.core.http.HttpServerResponse;
import io.vertx.ext.web.RoutingContext;
public class HttpStatusAccessItem implements AccessLogItem {
- private static final Logger LOGGER = LoggerFactory.getLogger(HttpStatusAccessItem.class);
-
public static final String EMPTY_RESULT = "-";
@Override
@@ -40,9 +36,6 @@ public void appendServerFormattedItem(ServerAccessLogEvent accessLogEvent, Strin
return;
}
if (response.closed() && !response.ended()) {
- LOGGER.warn(
- "Response is closed before sending any data. "
- + "Please check idle connection timeout for provider is properly configured.");
builder.append(EMPTY_RESULT);
return;
}
diff --git a/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/LocalHostAccessItem.java b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/LocalHostAccessItem.java
index ef070c685d3..cfa2068b297 100644
--- a/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/LocalHostAccessItem.java
+++ b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/LocalHostAccessItem.java
@@ -21,7 +21,7 @@
import org.apache.commons.lang3.StringUtils;
import org.apache.servicecomb.common.accessLog.core.element.AccessLogItem;
import org.apache.servicecomb.common.rest.RestConst;
-import org.apache.servicecomb.common.rest.codec.param.RestClientRequestImpl;
+import org.apache.servicecomb.common.rest.codec.RestClientRequest;
import org.apache.servicecomb.core.event.InvocationFinishEvent;
import org.apache.servicecomb.core.event.ServerAccessLogEvent;
@@ -41,16 +41,16 @@ public void appendServerFormattedItem(ServerAccessLogEvent accessLogEvent, Strin
*/
@Override
public void appendClientFormattedItem(InvocationFinishEvent finishEvent, StringBuilder builder) {
- RestClientRequestImpl restRequestImpl = (RestClientRequestImpl) finishEvent.getInvocation().getHandlerContext()
+ RestClientRequest restRequestImpl = (RestClientRequest) finishEvent.getInvocation().getHandlerContext()
.get(RestConst.INVOCATION_HANDLER_REQUESTCLIENT);
- if (null == restRequestImpl || null == restRequestImpl.getRequest()
- || null == restRequestImpl.getRequest().connection()
- || null == restRequestImpl.getRequest().connection().localAddress()
- || StringUtils.isEmpty(restRequestImpl.getRequest().connection().localAddress().host())) {
+ if (null == restRequestImpl || null == restRequestImpl.getHttpClientRequest()
+ || null == restRequestImpl.getHttpClientRequest().connection()
+ || null == restRequestImpl.getHttpClientRequest().connection().localAddress()
+ || StringUtils.isEmpty(restRequestImpl.getHttpClientRequest().connection().localAddress().host())) {
builder.append(EMPTY_RESULT);
return;
}
- builder.append(restRequestImpl.getRequest().connection().localAddress().host());
+ builder.append(restRequestImpl.getHttpClientRequest().connection().localAddress().host());
}
public static String getLocalAddress(RoutingContext context) {
diff --git a/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/LocalPortAccessItem.java b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/LocalPortAccessItem.java
index ffbc983abaf..def97c325be 100644
--- a/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/LocalPortAccessItem.java
+++ b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/LocalPortAccessItem.java
@@ -20,9 +20,9 @@
import org.apache.servicecomb.common.accessLog.core.element.AccessLogItem;
import org.apache.servicecomb.common.rest.RestConst;
-import org.apache.servicecomb.common.rest.codec.param.RestClientRequestImpl;
import org.apache.servicecomb.core.event.InvocationFinishEvent;
import org.apache.servicecomb.core.event.ServerAccessLogEvent;
+import org.apache.servicecomb.transport.rest.client.RestClientRequestParameters;
import io.vertx.core.http.HttpServerRequest;
import io.vertx.ext.web.RoutingContext;
@@ -43,14 +43,15 @@ public void appendServerFormattedItem(ServerAccessLogEvent accessLogEvent, Strin
@Override
public void appendClientFormattedItem(InvocationFinishEvent finishEvent, StringBuilder builder) {
- RestClientRequestImpl restRequestImpl = (RestClientRequestImpl) finishEvent.getInvocation().getHandlerContext()
+ RestClientRequestParameters restRequestImpl = (RestClientRequestParameters) finishEvent.getInvocation()
+ .getHandlerContext()
.get(RestConst.INVOCATION_HANDLER_REQUESTCLIENT);
- if (null == restRequestImpl || null == restRequestImpl.getRequest()
- || null == restRequestImpl.getRequest().connection()
- || null == restRequestImpl.getRequest().connection().localAddress()) {
+ if (null == restRequestImpl || null == restRequestImpl.getHttpClientRequest()
+ || null == restRequestImpl.getHttpClientRequest().connection()
+ || null == restRequestImpl.getHttpClientRequest().connection().localAddress()) {
builder.append(EMPTY_RESULT);
return;
}
- builder.append(restRequestImpl.getRequest().connection().localAddress().port());
+ builder.append(restRequestImpl.getHttpClientRequest().connection().localAddress().port());
}
}
diff --git a/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/QueryStringAccessItem.java b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/QueryStringAccessItem.java
index 6ab7eb4a60d..e2493bd3c09 100644
--- a/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/QueryStringAccessItem.java
+++ b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/QueryStringAccessItem.java
@@ -20,9 +20,9 @@
import org.apache.commons.lang3.StringUtils;
import org.apache.servicecomb.common.accessLog.core.element.AccessLogItem;
import org.apache.servicecomb.common.rest.RestConst;
-import org.apache.servicecomb.common.rest.codec.param.RestClientRequestImpl;
import org.apache.servicecomb.core.event.InvocationFinishEvent;
import org.apache.servicecomb.core.event.ServerAccessLogEvent;
+import org.apache.servicecomb.transport.rest.client.RestClientRequestParameters;
import io.vertx.core.http.HttpServerRequest;
import io.vertx.ext.web.RoutingContext;
@@ -42,13 +42,14 @@ public void appendServerFormattedItem(ServerAccessLogEvent accessLogEvent, Strin
@Override
public void appendClientFormattedItem(InvocationFinishEvent finishEvent, StringBuilder builder) {
- RestClientRequestImpl restRequestImpl = (RestClientRequestImpl) finishEvent.getInvocation().getHandlerContext()
+ RestClientRequestParameters restRequestImpl = (RestClientRequestParameters) finishEvent.getInvocation()
+ .getHandlerContext()
.get(RestConst.INVOCATION_HANDLER_REQUESTCLIENT);
- if (null == restRequestImpl || null == restRequestImpl.getRequest()
- || StringUtils.isEmpty(restRequestImpl.getRequest().query())) {
+ if (null == restRequestImpl || null == restRequestImpl.getHttpClientRequest()
+ || StringUtils.isEmpty(restRequestImpl.getHttpClientRequest().query())) {
builder.append(EMPTY_RESULT);
return;
}
- builder.append(restRequestImpl.getRequest().query());
+ builder.append(restRequestImpl.getHttpClientRequest().query());
}
}
diff --git a/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/RequestHeaderAccessItem.java b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/RequestHeaderAccessItem.java
index 61b3f88f9da..54099d3b4b1 100644
--- a/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/RequestHeaderAccessItem.java
+++ b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/RequestHeaderAccessItem.java
@@ -20,9 +20,9 @@
import org.apache.commons.lang3.StringUtils;
import org.apache.servicecomb.common.accessLog.core.element.AccessLogItem;
import org.apache.servicecomb.common.rest.RestConst;
-import org.apache.servicecomb.common.rest.codec.param.RestClientRequestImpl;
import org.apache.servicecomb.core.event.InvocationFinishEvent;
import org.apache.servicecomb.core.event.ServerAccessLogEvent;
+import org.apache.servicecomb.transport.rest.client.RestClientRequestParameters;
import io.vertx.core.MultiMap;
import io.vertx.ext.web.RoutingContext;
@@ -48,15 +48,16 @@ public void appendServerFormattedItem(ServerAccessLogEvent accessLogEvent, Strin
@Override
public void appendClientFormattedItem(InvocationFinishEvent clientLogEvent, StringBuilder builder) {
- RestClientRequestImpl restRequestImpl = (RestClientRequestImpl) clientLogEvent.getInvocation().getHandlerContext()
+ RestClientRequestParameters restRequestImpl = (RestClientRequestParameters) clientLogEvent.getInvocation()
+ .getHandlerContext()
.get(RestConst.INVOCATION_HANDLER_REQUESTCLIENT);
- if (null == restRequestImpl || null == restRequestImpl.getRequest()
- || null == restRequestImpl.getRequest().headers()
- || StringUtils.isEmpty(restRequestImpl.getRequest().headers().get(varName))) {
+ if (null == restRequestImpl || null == restRequestImpl.getHttpClientRequest()
+ || null == restRequestImpl.getHttpClientRequest().headers()
+ || StringUtils.isEmpty(restRequestImpl.getHttpClientRequest().headers().get(varName))) {
builder.append(RESULT_NOT_FOUND);
return;
}
- builder.append(restRequestImpl.getRequest().headers().get(varName));
+ builder.append(restRequestImpl.getHttpClientRequest().headers().get(varName));
}
public String getVarName() {
diff --git a/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/TraceIdAccessItem.java b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/TraceIdAccessItem.java
index 5940ffc0484..e9dfe16d018 100644
--- a/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/TraceIdAccessItem.java
+++ b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/TraceIdAccessItem.java
@@ -18,14 +18,14 @@
package org.apache.servicecomb.common.accessLog.core.element.impl;
import org.apache.commons.lang3.StringUtils;
-import org.apache.servicecomb.core.Const;
+import org.apache.servicecomb.core.CoreConst;
import org.apache.servicecomb.core.Invocation;
import org.apache.servicecomb.core.event.InvocationFinishEvent;
import org.apache.servicecomb.core.event.ServerAccessLogEvent;
public class TraceIdAccessItem extends InvocationContextAccessItem {
- public static final String TRACE_ID = Const.TRACE_ID_NAME;
+ public static final String TRACE_ID = CoreConst.TRACE_ID_NAME;
public TraceIdAccessItem() {
super(TRACE_ID);
diff --git a/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/UrlPathAccessItem.java b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/UrlPathAccessItem.java
index ff999da04c3..5435a22cfb1 100644
--- a/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/UrlPathAccessItem.java
+++ b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/UrlPathAccessItem.java
@@ -21,11 +21,11 @@
import org.apache.commons.lang3.StringUtils;
import org.apache.servicecomb.common.accessLog.core.element.AccessLogItem;
import org.apache.servicecomb.common.rest.RestConst;
-import org.apache.servicecomb.common.rest.codec.param.RestClientRequestImpl;
import org.apache.servicecomb.core.definition.OperationMeta;
import org.apache.servicecomb.core.definition.SchemaMeta;
import org.apache.servicecomb.core.event.InvocationFinishEvent;
import org.apache.servicecomb.core.event.ServerAccessLogEvent;
+import org.apache.servicecomb.transport.rest.client.RestClientRequestParameters;
import io.vertx.core.http.HttpServerRequest;
import io.vertx.ext.web.RoutingContext;
@@ -49,16 +49,17 @@ public void appendClientFormattedItem(InvocationFinishEvent finishEvent, StringB
OperationMeta operationMeta = finishEvent.getInvocation().getOperationMeta();
SchemaMeta schemaMeta = finishEvent.getInvocation().getSchemaMeta();
if (operationMeta != null && schemaMeta != null && schemaMeta.getSwagger() != null) {
- builder.append(schemaMeta.getSwagger().getBasePath()).append(operationMeta.getOperationPath());
+ builder.append(operationMeta.getOperationPath());
return;
}
- RestClientRequestImpl restRequestImpl = (RestClientRequestImpl) finishEvent.getInvocation().getHandlerContext()
+ RestClientRequestParameters restRequestImpl = (RestClientRequestParameters) finishEvent.getInvocation()
+ .getHandlerContext()
.get(RestConst.INVOCATION_HANDLER_REQUESTCLIENT);
- if (null == restRequestImpl || null == restRequestImpl.getRequest()
- || StringUtils.isEmpty(restRequestImpl.getRequest().path())) {
+ if (null == restRequestImpl || null == restRequestImpl.getHttpClientRequest()
+ || StringUtils.isEmpty(restRequestImpl.getHttpClientRequest().path())) {
builder.append(EMPTY_RESULT);
return;
}
- builder.append(restRequestImpl.getRequest().path());
+ builder.append(restRequestImpl.getHttpClientRequest().path());
}
}
diff --git a/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/parser/impl/VertxRestAccessLogPatternParser.java b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/parser/impl/VertxRestAccessLogPatternParser.java
index 7a5b6fb6df3..7a8568b97f7 100644
--- a/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/parser/impl/VertxRestAccessLogPatternParser.java
+++ b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/parser/impl/VertxRestAccessLogPatternParser.java
@@ -22,7 +22,6 @@
import java.util.Iterator;
import java.util.List;
-import com.google.common.annotations.VisibleForTesting;
import org.apache.servicecomb.common.accessLog.core.element.AccessLogItem;
import org.apache.servicecomb.common.accessLog.core.element.impl.PlainTextAccessItem;
import org.apache.servicecomb.common.accessLog.core.parser.AccessLogItemMeta;
@@ -33,6 +32,8 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import com.google.common.annotations.VisibleForTesting;
+
import io.vertx.ext.web.RoutingContext;
/**
@@ -173,7 +174,6 @@ private List matchAccessLogItem(String rawPattern) {
AccessLogItemLocation candidate = null;
for (VertxRestAccessLogItemMeta meta : metaList) {
if (null != candidate && null == meta.getSuffix()) {
- // TODO:
// if user define item("%{","}ab") and item("%{_","}abc") and the pattern is "%{_var}ab}abc"
// currently the result is item("%{","_var","}ab"), plaintext("}abc")
// is this acceptable?
diff --git a/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/server/ServerDefaultInitializer.java b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/server/ServerDefaultInitializer.java
index c528b67f9b9..7baf69dd8aa 100644
--- a/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/server/ServerDefaultInitializer.java
+++ b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/server/ServerDefaultInitializer.java
@@ -31,7 +31,7 @@
public class ServerDefaultInitializer implements AccessLogInitializer {
- private static final Logger LOGGER = LoggerFactory.getLogger("accesslog");
+ private static final Logger LOGGER = LoggerFactory.getLogger("scb-access");
private AccessLogGenerator accessLogGenerator;
diff --git a/common/common-access-log/src/main/resources/META-INF/services/org.apache.servicecomb.common.accessLog.core.parser.VertxRestAccessLogItemMeta b/common/common-access-log/src/main/resources/META-INF/services/org.apache.servicecomb.common.accessLog.core.parser.VertxRestAccessLogItemMeta
index 78f937b61fe..f793ca0f575 100644
--- a/common/common-access-log/src/main/resources/META-INF/services/org.apache.servicecomb.common.accessLog.core.parser.VertxRestAccessLogItemMeta
+++ b/common/common-access-log/src/main/resources/META-INF/services/org.apache.servicecomb.common.accessLog.core.parser.VertxRestAccessLogItemMeta
@@ -15,4 +15,4 @@
# limitations under the License.
#
-org.apache.servicecomb.common.accessLog.core.parser.impl.DefaultCompositeVertxRestAccessLogItemMeta
\ No newline at end of file
+org.apache.servicecomb.common.accessLog.core.parser.impl.DefaultCompositeVertxRestAccessLogItemMeta
diff --git a/common/common-access-log/src/main/resources/META-INF/services/org.apache.servicecomb.core.BootListener b/common/common-access-log/src/main/resources/META-INF/services/org.apache.servicecomb.core.BootListener
deleted file mode 100644
index 7ab357ee11c..00000000000
--- a/common/common-access-log/src/main/resources/META-INF/services/org.apache.servicecomb.core.BootListener
+++ /dev/null
@@ -1,18 +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.
-#
-
-org.apache.servicecomb.common.accessLog.AccessLogBootListener
\ No newline at end of file
diff --git a/common/common-access-log/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/common/common-access-log/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
new file mode 100644
index 00000000000..e6814e63814
--- /dev/null
+++ b/common/common-access-log/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@@ -0,0 +1,18 @@
+## ---------------------------------------------------------------------------
+## 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.
+## ---------------------------------------------------------------------------
+
+org.apache.servicecomb.common.accessLog.AccessLogConfiguration
diff --git a/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/AccessLogConfigTest.java b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/AccessLogConfigTest.java
deleted file mode 100644
index 964cc6d0e8d..00000000000
--- a/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/AccessLogConfigTest.java
+++ /dev/null
@@ -1,42 +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.servicecomb.common.accessLog.core;
-
-import org.apache.servicecomb.common.accessLog.AccessLogConfig;
-import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.Test;
-
-public class AccessLogConfigTest {
-
- @Test
- public void getAccessLogEnabled() {
- boolean serverEnabled = AccessLogConfig.INSTANCE.isServerLogEnabled();
- boolean clientEnabled = AccessLogConfig.INSTANCE.isClientLogEnabled();
- Assertions.assertFalse(serverEnabled);
- Assertions.assertFalse(clientEnabled);
- }
-
- @Test
- public void getAccessLogPattern() {
- String clientLogPattern = AccessLogConfig.INSTANCE.getClientLogPattern();
- String serverLogPattern = AccessLogConfig.INSTANCE.getServerLogPattern();
-
- Assertions.assertEquals("%h - - %t %r %s %B %D", serverLogPattern);
- Assertions.assertEquals("%h %SCB-transport - - %t %r %s %D", clientLogPattern);
- }
-}
diff --git a/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/AccessLogGeneratorTest.java b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/AccessLogGeneratorTest.java
index ee26be04cee..e8c7cf38500 100644
--- a/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/AccessLogGeneratorTest.java
+++ b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/AccessLogGeneratorTest.java
@@ -81,10 +81,8 @@ public void testClientLog() {
InvocationStageTrace stageTrace = Mockito.mock(InvocationStageTrace.class);
OperationMeta operationMeta = Mockito.mock(OperationMeta.class);
long startMillisecond = 1416863450581L;
- when(stageTrace.getStartSend()).thenReturn(0L);
- when(stageTrace.getStart()).thenReturn(0L);
- when(stageTrace.getFinish()).thenReturn(0L);
- when(stageTrace.getStartTimeMillis()).thenReturn(startMillisecond);
+ when(stageTrace.getStartInMillis()).thenReturn(startMillisecond);
+ when(stageTrace.calcTotal()).thenReturn(0L);
when(invocation.getOperationMeta()).thenReturn(operationMeta);
when(invocation.getInvocationStageTrace()).thenReturn(stageTrace);
diff --git a/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/CookieItemTest.java b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/CookieItemTest.java
index 5f96b175628..f1d37e9681f 100644
--- a/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/CookieItemTest.java
+++ b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/CookieItemTest.java
@@ -23,18 +23,18 @@
import java.util.HashSet;
import java.util.Map;
-import io.vertx.core.http.HttpServerRequest;
import org.apache.servicecomb.common.rest.RestConst;
-import org.apache.servicecomb.common.rest.codec.param.RestClientRequestImpl;
import org.apache.servicecomb.core.Invocation;
import org.apache.servicecomb.core.event.InvocationFinishEvent;
import org.apache.servicecomb.core.event.ServerAccessLogEvent;
+import org.apache.servicecomb.transport.rest.client.RestClientRequestParameters;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
import io.vertx.core.http.Cookie;
+import io.vertx.core.http.HttpServerRequest;
import io.vertx.core.http.impl.CookieImpl;
import io.vertx.ext.web.RoutingContext;
@@ -58,7 +58,7 @@ public class CookieItemTest {
private Invocation invocation;
- private RestClientRequestImpl restClientRequest;
+ private RestClientRequestParameters restClientRequest;
@BeforeEach
public void initStrBuilder() {
@@ -66,7 +66,7 @@ public void initStrBuilder() {
httpServerRequest = Mockito.mock(HttpServerRequest.class);
finishEvent = Mockito.mock(InvocationFinishEvent.class);
invocation = Mockito.mock(Invocation.class);
- restClientRequest = Mockito.mock(RestClientRequestImpl.class);
+ restClientRequest = Mockito.mock(RestClientRequestParameters.class);
accessLogEvent = new ServerAccessLogEvent();
strBuilder = new StringBuilder();
diff --git a/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/DatetimeConfigurableItemTest.java b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/DatetimeConfigurableItemTest.java
index 750ebde7e39..8f55eb0006c 100644
--- a/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/DatetimeConfigurableItemTest.java
+++ b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/DatetimeConfigurableItemTest.java
@@ -30,10 +30,6 @@
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.condition.EnabledOnJre;
-import org.junit.jupiter.api.condition.EnabledOnOs;
-import org.junit.jupiter.api.condition.JRE;
-import org.junit.jupiter.api.condition.OS;
import org.mockito.Mockito;
public class DatetimeConfigurableItemTest {
@@ -58,61 +54,19 @@ public void initStrBuilder() {
when(finishEvent.getInvocation()).thenReturn(invocation);
when(invocation.getInvocationStageTrace()).thenReturn(invocationStageTrace);
- when(invocationStageTrace.getStartSend()).thenReturn(0L);
- when(invocationStageTrace.getStart()).thenReturn(0L);
- when(invocationStageTrace.getStartTimeMillis()).thenReturn(START_MILLISECOND);
+ when(invocationStageTrace.getStartInMillis()).thenReturn(START_MILLISECOND);
+ when(invocationStageTrace.calcTotal()).thenReturn(0L);
accessLogEvent = new ServerAccessLogEvent();
accessLogEvent.setMilliStartTime(START_MILLISECOND);
strBuilder = new StringBuilder();
}
- @Test
- @EnabledOnOs({OS.LINUX, OS.WINDOWS})
- @EnabledOnJre(JRE.JAVA_8)
- public void serverFormattedElement() {
- ConfigurableDatetimeAccessItem element = new ConfigurableDatetimeAccessItem(
- "EEE, yyyy MMM dd HH:mm:ss zzz|GMT-08|zh-CN");
- element.appendServerFormattedItem(accessLogEvent, strBuilder);
- Assertions.assertEquals("星期一, 2014 十一月 24 13:10:50 GMT-08:00", strBuilder.toString());
- }
-
- @Test
- @EnabledOnOs({OS.LINUX, OS.WINDOWS})
- @EnabledOnJre(JRE.JAVA_8)
- public void clientFormattedElement() {
- ConfigurableDatetimeAccessItem element = new ConfigurableDatetimeAccessItem(
- "EEE, yyyy MMM dd HH:mm:ss zzz|GMT-08|zh-CN");
- element.appendClientFormattedItem(finishEvent, strBuilder);
- Assertions.assertEquals("星期一, 2014 十一月 24 13:10:50 GMT-08:00", strBuilder.toString());
- }
-
- @Test
- @EnabledOnOs({OS.LINUX, OS.WINDOWS})
- @EnabledOnJre(JRE.JAVA_8)
- public void serverFormattedElementOnNoPattern() {
- ConfigurableDatetimeAccessItem element = new ConfigurableDatetimeAccessItem(
- "|GMT+08|zh-CN");
-
- element.appendServerFormattedItem(accessLogEvent, strBuilder);
- Assertions.assertEquals("星期二, 25 十一月 2014 05:10:50 GMT+08:00", strBuilder.toString());
- }
-
- @Test
- @EnabledOnOs({OS.LINUX, OS.WINDOWS})
- @EnabledOnJre(JRE.JAVA_8)
- public void clientFormattedElementOnNoPattern() {
- ConfigurableDatetimeAccessItem element = new ConfigurableDatetimeAccessItem(
- "|GMT+08|zh-CN");
-
- element.appendClientFormattedItem(finishEvent, strBuilder);
- Assertions.assertEquals("星期二, 25 十一月 2014 05:10:50 GMT+08:00", strBuilder.toString());
- }
@Test
public void getFormattedElementOnNoTimezone() {
ConfigurableDatetimeAccessItem element = new ConfigurableDatetimeAccessItem(
- "yyyy/MM/dd zzz||zh-CN");
+ "yyyy/MM/dd zzz||zh-CN");
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd zzz", Locale.forLanguageTag("zh-CN"));
simpleDateFormat.setTimeZone(TimeZone.getDefault());
@@ -123,7 +77,7 @@ public void getFormattedElementOnNoTimezone() {
@Test
public void clientFormattedElementOnNoTimezone() {
ConfigurableDatetimeAccessItem element = new ConfigurableDatetimeAccessItem(
- "yyyy/MM/dd zzz||zh-CN");
+ "yyyy/MM/dd zzz||zh-CN");
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd zzz", Locale.forLanguageTag("zh-CN"));
simpleDateFormat.setTimeZone(TimeZone.getDefault());
@@ -134,7 +88,7 @@ public void clientFormattedElementOnNoTimezone() {
@Test
public void serverFormattedElementOnNoLocale() {
ConfigurableDatetimeAccessItem element = new ConfigurableDatetimeAccessItem(
- "EEE, dd MMM yyyy HH:mm:ss zzz|GMT+08|");
+ "EEE, dd MMM yyyy HH:mm:ss zzz|GMT+08|");
element.appendServerFormattedItem(accessLogEvent, strBuilder);
Assertions.assertEquals("Tue, 25 Nov 2014 05:10:50 GMT+08:00", strBuilder.toString());
@@ -143,7 +97,7 @@ public void serverFormattedElementOnNoLocale() {
@Test
public void clientFormattedElementOnNoLocale() {
ConfigurableDatetimeAccessItem element = new ConfigurableDatetimeAccessItem(
- "EEE, dd MMM yyyy HH:mm:ss zzz|GMT+08|");
+ "EEE, dd MMM yyyy HH:mm:ss zzz|GMT+08|");
element.appendClientFormattedItem(finishEvent, strBuilder);
Assertions.assertEquals("Tue, 25 Nov 2014 05:10:50 GMT+08:00", strBuilder.toString());
@@ -152,9 +106,9 @@ public void clientFormattedElementOnNoLocale() {
@Test
public void serverFormattedElementOnNoConfig() {
ConfigurableDatetimeAccessItem element = new ConfigurableDatetimeAccessItem(
- "||");
+ "||");
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(ConfigurableDatetimeAccessItem.DEFAULT_DATETIME_PATTERN,
- Locale.US);
+ Locale.US);
simpleDateFormat.setTimeZone(TimeZone.getDefault());
element.appendServerFormattedItem(accessLogEvent, strBuilder);
@@ -164,9 +118,9 @@ public void serverFormattedElementOnNoConfig() {
@Test
public void clientFormattedElementOnNoConfig() {
ConfigurableDatetimeAccessItem element = new ConfigurableDatetimeAccessItem(
- "||");
+ "||");
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(ConfigurableDatetimeAccessItem.DEFAULT_DATETIME_PATTERN,
- Locale.US);
+ Locale.US);
simpleDateFormat.setTimeZone(TimeZone.getDefault());
element.appendClientFormattedItem(finishEvent, strBuilder);
diff --git a/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/DurationMillisecondItemTest.java b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/DurationMillisecondItemTest.java
index 7ad32b23f87..1fdd3b4e0d0 100644
--- a/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/DurationMillisecondItemTest.java
+++ b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/DurationMillisecondItemTest.java
@@ -50,8 +50,7 @@ public void initStrBuilder() {
when(finishEvent.getInvocation()).thenReturn(invocation);
when(invocation.getInvocationStageTrace()).thenReturn(invocationStageTrace);
- when(invocationStageTrace.getStartSend()).thenReturn(0L);
- when(invocationStageTrace.getFinish()).thenReturn(1000_000L);
+ when(invocationStageTrace.calcTotal()).thenReturn(1000_000L);
accessLogEvent = new ServerAccessLogEvent();
accessLogEvent.setMilliStartTime(1L);
diff --git a/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/DurationSecondItemTest.java b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/DurationSecondItemTest.java
index 3081ce51368..9cbe7f28da5 100644
--- a/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/DurationSecondItemTest.java
+++ b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/DurationSecondItemTest.java
@@ -50,7 +50,7 @@ public void initStrBuilder() {
when(finishEvent.getInvocation()).thenReturn(invocation);
when(invocation.getInvocationStageTrace()).thenReturn(invocationStageTrace);
- when(invocationStageTrace.getStartSend()).thenReturn(1000_000L);
+ when(invocationStageTrace.calcTotal()).thenReturn(1L);
accessLogEvent = new ServerAccessLogEvent();
accessLogEvent.setMilliStartTime(1L);
@@ -66,7 +66,7 @@ public void serverFormattedElementOn999ms() {
@Test
public void clientFormattedElementOn999ms() {
- when(invocationStageTrace.getFinish()).thenReturn(1000_000_000L);
+ when(invocationStageTrace.calcTotal()).thenReturn(0L);
ELEMENT.appendClientFormattedItem(finishEvent, strBuilder);
Assertions.assertEquals("0", strBuilder.toString());
}
@@ -80,7 +80,7 @@ public void serverFormattedElementOn1000ms() {
@Test
public void clientFormattedElementOn1000ms() {
- when(invocationStageTrace.getFinish()).thenReturn(1001_000_000L);
+ when(invocationStageTrace.calcTotal()).thenReturn(1000_000_000L);
ELEMENT.appendClientFormattedItem(finishEvent, strBuilder);
Assertions.assertEquals("1", strBuilder.toString());
}
@@ -94,7 +94,7 @@ public void serverFormattedElementOn1001ms() {
@Test
public void clientFormattedElementOn1001ms() {
- when(invocationStageTrace.getFinish()).thenReturn(1002_000_000L);
+ when(invocationStageTrace.calcTotal()).thenReturn(1000_000_000L);
ELEMENT.appendClientFormattedItem(finishEvent, strBuilder);
Assertions.assertEquals("1", strBuilder.toString());
}
diff --git a/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/FirstLineOfRequestItemTest.java b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/FirstLineOfRequestItemTest.java
index 4d75a0befd5..54e1fccef33 100644
--- a/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/FirstLineOfRequestItemTest.java
+++ b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/FirstLineOfRequestItemTest.java
@@ -23,12 +23,12 @@
import java.util.Map;
import org.apache.servicecomb.common.rest.RestConst;
-import org.apache.servicecomb.common.rest.codec.param.RestClientRequestImpl;
import org.apache.servicecomb.core.Endpoint;
import org.apache.servicecomb.core.Invocation;
import org.apache.servicecomb.core.event.InvocationFinishEvent;
import org.apache.servicecomb.core.event.ServerAccessLogEvent;
import org.apache.servicecomb.foundation.common.net.URIEndpointObject;
+import org.apache.servicecomb.transport.rest.client.RestClientRequestParameters;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@@ -54,7 +54,7 @@ public class FirstLineOfRequestItemTest {
private Invocation invocation;
- private RestClientRequestImpl restClientRequest;
+ private RestClientRequestParameters restClientRequest;
private HttpClientRequest clientRequest;
@@ -67,7 +67,7 @@ public void initStrBuilder() {
mockContext = Mockito.mock(RoutingContext.class);
finishEvent = Mockito.mock(InvocationFinishEvent.class);
invocation = Mockito.mock(Invocation.class);
- restClientRequest = Mockito.mock(RestClientRequestImpl.class);
+ restClientRequest = Mockito.mock(RestClientRequestParameters.class);
clientRequest = Mockito.mock(HttpClientRequest.class);
endpoint = Mockito.mock(Endpoint.class);
urlEndpoint = Mockito.mock(URIEndpointObject.class);
@@ -75,7 +75,7 @@ public void initStrBuilder() {
handlerMap.put(RestConst.INVOCATION_HANDLER_REQUESTCLIENT, restClientRequest);
when(finishEvent.getInvocation()).thenReturn(invocation);
when(invocation.getHandlerContext()).thenReturn(handlerMap);
- when(restClientRequest.getRequest()).thenReturn(clientRequest);
+ when(restClientRequest.getHttpClientRequest()).thenReturn(clientRequest);
when(invocation.getEndpoint()).thenReturn(endpoint);
when(endpoint.getAddress()).thenReturn(urlEndpoint);
accessLogEvent = new ServerAccessLogEvent();
diff --git a/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/HttpMethodItemTest.java b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/HttpMethodItemTest.java
index 39a4212df96..1dbeba59e9a 100644
--- a/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/HttpMethodItemTest.java
+++ b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/HttpMethodItemTest.java
@@ -23,12 +23,12 @@
import java.util.Map;
import org.apache.servicecomb.common.rest.RestConst;
-import org.apache.servicecomb.common.rest.codec.param.RestClientRequestImpl;
import org.apache.servicecomb.core.Endpoint;
import org.apache.servicecomb.core.Invocation;
import org.apache.servicecomb.core.event.InvocationFinishEvent;
import org.apache.servicecomb.core.event.ServerAccessLogEvent;
import org.apache.servicecomb.foundation.common.net.URIEndpointObject;
+import org.apache.servicecomb.transport.rest.client.RestClientRequestParameters;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@@ -52,7 +52,7 @@ public class HttpMethodItemTest {
private Invocation invocation;
- private RestClientRequestImpl restClientRequest;
+ private RestClientRequestParameters restClientRequest;
private HttpClientRequest clientRequest;
@@ -65,7 +65,7 @@ public void initStrBuilder() {
routingContext = Mockito.mock(RoutingContext.class);
finishEvent = Mockito.mock(InvocationFinishEvent.class);
invocation = Mockito.mock(Invocation.class);
- restClientRequest = Mockito.mock(RestClientRequestImpl.class);
+ restClientRequest = Mockito.mock(RestClientRequestParameters.class);
clientRequest = Mockito.mock(HttpClientRequest.class);
endpoint = Mockito.mock(Endpoint.class);
urlEndpoint = Mockito.mock(URIEndpointObject.class);
@@ -92,7 +92,7 @@ public void serverFormattedElement() {
@Test
public void clientFormattedElement() {
- when(restClientRequest.getRequest()).thenReturn(clientRequest);
+ when(restClientRequest.getHttpClientRequest()).thenReturn(clientRequest);
when(clientRequest.getMethod()).thenReturn(HttpMethod.DELETE);
ITEM.appendClientFormattedItem(finishEvent, strBuilder);
Assertions.assertEquals("DELETE", strBuilder.toString());
@@ -108,7 +108,7 @@ public void serverFormattedElementOnRequestIsNull() {
@Test
public void clientFormattedElementOnRequestIsNull() {
- when(restClientRequest.getRequest()).thenReturn(null);
+ when(restClientRequest.getHttpClientRequest()).thenReturn(null);
ITEM.appendClientFormattedItem(finishEvent, strBuilder);
Assertions.assertEquals("-", strBuilder.toString());
}
diff --git a/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/LocalHostItemTest.java b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/LocalHostItemTest.java
index e4b936807ef..d1669f0316c 100644
--- a/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/LocalHostItemTest.java
+++ b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/LocalHostItemTest.java
@@ -23,10 +23,10 @@
import java.util.Map;
import org.apache.servicecomb.common.rest.RestConst;
-import org.apache.servicecomb.common.rest.codec.param.RestClientRequestImpl;
import org.apache.servicecomb.core.Invocation;
import org.apache.servicecomb.core.event.InvocationFinishEvent;
import org.apache.servicecomb.core.event.ServerAccessLogEvent;
+import org.apache.servicecomb.transport.rest.client.RestClientRequestParameters;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@@ -55,7 +55,7 @@ public class LocalHostItemTest {
private Invocation invocation;
- private RestClientRequestImpl restClientRequest;
+ private RestClientRequestParameters restClientRequest;
private HttpClientRequest clientRequest;
@@ -69,7 +69,7 @@ public void initStrBuilder() {
serverRequest = Mockito.mock(HttpServerRequest.class);
socketAddress = Mockito.mock(SocketAddress.class);
invocation = Mockito.mock(Invocation.class);
- restClientRequest = Mockito.mock(RestClientRequestImpl.class);
+ restClientRequest = Mockito.mock(RestClientRequestParameters.class);
clientRequest = Mockito.mock(HttpClientRequest.class);
connection = Mockito.mock(HttpConnection.class);
Map handlerMap = new HashMap<>();
@@ -83,7 +83,7 @@ public void initStrBuilder() {
@Test
public void clientFormattedItem() {
String localAddress = "192.168.0.1";
- when(restClientRequest.getRequest()).thenReturn(clientRequest);
+ when(restClientRequest.getHttpClientRequest()).thenReturn(clientRequest);
when(clientRequest.connection()).thenReturn(connection);
when(connection.localAddress()).thenReturn(socketAddress);
when(socketAddress.host()).thenReturn(localAddress);
@@ -119,7 +119,7 @@ public void serverLocalAddressOnRequestIsNull() {
@Test
public void clientLocalAddressOnRequestIsNull() {
- when(restClientRequest.getRequest()).thenReturn(null);
+ when(restClientRequest.getHttpClientRequest()).thenReturn(null);
ELEMENT.appendClientFormattedItem(finishEvent, strBuilder);
Assertions.assertEquals("-", strBuilder.toString());
}
@@ -134,7 +134,7 @@ public void serverLocalAddressOnLocalAddressIsNull() {
@Test
public void clientLocalAddressOnLocalAddressIsNull() {
- when(restClientRequest.getRequest()).thenReturn(clientRequest);
+ when(restClientRequest.getHttpClientRequest()).thenReturn(clientRequest);
when(clientRequest.connection()).thenReturn(connection);
when(connection.localAddress()).thenReturn(null);
ELEMENT.appendClientFormattedItem(finishEvent, strBuilder);
@@ -153,7 +153,7 @@ public void serverLocalAddressOnHostIsNull() {
@Test
public void clientLocalAddressOnHostIsNull() {
- when(restClientRequest.getRequest()).thenReturn(clientRequest);
+ when(restClientRequest.getHttpClientRequest()).thenReturn(clientRequest);
when(clientRequest.connection()).thenReturn(connection);
when(connection.localAddress()).thenReturn(socketAddress);
when(socketAddress.host()).thenReturn(null);
@@ -174,7 +174,7 @@ public void serverLocalAddressIsEmpty() {
@Test
public void clientLocalAddressIsEmpty() {
- when(restClientRequest.getRequest()).thenReturn(clientRequest);
+ when(restClientRequest.getHttpClientRequest()).thenReturn(clientRequest);
when(clientRequest.connection()).thenReturn(connection);
when(connection.localAddress()).thenReturn(socketAddress);
when(socketAddress.host()).thenReturn("");
diff --git a/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/LocalPortItemTest.java b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/LocalPortItemTest.java
index 430b5147daa..f77c51fbe74 100644
--- a/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/LocalPortItemTest.java
+++ b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/LocalPortItemTest.java
@@ -23,10 +23,10 @@
import java.util.Map;
import org.apache.servicecomb.common.rest.RestConst;
-import org.apache.servicecomb.common.rest.codec.param.RestClientRequestImpl;
import org.apache.servicecomb.core.Invocation;
import org.apache.servicecomb.core.event.InvocationFinishEvent;
import org.apache.servicecomb.core.event.ServerAccessLogEvent;
+import org.apache.servicecomb.transport.rest.client.RestClientRequestParameters;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@@ -55,7 +55,7 @@ public class LocalPortItemTest {
private Invocation invocation;
- private RestClientRequestImpl restClientRequest;
+ private RestClientRequestParameters restClientRequest;
private HttpClientRequest clientRequest;
@@ -69,7 +69,7 @@ public void initStrBuilder() {
serverRequest = Mockito.mock(HttpServerRequest.class);
socketAddress = Mockito.mock(SocketAddress.class);
invocation = Mockito.mock(Invocation.class);
- restClientRequest = Mockito.mock(RestClientRequestImpl.class);
+ restClientRequest = Mockito.mock(RestClientRequestParameters.class);
clientRequest = Mockito.mock(HttpClientRequest.class);
connection = Mockito.mock(HttpConnection.class);
Map handlerMap = new HashMap<>();
@@ -92,7 +92,7 @@ public void serverFormattedElement() {
@Test
public void clientFormattedElement() {
- when(restClientRequest.getRequest()).thenReturn(clientRequest);
+ when(restClientRequest.getHttpClientRequest()).thenReturn(clientRequest);
when(clientRequest.connection()).thenReturn(connection);
when(connection.localAddress()).thenReturn(socketAddress);
when(socketAddress.port()).thenReturn(8080);
@@ -109,7 +109,7 @@ public void serverFormattedElementOnRequestIsNull() {
@Test
public void clientFormattedElementOnRequestIsNull() {
- when(restClientRequest.getRequest()).thenReturn(null);
+ when(restClientRequest.getHttpClientRequest()).thenReturn(null);
ELEMENT.appendClientFormattedItem(finishEvent, strBuilder);
Assertions.assertEquals("-", strBuilder.toString());
}
@@ -124,7 +124,7 @@ public void serverFormattedElementOnLocalAddressIsNull() {
@Test
public void clientFormattedElementOnLocalAddressIsNull() {
- when(restClientRequest.getRequest()).thenReturn(clientRequest);
+ when(restClientRequest.getHttpClientRequest()).thenReturn(clientRequest);
when(clientRequest.connection()).thenReturn(connection);
when(connection.localAddress()).thenReturn(null);
ELEMENT.appendClientFormattedItem(finishEvent, strBuilder);
diff --git a/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/QueryStringItemTest.java b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/QueryStringItemTest.java
index d2af7f57710..ef472623d43 100644
--- a/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/QueryStringItemTest.java
+++ b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/QueryStringItemTest.java
@@ -23,10 +23,10 @@
import java.util.Map;
import org.apache.servicecomb.common.rest.RestConst;
-import org.apache.servicecomb.common.rest.codec.param.RestClientRequestImpl;
import org.apache.servicecomb.core.Invocation;
import org.apache.servicecomb.core.event.InvocationFinishEvent;
import org.apache.servicecomb.core.event.ServerAccessLogEvent;
+import org.apache.servicecomb.transport.rest.client.RestClientRequestParameters;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@@ -49,7 +49,7 @@ public class QueryStringItemTest {
private Invocation invocation;
- private RestClientRequestImpl restClientRequest;
+ private RestClientRequestParameters restClientRequest;
private HttpServerRequest serverRequest;
@@ -61,7 +61,7 @@ public void initStrBuilder() {
finishEvent = Mockito.mock(InvocationFinishEvent.class);
invocation = Mockito.mock(Invocation.class);
serverRequest = Mockito.mock(HttpServerRequest.class);
- restClientRequest = Mockito.mock(RestClientRequestImpl.class);
+ restClientRequest = Mockito.mock(RestClientRequestParameters.class);
clientRequest = Mockito.mock(HttpClientRequest.class);
accessLogEvent = new ServerAccessLogEvent();
@@ -85,7 +85,7 @@ public void clientFormattedElement() {
handlerContext.put(RestConst.INVOCATION_HANDLER_REQUESTCLIENT, restClientRequest);
when(finishEvent.getInvocation()).thenReturn(invocation);
when(invocation.getHandlerContext()).thenReturn(handlerContext);
- when(restClientRequest.getRequest()).thenReturn(clientRequest);
+ when(restClientRequest.getHttpClientRequest()).thenReturn(clientRequest);
when(clientRequest.query()).thenReturn(query);
ITEM.appendClientFormattedItem(finishEvent, strBuilder);
@@ -105,7 +105,7 @@ public void clientFormattedElementOnRequestIsNull() {
handlerContext.put(RestConst.INVOCATION_HANDLER_REQUESTCLIENT, restClientRequest);
when(finishEvent.getInvocation()).thenReturn(invocation);
when(invocation.getHandlerContext()).thenReturn(handlerContext);
- when(restClientRequest.getRequest()).thenReturn(null);
+ when(restClientRequest.getHttpClientRequest()).thenReturn(null);
ITEM.appendClientFormattedItem(finishEvent, strBuilder);
Assertions.assertEquals("-", strBuilder.toString());
@@ -125,7 +125,7 @@ public void clientFormattedElementOnQueryIsNull() {
handlerContext.put(RestConst.INVOCATION_HANDLER_REQUESTCLIENT, restClientRequest);
when(finishEvent.getInvocation()).thenReturn(invocation);
when(invocation.getHandlerContext()).thenReturn(handlerContext);
- when(restClientRequest.getRequest()).thenReturn(clientRequest);
+ when(restClientRequest.getHttpClientRequest()).thenReturn(clientRequest);
when(clientRequest.query()).thenReturn(null);
ITEM.appendClientFormattedItem(finishEvent, strBuilder);
@@ -148,7 +148,7 @@ public void clientFormattedElementOnQueryIsEmpty() {
handlerContext.put(RestConst.INVOCATION_HANDLER_REQUESTCLIENT, restClientRequest);
when(finishEvent.getInvocation()).thenReturn(invocation);
when(invocation.getHandlerContext()).thenReturn(handlerContext);
- when(restClientRequest.getRequest()).thenReturn(clientRequest);
+ when(restClientRequest.getHttpClientRequest()).thenReturn(clientRequest);
when(clientRequest.query()).thenReturn(query);
ITEM.appendClientFormattedItem(finishEvent, strBuilder);
diff --git a/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/RequestHeaderItemTest.java b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/RequestHeaderItemTest.java
index ed425d1f801..f2ae7004251 100644
--- a/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/RequestHeaderItemTest.java
+++ b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/RequestHeaderItemTest.java
@@ -23,10 +23,10 @@
import java.util.Map;
import org.apache.servicecomb.common.rest.RestConst;
-import org.apache.servicecomb.common.rest.codec.param.RestClientRequestImpl;
import org.apache.servicecomb.core.Invocation;
import org.apache.servicecomb.core.event.InvocationFinishEvent;
import org.apache.servicecomb.core.event.ServerAccessLogEvent;
+import org.apache.servicecomb.transport.rest.client.RestClientRequestParameters;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@@ -53,7 +53,7 @@ public class RequestHeaderItemTest {
private Invocation invocation;
- private RestClientRequestImpl restClientRequest;
+ private RestClientRequestParameters restClientRequest;
private HttpServerRequest serverRequest;
@@ -67,7 +67,7 @@ public void initStrBuilder() {
finishEvent = Mockito.mock(InvocationFinishEvent.class);
invocation = Mockito.mock(Invocation.class);
serverRequest = Mockito.mock(HttpServerRequest.class);
- restClientRequest = Mockito.mock(RestClientRequestImpl.class);
+ restClientRequest = Mockito.mock(RestClientRequestParameters.class);
clientRequest = Mockito.mock(HttpClientRequest.class);
headers = Mockito.mock(MultiMap.class);
@@ -78,7 +78,7 @@ public void initStrBuilder() {
@Test
public void serverFormattedElement() {
- HeadersMultiMap headers = new HeadersMultiMap();
+ HeadersMultiMap headers = HeadersMultiMap.httpHeaders();
String testValue = "testValue";
headers.add(VAR_NAME, testValue);
when(routingContext.request()).thenReturn(serverRequest);
@@ -97,7 +97,7 @@ public void clientFormattedElement() {
handlerContext.put(RestConst.INVOCATION_HANDLER_REQUESTCLIENT, restClientRequest);
when(finishEvent.getInvocation()).thenReturn(invocation);
when(invocation.getHandlerContext()).thenReturn(handlerContext);
- when(restClientRequest.getRequest()).thenReturn(clientRequest);
+ when(restClientRequest.getHttpClientRequest()).thenReturn(clientRequest);
when(clientRequest.headers()).thenReturn(headers);
when(headers.get(VAR_NAME)).thenReturn(testValue);
@@ -120,7 +120,7 @@ public void clientFormattedElementIfHeaderIsNull() {
handlerContext.put(RestConst.INVOCATION_HANDLER_REQUESTCLIENT, restClientRequest);
when(finishEvent.getInvocation()).thenReturn(invocation);
when(invocation.getHandlerContext()).thenReturn(handlerContext);
- when(restClientRequest.getRequest()).thenReturn(clientRequest);
+ when(restClientRequest.getHttpClientRequest()).thenReturn(clientRequest);
when(clientRequest.headers()).thenReturn(null);
ELEMENT.appendClientFormattedItem(finishEvent, strBuilder);
@@ -129,7 +129,7 @@ public void clientFormattedElementIfHeaderIsNull() {
@Test
public void serverFormattedElementIfNotFound() {
- HeadersMultiMap headers = new HeadersMultiMap();
+ HeadersMultiMap headers = HeadersMultiMap.httpHeaders();
String testValue = "testValue";
headers.add("anotherKey", testValue);
when(routingContext.request()).thenReturn(serverRequest);
diff --git a/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/ResponseHeaderItemTest.java b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/ResponseHeaderItemTest.java
index a2e283e4bc8..a8708172945 100644
--- a/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/ResponseHeaderItemTest.java
+++ b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/ResponseHeaderItemTest.java
@@ -64,7 +64,7 @@ public void initStrBuilder() {
@Test
public void serverFormattedElement() {
- HeadersMultiMap headers = new HeadersMultiMap();
+ HeadersMultiMap headers = HeadersMultiMap.httpHeaders();
String headerValue = "headerValue";
headers.add(VAR_NAME, headerValue);
when(routingContext.response()).thenReturn(serverResponse);
@@ -122,7 +122,7 @@ public void clientFormattedElementOnResponseIsNull() {
@Test
public void serverFormattedElementOnNotFound() {
- HeadersMultiMap headers = new HeadersMultiMap();
+ HeadersMultiMap headers = HeadersMultiMap.httpHeaders();
String headerValue = "headerValue";
headers.add("anotherHeader", headerValue);
when(routingContext.response()).thenReturn(serverResponse);
diff --git a/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/TraceIdItemTest.java b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/TraceIdItemTest.java
index 3c4ceb15e47..b21dc7dfbaf 100644
--- a/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/TraceIdItemTest.java
+++ b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/TraceIdItemTest.java
@@ -24,7 +24,7 @@
import java.util.Map;
import org.apache.servicecomb.common.rest.RestConst;
-import org.apache.servicecomb.core.Const;
+import org.apache.servicecomb.core.CoreConst;
import org.apache.servicecomb.core.Invocation;
import org.apache.servicecomb.core.event.InvocationFinishEvent;
import org.apache.servicecomb.core.event.ServerAccessLogEvent;
@@ -70,7 +70,7 @@ public void initStrBuilder() {
public void serverGetFormattedElementFromInvocationContext() {
Map data = new HashMap<>();
String traceIdTest = "traceIdTest";
- when(invocation.getContext(Const.TRACE_ID_NAME)).thenReturn(traceIdTest);
+ when(invocation.getContext(CoreConst.TRACE_ID_NAME)).thenReturn(traceIdTest);
when(routingContext.data()).thenReturn(data);
data.put(RestConst.REST_INVOCATION_CONTEXT, invocation);
@@ -81,7 +81,7 @@ public void serverGetFormattedElementFromInvocationContext() {
@Test
public void clientGetFormattedElementFromInvocationContext() {
String traceIdTest = "traceIdTest";
- clientContext.put(Const.TRACE_ID_NAME, traceIdTest);
+ clientContext.put(CoreConst.TRACE_ID_NAME, traceIdTest);
when(finishEvent.getInvocation()).thenReturn(invocation);
when(invocation.getContext()).thenReturn(clientContext);
@@ -93,11 +93,11 @@ public void clientGetFormattedElementFromInvocationContext() {
public void serverGetFormattedElementFromRequestHeader() {
Map data = new HashMap<>();
String traceIdTest = "traceIdTest";
- when(invocation.getContext(Const.TRACE_ID_NAME)).thenReturn(null);
+ when(invocation.getContext(CoreConst.TRACE_ID_NAME)).thenReturn(null);
when(routingContext.data()).thenReturn(data);
data.put(RestConst.REST_INVOCATION_CONTEXT, invocation);
- when(serverRequest.getHeader(Const.TRACE_ID_NAME)).thenReturn(traceIdTest);
+ when(serverRequest.getHeader(CoreConst.TRACE_ID_NAME)).thenReturn(traceIdTest);
when(routingContext.request()).thenReturn(serverRequest);
ELEMENT.appendServerFormattedItem(accessLogEvent, strBuilder);
MatcherAssert.assertThat(strBuilder.toString(), is(traceIdTest));
@@ -106,24 +106,24 @@ public void serverGetFormattedElementFromRequestHeader() {
@Test
public void serverGetFormattedElementOnTraceIdNotFound() {
Map data = new HashMap<>();
- when(invocation.getContext(Const.TRACE_ID_NAME)).thenReturn("");
+ when(invocation.getContext(CoreConst.TRACE_ID_NAME)).thenReturn("");
when(routingContext.data()).thenReturn(data);
data.put(RestConst.REST_INVOCATION_CONTEXT, invocation);
- when(serverRequest.getHeader(Const.TRACE_ID_NAME)).thenReturn(null);
+ when(serverRequest.getHeader(CoreConst.TRACE_ID_NAME)).thenReturn(null);
when(routingContext.request()).thenReturn(serverRequest);
ELEMENT.appendServerFormattedItem(accessLogEvent, strBuilder);
MatcherAssert.assertThat(strBuilder.toString(), is("-"));
strBuilder = new StringBuilder();
- when(invocation.getContext(Const.TRACE_ID_NAME)).thenReturn(null);
+ when(invocation.getContext(CoreConst.TRACE_ID_NAME)).thenReturn(null);
ELEMENT.appendServerFormattedItem(accessLogEvent, strBuilder);
MatcherAssert.assertThat(strBuilder.toString(), is("-"));
}
@Test
public void clientGetFormattedElementOnTraceIdNotFound() {
- clientContext.put(Const.TRACE_ID_NAME, null);
+ clientContext.put(CoreConst.TRACE_ID_NAME, null);
when(finishEvent.getInvocation()).thenReturn(invocation);
when(invocation.getContext()).thenReturn(clientContext);
@@ -135,7 +135,7 @@ public void clientGetFormattedElementOnTraceIdNotFound() {
public void serverGetFormattedElementOnInvocationContextIsNull() {
when(routingContext.data()).thenReturn(null);
when(routingContext.request()).thenReturn(serverRequest);
- when(serverRequest.getHeader(Const.TRACE_ID_NAME)).thenReturn(null);
+ when(serverRequest.getHeader(CoreConst.TRACE_ID_NAME)).thenReturn(null);
ELEMENT.appendServerFormattedItem(accessLogEvent, strBuilder);
MatcherAssert.assertThat(strBuilder.toString(), is("-"));
}
@@ -151,7 +151,7 @@ public void clientGetFormattedElementOnInvocationContextIsNull() {
@Test
public void serverGetFormattedElementOnDataIsNull() {
- when(serverRequest.getHeader(Const.TRACE_ID_NAME)).thenReturn(null);
+ when(serverRequest.getHeader(CoreConst.TRACE_ID_NAME)).thenReturn(null);
when(routingContext.request()).thenReturn(serverRequest);
when(routingContext.data()).thenReturn(null);
ELEMENT.appendServerFormattedItem(accessLogEvent, strBuilder);
diff --git a/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/UrlPathItemTest.java b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/UrlPathItemTest.java
index 68b6af56973..d1601609a28 100644
--- a/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/UrlPathItemTest.java
+++ b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/UrlPathItemTest.java
@@ -23,18 +23,18 @@
import java.util.Map;
import org.apache.servicecomb.common.rest.RestConst;
-import org.apache.servicecomb.common.rest.codec.param.RestClientRequestImpl;
import org.apache.servicecomb.core.Invocation;
import org.apache.servicecomb.core.definition.OperationMeta;
import org.apache.servicecomb.core.definition.SchemaMeta;
import org.apache.servicecomb.core.event.InvocationFinishEvent;
import org.apache.servicecomb.core.event.ServerAccessLogEvent;
+import org.apache.servicecomb.transport.rest.client.RestClientRequestParameters;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
-import io.swagger.models.Swagger;
+import io.swagger.v3.oas.models.OpenAPI;
import io.vertx.core.http.HttpClientRequest;
import io.vertx.core.http.HttpServerRequest;
import io.vertx.ext.web.RoutingContext;
@@ -58,9 +58,9 @@ public class UrlPathItemTest {
private SchemaMeta schemaMeta;
- private Swagger swagger;
+ private OpenAPI swagger;
- private RestClientRequestImpl restClientRequest;
+ private RestClientRequestParameters restClientRequest;
private HttpClientRequest clientRequest;
@@ -73,8 +73,8 @@ public void initStrBuilder() {
serverRequest = Mockito.mock(HttpServerRequest.class);
operationMeta = Mockito.mock(OperationMeta.class);
schemaMeta = Mockito.mock(SchemaMeta.class);
- swagger = Mockito.mock(Swagger.class);
- restClientRequest = Mockito.mock(RestClientRequestImpl.class);
+ swagger = Mockito.mock(OpenAPI.class);
+ restClientRequest = Mockito.mock(RestClientRequestParameters.class);
clientRequest = Mockito.mock(HttpClientRequest.class);
accessLogEvent.setRoutingContext(routingContext);
@@ -83,12 +83,11 @@ public void initStrBuilder() {
@Test
public void clientFormattedElement() {
- String uri = "/base/test";
+ String uri = "/test";
when(finishEvent.getInvocation()).thenReturn(invocation);
when(invocation.getOperationMeta()).thenReturn(operationMeta);
when(invocation.getSchemaMeta()).thenReturn(schemaMeta);
when(schemaMeta.getSwagger()).thenReturn(swagger);
- when(swagger.getBasePath()).thenReturn("/base");
when(operationMeta.getOperationPath()).thenReturn("/test");
ITEM.appendClientFormattedItem(finishEvent, strBuilder);
@@ -101,7 +100,7 @@ public void clientFormattedElement() {
when(invocation.getSchemaMeta()).thenReturn(null);
when(finishEvent.getInvocation()).thenReturn(invocation);
when(invocation.getHandlerContext()).thenReturn(handlerContext);
- when(restClientRequest.getRequest()).thenReturn(clientRequest);
+ when(restClientRequest.getHttpClientRequest()).thenReturn(clientRequest);
when(clientRequest.path()).thenReturn(uri);
ITEM.appendClientFormattedItem(finishEvent, strBuilder);
Assertions.assertEquals(uri, strBuilder.toString());
@@ -129,7 +128,7 @@ public void clientFormattedElementOnRequestIsNull() {
handlerContext.put(RestConst.INVOCATION_HANDLER_REQUESTCLIENT, restClientRequest);
when(finishEvent.getInvocation()).thenReturn(invocation);
when(invocation.getHandlerContext()).thenReturn(handlerContext);
- when(restClientRequest.getRequest()).thenReturn(null);
+ when(restClientRequest.getHttpClientRequest()).thenReturn(null);
ITEM.appendClientFormattedItem(finishEvent, strBuilder);
Assertions.assertEquals("-", strBuilder.toString());
}
@@ -148,7 +147,7 @@ public void clientFormattedElementOnMethodIsNull() {
handlerContext.put(RestConst.INVOCATION_HANDLER_REQUESTCLIENT, restClientRequest);
when(finishEvent.getInvocation()).thenReturn(invocation);
when(invocation.getHandlerContext()).thenReturn(handlerContext);
- when(restClientRequest.getRequest()).thenReturn(clientRequest);
+ when(restClientRequest.getHttpClientRequest()).thenReturn(clientRequest);
when(clientRequest.path()).thenReturn(null);
ITEM.appendClientFormattedItem(finishEvent, strBuilder);
Assertions.assertEquals("-", strBuilder.toString());
diff --git a/common/common-access-log/src/test/resources/META-INF/services/org.apache.servicecomb.common.accessLog.core.parser.VertxRestAccessLogItemMeta b/common/common-access-log/src/test/resources/META-INF/services/org.apache.servicecomb.common.accessLog.core.parser.VertxRestAccessLogItemMeta
index 501ac43ee58..74f9ee4cb24 100644
--- a/common/common-access-log/src/test/resources/META-INF/services/org.apache.servicecomb.common.accessLog.core.parser.VertxRestAccessLogItemMeta
+++ b/common/common-access-log/src/test/resources/META-INF/services/org.apache.servicecomb.common.accessLog.core.parser.VertxRestAccessLogItemMeta
@@ -16,4 +16,4 @@
#
org.apache.servicecomb.common.accessLog.core.parser.impl.TestCompositeExtendedAccessLogItemMeta
-org.apache.servicecomb.common.accessLog.core.parser.impl.TestSingleExtendedAccessLogItemMeta
\ No newline at end of file
+org.apache.servicecomb.common.accessLog.core.parser.impl.TestSingleExtendedAccessLogItemMeta
diff --git a/common/common-protobuf/pom.xml b/common/common-protobuf/pom.xml
index 08e2a9a0295..5b7ac5fcf7c 100644
--- a/common/common-protobuf/pom.xml
+++ b/common/common-protobuf/pom.xml
@@ -21,7 +21,7 @@
org.apache.servicecomb
common
- 3.0.0-SNAPSHOT
+ 3.4.0-SNAPSHOT
common-protobuf
Java Chassis::Common::Protobuf
@@ -31,15 +31,17 @@
org.apache.servicecomb
java-chassis-core
-
- org.apache.servicecomb
- swagger-invocation-core
-
org.apache.servicecomb
foundation-protobuf
+
+
+ com.google.protobuf
+ protobuf-java
+ test
+
org.apache.logging.log4j
@@ -60,11 +62,6 @@
org.apache.servicecomb
foundation-test-scaffolding
-
- javax.xml.bind
- jaxb-api
- test
-
@@ -82,7 +79,7 @@
- generate-sources
+ generate-test-sources
test-compile
diff --git a/common/common-protobuf/src/main/java/org/apache/servicecomb/codec/protobuf/definition/OperationProtobuf.java b/common/common-protobuf/src/main/java/org/apache/servicecomb/codec/protobuf/definition/OperationProtobuf.java
index 2f0579fb760..6c12da844de 100644
--- a/common/common-protobuf/src/main/java/org/apache/servicecomb/codec/protobuf/definition/OperationProtobuf.java
+++ b/common/common-protobuf/src/main/java/org/apache/servicecomb/codec/protobuf/definition/OperationProtobuf.java
@@ -21,9 +21,6 @@
import java.util.Map;
import java.util.Map.Entry;
-import javax.ws.rs.core.Response.Status;
-import javax.ws.rs.core.Response.Status.Family;
-
import org.apache.servicecomb.codec.protobuf.utils.ScopedProtobufSchemaManager;
import org.apache.servicecomb.core.Invocation;
import org.apache.servicecomb.foundation.protobuf.ProtoMapper;
@@ -33,9 +30,10 @@
import com.fasterxml.jackson.databind.JavaType;
import io.protostuff.compiler.model.Message;
+import jakarta.ws.rs.core.Response.Status;
+import jakarta.ws.rs.core.Response.Status.Family;
-@SuppressWarnings("rawtypes")
-public class OperationProtobuf {
+public final class OperationProtobuf {
private RequestRootSerializer requestRootSerializer;
private RequestRootDeserializer