From 9bd1228f92b8fb85f228faaf1da4a2e1c2e32362 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E9=83=AD=E6=B5=A9?= <xiangsheng.gh@alibaba-inc.com>
Date: Wed, 8 May 2019 10:16:23 +0800
Subject: [PATCH] 1. rm deps 2. update readme

---
 README.MD                                     | 109 ++++++++++++++----
 dockerfile/debian-jdk8-devel/Dockerfile       |   6 -
 .../debian-jdk8-release-consumer/Dockerfile   |  10 --
 .../debian-jdk8-release-consumer/start.sh     |   1 -
 .../debian-jdk8-release-provider/Dockerfile   |  10 --
 .../debian-jdk8-release-provider/start.sh     |   1 -
 dockerfile/debian-jdk8/Dockerfile             |  10 --
 internal-service/pom.xml                      |  32 -----
 internal-service/service-api/pom.xml          |  30 -----
 .../com/aliware/tianchi/HashInterface.java    |  18 ---
 internal-service/service-consumer/pom.xml     |  53 ---------
 .../java/com/aliware/tianchi/MyConsumer.java  |  38 ------
 .../tianchi/MyDirectServiceConsumer.java      |  12 --
 .../src/main/resources/dubbo-consumer.xml     |  18 ---
 .../dubbo-direct-service-consumer.xml         |   0
 .../src/main/resources/logback.xml            |  22 ----
 internal-service/service-provider/pom.xml     |  59 ----------
 .../com/aliware/tianchi/DemoProviderMain.java |  66 -----------
 .../com/aliware/tianchi/HashServiceImpl.java  |  84 --------------
 .../com/aliware/tianchi/ThrashConfig.java     |  19 ---
 .../aliware/tianchi/policy/SmallConfig.java   |  25 ----
 .../src/main/resources/logback.xml            |  22 ----
 pom.xml                                       |  35 +-----
 .../pom.xml                                   |   2 +-
 {workspace => workspace-gateway}/pom.xml      |  13 ++-
 .../pom.xml                                   |   9 +-
 workspace/README.md                           |   3 -
 workspace/workspace-gateway/pom.xml           |  15 ---
 28 files changed, 106 insertions(+), 616 deletions(-)
 delete mode 100644 dockerfile/debian-jdk8-devel/Dockerfile
 delete mode 100644 dockerfile/debian-jdk8-release/debian-jdk8-release-consumer/Dockerfile
 delete mode 100644 dockerfile/debian-jdk8-release/debian-jdk8-release-consumer/start.sh
 delete mode 100644 dockerfile/debian-jdk8-release/debian-jdk8-release-provider/Dockerfile
 delete mode 100644 dockerfile/debian-jdk8-release/debian-jdk8-release-provider/start.sh
 delete mode 100644 dockerfile/debian-jdk8/Dockerfile
 delete mode 100644 internal-service/pom.xml
 delete mode 100644 internal-service/service-api/pom.xml
 delete mode 100644 internal-service/service-api/src/main/java/com/aliware/tianchi/HashInterface.java
 delete mode 100644 internal-service/service-consumer/pom.xml
 delete mode 100644 internal-service/service-consumer/src/main/java/com/aliware/tianchi/MyConsumer.java
 delete mode 100644 internal-service/service-consumer/src/main/java/com/aliware/tianchi/MyDirectServiceConsumer.java
 delete mode 100644 internal-service/service-consumer/src/main/resources/dubbo-consumer.xml
 delete mode 100644 internal-service/service-consumer/src/main/resources/dubbo-direct-service-consumer.xml
 delete mode 100644 internal-service/service-consumer/src/main/resources/logback.xml
 delete mode 100644 internal-service/service-provider/pom.xml
 delete mode 100644 internal-service/service-provider/src/main/java/com/aliware/tianchi/DemoProviderMain.java
 delete mode 100644 internal-service/service-provider/src/main/java/com/aliware/tianchi/HashServiceImpl.java
 delete mode 100644 internal-service/service-provider/src/main/java/com/aliware/tianchi/ThrashConfig.java
 delete mode 100644 internal-service/service-provider/src/main/java/com/aliware/tianchi/policy/SmallConfig.java
 delete mode 100644 internal-service/service-provider/src/main/resources/logback.xml
 rename {internal-gateway => workspace-common}/pom.xml (93%)
 rename {workspace => workspace-gateway}/pom.xml (66%)
 rename {workspace/workspace-provider => workspace-provider}/pom.xml (65%)
 delete mode 100644 workspace/README.md
 delete mode 100644 workspace/workspace-gateway/pom.xml

diff --git a/README.MD b/README.MD
index 7fdce7b..ec35333 100644
--- a/README.MD
+++ b/README.MD
@@ -1,48 +1,78 @@
 # 阿里巴巴2019中间件性能挑战赛-自适应负载均衡(初赛)赛题
 
-[TOC]
-
 ## 背景
 
 ### 负载均衡 (loadbalance)
-[负载均衡](https://en.wikipedia.org/wiki/Load_balancing_(computing))是大规模计算机系统中的一个基础问题。灵活的负载均衡算法可以将请求合理地分配到负载较少的服务器上。理想状态下,一个负载均衡算法应该能够最小化服务响应时间(RTT),使系统吞吐量最高,保持高性能服务能力。自适应负载均衡是指无论当系统处在空闲、稳定还是繁忙状态,系统都应该保持较好的性能,不允许产生饥饿或者宕机。
+[负载均衡](https://en.wikipedia.org/wiki/Load_balancing_(computing))是大规模计算机系统中的一个基础问题。灵活的负载均衡算法可以将请求合理地分配到负载较少的服务器上。理想状态下,负载均衡算法应该能够最小化服务响应时间(RTT),使系统吞吐量最高,从而保持高性能服务能力。自适应负载均衡是指负载均衡算法能够根据服务能力动态的进行流量调度,无论当系统处在空闲、稳定还是繁忙状态,系统都可以保持较好的性能,不会产生饥饿或者宕机。
 
 ### Apache Dubbo (incubating)
 [Apache Dubbo (incubating)](http://dubbo.apache.org/zh-cn/) |ˈdʌbəʊ| 是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。
 
 ![dubbo_architect](assets/dubbo_architecture.png)
 
-
 ### Apache Dubbo Gateway
 TBD
 
 ### 题目由来
 
-传统的负载均衡场景为单调度器模式,即中心化负载均衡:调度器负责将新到的请求立即转发至多个后端服务器中的一个。随着分布式系统的发展,这种单调度器模式在扩展性和可靠性方面的问题也愈发严重。因此,设计和实现去中心化且性能优异的负载均衡是学术和工业界的共同需求。
+传统的负载均衡场景为单调度器模式,即中心化负载均衡:调度器负责将新到的请求立即转发至多个后端服务器中的一个。随着分布式系统的发展,这种单调度器模式在扩展性、可靠性和性能方面的问题愈发严重。因此,设计和实现去中心化且性能优异的负载均衡是学术和工业界的共同需求。
 
 ## 赛题说明
 
-按照题目提供的扩展接口,实现一套自适应负载均衡机制。要求能够具备以下能力:
+基于 Dubbo 的 LoadBalance、Router、Filter 等SPI接口,实现一套自适应负载均衡机制,作为扩展作用于 gateway 和 provider两端。要求能够具备以下能力:
 
 1. Gateway(Consumer) 端能够自动根据服务处理能力变化动态最优化分配请求保证较低响应时间,较高吞吐量。
 2. Provider 端能自动进行服务容量评估,当请求数量超过服务能力时,允许拒绝部分请求,以保证服务不过载。
 3. 当请求速率高于所有的 Provider 服务效率之和时,允许 Gateway( Consumer ) 拒绝服务新到请求。
 
 ### æž¶æž„
+
 ![service_architect](assets/service-architect.png)
 
+- 所有程序均在 docker 容器中运行
 - Gateway 负责将请求转发至 Provider;
 - Provider 处理请求返回响应;
 - Provider 按照 CPU 核数和内存大小分为 Small、Medium、Large 三个规格;
-- 选手需要设计实现 Gateway 选择 Provider 的 loadbalance 算法。
+- 选手需要设计实现 Gateway 选择 Provider 的 loadbalance/router 算法。
 
-### 服务
 
-TBD
 
-### 调用流程
+### 目标
 
-TBD
+1. 保证系统稳定性,任何情况下服务都不能被打挂;
+2. 保证请求成功率,尽可能的让更多的请求在较短的时间内被处理;
+3. 尽可能避免因重试导致流量被过度放大。
+
+### 服务
+
+Provider 是服务提供者,Gateway( Consumer ) 是服务消费者,Gateway 消费 Provider 提供的服务。Gateway 及 Provider 服务的实现 **由赛会官方提供**。 为简化流程,本次比赛不使用服务注册和发现机制,Gateway 通过 docker 的 dns 进行直连调用 Provider 服务。
+
+Provider 服务接口:
+```
+public interface HashInterface {
+
+  /**
+   * 计算给定字符串的 hash 值
+   * <li>
+   *     <ol>接口的响应时间符合负指数分布 </ol>
+   *     <ol>接口的并发度(允许同时调用的线程数)会随时间增加或减小,从而模拟生产环境可能的排队</ol>
+   * </li>
+   * @param input 要计算的字符串
+   * @return 字符串的 hash 值
+   */
+  int hash(String input);
+}
+```
+Consumer 在接收到客户端请求以后,会生成一个随机字符串,该字符串经过 Consumer Agent 和 Provider Agent 后到达 Provider,由 Provider 计算哈希值后返回,客户端会校验该哈希值与其生成的数据是否相同,如果相同则返回正常(200),否则返回异常(500)。
+
+### 启动和调用流程
+
+1. 启动三个 Provider 实例
+2. 启动 Gateway 实例
+3. 客户端通过 HTTP 访问 Gateway 服务
+4. Gateway 按照选手扩展的路由或负载均衡算法选择一个 Provider 并进行调用
+5. Provider 处理请求,返回结果
+6. Gateway 将本次请求的结果返回至客户端(success/failure)
 
 ### 项目结构
 
@@ -50,7 +80,7 @@ TBD
 - internal-dubbo dubbo 依赖,不允许修改,评测时不依赖选手编译的 jar 包;
 - internal-gateway gateway 依赖,不允许修改,评测时不依赖选手编译的 jar 包;
 - internal-service 服务的接口定义和实现,不允许修改,评测时不依赖选手编译的 jar 包;
-- workspace 选手进行开发的模块
+- workspace 选手进行开发的模块, 评测时会以 jar 包依赖的方式加载
 
 ### 开发接口
 
@@ -62,25 +92,54 @@ TBD
 
 ### 限制
 
-### 环境
-
-![benchmark_architect](assets/benchmark_architect.png)
-
-### 目标
-
-1. 保证系统稳定性,任何情况下服务都不能被打挂;
-2. 保证请求成功率,尽可能的让更多的请求在较短的时间内被处理;
-3. 尽可能避免因重试导致流量被过度放大。
+1. 不允许修改 Dubbo/Gateway 相关配置
+2. 不允许使用脚本或者其他方式替换 provider/gateway 服务
+3. 不允许使用 provider 服务内的相关信息,如配置的 averageRTT/ maxConcurrency 等。
+4. 不允许引入外部依赖,如果对开源代码有所借鉴,可小部分 copy。
+
+### 开发环境搭建
+
+#### 依赖项目
+- [internal-dubbo](https://code.aliyun.com/middlewarerace2019/dubbo-internal)
+
+    比赛使用的特定版本 dubbo, 需要手动安装依赖。
+    ```bash
+    git clone https://code.aliyun.com/middlewarerace2019/dubbo-internal
+    mvn clean install -Dmaven.test.skip=true
+    ```
+    
+- [internal-gateway](https://code.aliyun.com/middlewarerace2019/internal-gateway) 
+    
+    执行调用的consumer,接收压测程序请求,加载选手实现[workspace-gateway]()部分的 LoadBalance 扩展,按照扩展选择相应 Provider 完成调用,返回结果成功(200)或失败(500)。启动程序已经被集成至 internal-service,本地开发无需关心。
+   
+    由于代码对比赛支持做了一定的修改,所以需要手动安装依赖:
+    ```bash
+    git clone https://code.aliyun.com/middlewarerace2019/internal-gateway
+    mvn clean install -Dmaven.test.skip=true
+    ```
+   
+- [internal-service](https://code.aliyun.com/middlewarerace2019/internal-service)
+
+    内置服务,已经由赛题官方提供,开发过程不需要修改,只需要安装依赖。
+    ```bash
+    git clone https://code.aliyun.com/middlewarerace2019/internal-service.git
+    mvn clean install -Dmaven.test.skip=true
+    ``` 
+
+#### 开发项目
+- [adaptive-loadbalance](https://code.aliyun.com/middlewarerace2019/adaptive-loadbalance)
+
+    选手按照题目提供的接口,实现 provider-consumer 协同的自适应负载均衡策略。
 
 ## 评测
-
 ### 环境
+![benchmark_architect](assets/benchmark_architect.png)
 
 - Gateway : 1 台 
 - Provider : 3台
   - Provider-small: 1c2g
   - Provider-medium: 2c4g
-  - Provider-large: 4c8g
+  - Provider-large: 3c6g
 - 每个 Provider 的服务能力(处理请求的速率)都会不定期变化:
   - 三台机器的总处理能力会分别在小于/约等于/大于请求量三个状态变动;
   - 三台机器任意一台的单台处理能力都小于总请求量。
@@ -113,4 +172,6 @@ TBD
 | :--: | :--------: | :------: |
 |  1   | 1,000,000  |  9,999   |
 |  2   | 1,000,000  |  9,998   |
-|  3   |  800,000   |  10,000  |
\ No newline at end of file
+|  3   |  800,000   |  10,000  |
+```
+
diff --git a/dockerfile/debian-jdk8-devel/Dockerfile b/dockerfile/debian-jdk8-devel/Dockerfile
deleted file mode 100644
index 0a0d896..0000000
--- a/dockerfile/debian-jdk8-devel/Dockerfile
+++ /dev/null
@@ -1,6 +0,0 @@
-FROM registry.cn-shanghai.aliyuncs.com/aliware2019/aliware:debian-jdk
-
-ADD apache-maven-3.6.1-bin.tar.gz /opt
-
-ENV MAVEN_HOME=/opt/apache-maven-3.6.1
-ENV PATH=${PATH}:${MAVEN_HOME}/bin
diff --git a/dockerfile/debian-jdk8-release/debian-jdk8-release-consumer/Dockerfile b/dockerfile/debian-jdk8-release/debian-jdk8-release-consumer/Dockerfile
deleted file mode 100644
index 8a2601d..0000000
--- a/dockerfile/debian-jdk8-release/debian-jdk8-release-consumer/Dockerfile
+++ /dev/null
@@ -1,10 +0,0 @@
-FROM registry.cn-shanghai.aliyuncs.com/aliware2019/aliware:debian-jdk8-devel
-
-COPY service-consumer-1.0.0.jar /usr/local/service/
-
-COPY start.sh /usr/local/service
-
-WORKDIR /usr/local/service
-
-ENTRYPOINT ["sh","start.sh"]
-
diff --git a/dockerfile/debian-jdk8-release/debian-jdk8-release-consumer/start.sh b/dockerfile/debian-jdk8-release/debian-jdk8-release-consumer/start.sh
deleted file mode 100644
index daf523c..0000000
--- a/dockerfile/debian-jdk8-release/debian-jdk8-release-consumer/start.sh
+++ /dev/null
@@ -1 +0,0 @@
-java -jar service-consumer-1.0.0.jar
diff --git a/dockerfile/debian-jdk8-release/debian-jdk8-release-provider/Dockerfile b/dockerfile/debian-jdk8-release/debian-jdk8-release-provider/Dockerfile
deleted file mode 100644
index bbfb6b0..0000000
--- a/dockerfile/debian-jdk8-release/debian-jdk8-release-provider/Dockerfile
+++ /dev/null
@@ -1,10 +0,0 @@
-FROM registry.cn-shanghai.aliyuncs.com/aliware2019/aliware:debian-jdk8-devel
-
-COPY service-provider-1.0.0.jar /usr/local/service/
-
-COPY start.sh /usr/local/service
-
-WORKDIR /usr/local/service
-
-ENTRYPOINT ["sh","start.sh"]
-
diff --git a/dockerfile/debian-jdk8-release/debian-jdk8-release-provider/start.sh b/dockerfile/debian-jdk8-release/debian-jdk8-release-provider/start.sh
deleted file mode 100644
index 886ea10..0000000
--- a/dockerfile/debian-jdk8-release/debian-jdk8-release-provider/start.sh
+++ /dev/null
@@ -1 +0,0 @@
-java -jar service-provider-1.0.0.jar
diff --git a/dockerfile/debian-jdk8/Dockerfile b/dockerfile/debian-jdk8/Dockerfile
deleted file mode 100644
index b8f3879..0000000
--- a/dockerfile/debian-jdk8/Dockerfile
+++ /dev/null
@@ -1,10 +0,0 @@
-FROM debian:stretch
-
-ADD jdk-8u211-linux-x64.tar.gz /opt/
-
-ENV LANG C.UTF-8
-ENV JAVA_HOME=/opt/jdk1.8.0_211
-ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
-ENV PATH $PATH:$JAVA_HOME/bin
-
-
diff --git a/internal-service/pom.xml b/internal-service/pom.xml
deleted file mode 100644
index ba2aaec..0000000
--- a/internal-service/pom.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <parent>
-        <artifactId>adaptive-loadbalance</artifactId>
-        <groupId>com.aliware.tianchi</groupId>
-        <version>1.0.0</version>
-    </parent>
-    <modelVersion>4.0.0</modelVersion>
-
-    <properties>
-        <dubbo.version>tianchi.1.0.0</dubbo.version>
-    </properties>
-
-    <artifactId>service</artifactId>
-    <packaging>pom</packaging>
-    <modules>
-        <module>service-api</module>
-        <module>service-consumer</module>
-        <module>service-provider</module>
-    </modules>
-
-
-    <dependencies>
-        <dependency>
-            <groupId>com.aliware.tianchi</groupId>
-            <artifactId>internal-gateway</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-    </dependencies>
-</project>
\ No newline at end of file
diff --git a/internal-service/service-api/pom.xml b/internal-service/service-api/pom.xml
deleted file mode 100644
index 3e3a112..0000000
--- a/internal-service/service-api/pom.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <parent>
-        <artifactId>service</artifactId>
-        <groupId>com.aliware.tianchi</groupId>
-        <version>1.0.0</version>
-    </parent>
-    <modelVersion>4.0.0</modelVersion>
-
-    <artifactId>service-api</artifactId>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.slf4j</groupId>
-            <artifactId>slf4j-api</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>ch.qos.logback</groupId>
-            <artifactId>logback-classic</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo</artifactId>
-        </dependency>
-    </dependencies>
-
-</project>
\ No newline at end of file
diff --git a/internal-service/service-api/src/main/java/com/aliware/tianchi/HashInterface.java b/internal-service/service-api/src/main/java/com/aliware/tianchi/HashInterface.java
deleted file mode 100644
index 087dfce..0000000
--- a/internal-service/service-api/src/main/java/com/aliware/tianchi/HashInterface.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package com.aliware.tianchi;
-
-/**
- * @author guohaoice@gmail.com
- */
-public interface HashInterface {
-
-  /**
-   * 计算给定字符串的 hash 值
-   * <li>
-   *     <ol>接口的响应时间符合负指数分布 </ol>
-   *     <ol>接口的并发度(允许同时调用的线程数)会随时间增加或减小,从而模拟生产环境可能的排队</ol>
-   * </li>
-   * @param input 要计算的字符串
-   * @return 字符串的 hash 值
-   */
-  int hash(String input);
-}
diff --git a/internal-service/service-consumer/pom.xml b/internal-service/service-consumer/pom.xml
deleted file mode 100644
index 3ad3b7b..0000000
--- a/internal-service/service-consumer/pom.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <parent>
-        <artifactId>service</artifactId>
-        <groupId>com.aliware.tianchi</groupId>
-        <version>1.0.0</version>
-    </parent>
-    <modelVersion>4.0.0</modelVersion>
-
-    <artifactId>service-consumer</artifactId>
-
-    <dependencies>
-        <dependency>
-            <groupId>com.aliware.tianchi</groupId>
-            <artifactId>service-api</artifactId>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-shade-plugin</artifactId>
-                <version>3.2.1</version>
-                <executions>
-                    <execution>
-                        <phase>package</phase>
-                        <goals>
-                            <goal>shade</goal>
-                        </goals>
-                        <configuration>
-                            <transformers>
-                                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
-                                    <mainClass>com.aliware.tianchi.MyConsumer</mainClass>
-                                </transformer>
-                                <transformer
-                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
-                                    <resource>META-INF/spring.handlers</resource>
-                                </transformer>
-                                <transformer
-                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
-                                    <resource>META-INF/spring.schemas</resource>
-                                </transformer>
-                            </transformers>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
-</project>
\ No newline at end of file
diff --git a/internal-service/service-consumer/src/main/java/com/aliware/tianchi/MyConsumer.java b/internal-service/service-consumer/src/main/java/com/aliware/tianchi/MyConsumer.java
deleted file mode 100644
index e413e71..0000000
--- a/internal-service/service-consumer/src/main/java/com/aliware/tianchi/MyConsumer.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package com.aliware.tianchi;
-
-import java.util.List;
-import org.apache.dubbo.common.Constants;
-import org.apache.dubbo.common.URL;
-import org.apache.dubbo.config.ApplicationConfig;
-import org.apache.dubbo.config.ReferenceConfig;
-import org.apache.dubbo.config.RegistryConfig;
-
-/**
- * Gateway 启动入口
- * @author guohaoice@gmail.com */
-public class MyConsumer {
-  public static void main(String[] args) throws InterruptedException {
-    ApplicationConfig application = new ApplicationConfig();
-    application.setName("service-gateway");
-
-    // 直连方式,不使用注册中心
-    RegistryConfig registry = new RegistryConfig();
-    registry.setAddress("N/A");
-
-    ReferenceConfig<HashInterface> reference = new ReferenceConfig<>();
-    reference.setApplication(application);
-    reference.setRegistry(registry);
-    reference.setInterface(HashInterface.class);
-
-    List<URL> urls = reference.toUrls();
-    // 添加直连的 provider 地址
-    urls.add(new URL(Constants.DUBBO_PROTOCOL, "localhost", 20880, reference.getInterface()));
-    urls.add(new URL(Constants.DUBBO_PROTOCOL, "localhost", 20880, reference.getInterface()));
-
-    HashInterface service = reference.get();
-    while (true) {
-      Thread.sleep(1000);
-      System.out.println(service.hash("hahaha"));
-    }
-  }
-}
diff --git a/internal-service/service-consumer/src/main/java/com/aliware/tianchi/MyDirectServiceConsumer.java b/internal-service/service-consumer/src/main/java/com/aliware/tianchi/MyDirectServiceConsumer.java
deleted file mode 100644
index 82826cb..0000000
--- a/internal-service/service-consumer/src/main/java/com/aliware/tianchi/MyDirectServiceConsumer.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.aliware.tianchi;
-
-import java.io.IOException;
-
-/**
- * @author daofeng.xjf
- */
-public class MyDirectServiceConsumer {
-    public static void main(String[] args) throws IOException {
-
-    }
-}
diff --git a/internal-service/service-consumer/src/main/resources/dubbo-consumer.xml b/internal-service/service-consumer/src/main/resources/dubbo-consumer.xml
deleted file mode 100644
index 72f887b..0000000
--- a/internal-service/service-consumer/src/main/resources/dubbo-consumer.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-       xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
-       xmlns="http://www.springframework.org/schema/beans"
-       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
-       http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
-
-    <!-- consumer's application name, used for tracing dependency relationship (not a matching criterion),
-    don't set it same as provider -->
-    <dubbo:application name="demo-consumer"/>
-
-    <!-- use multicast registry center to discover service -->
-    <dubbo:registry address="list://127.0.0.1:2181"/>
-
-    <!-- generate proxy for the remote service, then demoService can be used in the same way as the
-    local regular interface -->
-    <dubbo:reference id="directService" check="false" interface="com.aliware.tianchi.HashInterface" />
-
-</beans>
\ No newline at end of file
diff --git a/internal-service/service-consumer/src/main/resources/dubbo-direct-service-consumer.xml b/internal-service/service-consumer/src/main/resources/dubbo-direct-service-consumer.xml
deleted file mode 100644
index e69de29..0000000
diff --git a/internal-service/service-consumer/src/main/resources/logback.xml b/internal-service/service-consumer/src/main/resources/logback.xml
deleted file mode 100644
index 9462137..0000000
--- a/internal-service/service-consumer/src/main/resources/logback.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<configuration>
-    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
-        <file>service-provider.log</file>
-        <encoder>
-            <pattern>%date %level [%thread] %logger{10} [%file : %line] %msg%n</pattern>
-        </encoder>
-    </appender>
-
-    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
-        <encoder>
-            <pattern>%msg%n</pattern>
-        </encoder>
-    </appender>
-
-    <logger name="chapters.configuration.Foo" additivity="false">
-        <appender-ref ref="FILE" />
-    </logger>
-
-    <root level="info">
-        <appender-ref ref="STDOUT" />
-    </root>
-</configuration>
\ No newline at end of file
diff --git a/internal-service/service-provider/pom.xml b/internal-service/service-provider/pom.xml
deleted file mode 100644
index 91ebdbf..0000000
--- a/internal-service/service-provider/pom.xml
+++ /dev/null
@@ -1,59 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <parent>
-        <artifactId>service</artifactId>
-        <groupId>com.aliware.tianchi</groupId>
-        <version>1.0.0</version>
-    </parent>
-    <modelVersion>4.0.0</modelVersion>
-
-    <artifactId>service-provider</artifactId>
-
-
-    <dependencies>
-        <dependency>
-            <groupId>com.aliware.tianchi</groupId>
-            <artifactId>service-api</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo</artifactId>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-shade-plugin</artifactId>
-                <version>3.2.1</version>
-                <executions>
-                    <execution>
-                        <phase>package</phase>
-                        <goals>
-                            <goal>shade</goal>
-                        </goals>
-                        <configuration>
-                            <transformers>
-                                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
-                                    <mainClass>com.aliware.tianchi.DemoProviderMain</mainClass>
-                                </transformer>
-                                <transformer
-                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
-                                    <resource>META-INF/spring.handlers</resource>
-                                </transformer>
-                                <transformer
-                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
-                                    <resource>META-INF/spring.schemas</resource>
-                                </transformer>
-                            </transformers>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
-
-</project>
\ No newline at end of file
diff --git a/internal-service/service-provider/src/main/java/com/aliware/tianchi/DemoProviderMain.java b/internal-service/service-provider/src/main/java/com/aliware/tianchi/DemoProviderMain.java
deleted file mode 100644
index a7fffec..0000000
--- a/internal-service/service-provider/src/main/java/com/aliware/tianchi/DemoProviderMain.java
+++ /dev/null
@@ -1,66 +0,0 @@
-package com.aliware.tianchi;
-
-import java.io.IOException;
-import java.util.List;
-import com.aliware.tianchi.policy.SmallConfig;
-import org.apache.dubbo.config.ApplicationConfig;
-import org.apache.dubbo.config.ProtocolConfig;
-import org.apache.dubbo.config.RegistryConfig;
-import org.apache.dubbo.config.ServiceConfig;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/** @author guohaoice@gmail.com */
-public class DemoProviderMain {
-  private static final Logger LOGGER = LoggerFactory.getLogger(DemoProviderMain.class);
-
-  public static void main(String[] args) throws IOException {
-    String env;
-    String salt;
-    if (args.length != 3) {
-      LOGGER.info("No specific args found, use [DEFAULT] to run demo provider");
-      env = "small";
-      salt = "salt_val";
-    } else {
-      env = args[0];
-      salt = args[1];
-    }
-    List<ThrashConfig> configs;
-    switch (env) {
-      case "small":
-        configs = new SmallConfig().allConfig;
-        break;
-      default:
-        configs = new SmallConfig().allConfig;
-    }
-
-    // 当前应用配置
-    ApplicationConfig application = new ApplicationConfig();
-    application.setName("service-provider");
-
-    // 连接注册中心配置
-    RegistryConfig registry = new RegistryConfig();
-    registry.setAddress("N/A");
-
-    // 服务提供者协议配置
-    ProtocolConfig protocol = new ProtocolConfig();
-    protocol.setName("dubbo");
-    protocol.setPort(20880);
-    protocol.setThreads(200);
-
-    // 注意:ServiceConfig为重对象,内部封装了与注册中心的连接,以及开启服务端口
-
-    // 服务提供者暴露服务配置
-    ServiceConfig<HashInterface> service =
-        new ServiceConfig<>(); // 此实例很重,封装了与注册中心的连接,请自行缓存,否则可能造成内存和连接泄漏
-    service.setApplication(application);
-    service.setRegistry(registry); // 多个注册中心可以用setRegistries()
-    service.setProtocol(protocol); // 多个协议可以用setProtocols()
-    service.setInterface(HashInterface.class);
-    service.setRef(new HashServiceImpl(salt, configs));
-
-    // 暴露及注册服务
-    service.export();
-    System.in.read(); // press any key to exit
-  }
-}
diff --git a/internal-service/service-provider/src/main/java/com/aliware/tianchi/HashServiceImpl.java b/internal-service/service-provider/src/main/java/com/aliware/tianchi/HashServiceImpl.java
deleted file mode 100644
index 614cee9..0000000
--- a/internal-service/service-provider/src/main/java/com/aliware/tianchi/HashServiceImpl.java
+++ /dev/null
@@ -1,84 +0,0 @@
-package com.aliware.tianchi;
-
-import java.util.Collections;
-import java.util.List;
-import java.util.Random;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.ScheduledThreadPoolExecutor;
-import java.util.concurrent.Semaphore;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicBoolean;
-import org.apache.dubbo.common.utils.NamedThreadFactory;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Facade
- *
- * @author guohaoice@gmail.com
- */
-public class HashServiceImpl implements HashInterface {
-  private static final Logger LOGGER = LoggerFactory.getLogger(HashServiceImpl.class);
-
-  private final String salt;
-  private final AtomicBoolean init = new AtomicBoolean(false);
-  private final List<ThrashConfig> configs;
-  private volatile ThrashConfig config;
-  private Random rng = new Random(2019);
-  private ScheduledExecutorService scheduler =
-      new ScheduledThreadPoolExecutor(1, new NamedThreadFactory("HashService-Refresher"));
-
-  public HashServiceImpl(String salt) {
-    this(salt, Collections.emptyList());
-  }
-
-  public HashServiceImpl(String salt, List<ThrashConfig> configs) {
-    this.salt = salt;
-    this.config = ThrashConfig.INIT_CONFIG;
-    this.configs = Collections.unmodifiableList(configs);
-  }
-
-  @Override
-  public int hash(String input) {
-    long st = System.currentTimeMillis();
-    if (!init.get()) {
-      if (init.compareAndSet(false, true)) {
-        int startTime = 0;
-        for (ThrashConfig thrashConfig : configs) {
-          scheduler.schedule(
-              () -> refresh(thrashConfig), startTime + config.durationInMs, TimeUnit.MILLISECONDS);
-          startTime += config.durationInMs;
-        }
-      }
-    }
-    Semaphore permit = config.permit;
-    try {
-      permit.acquire();
-      long baseRtt = nextRTT();
-      Thread.sleep(baseRtt);
-      return (input + salt).hashCode();
-    } catch (InterruptedException e) {
-      Thread.currentThread().interrupt();
-    } finally {
-      long cost = System.currentTimeMillis() - st;
-      LOGGER.info("HashService cost:{} ms to handle request", cost);
-      permit.release();
-    }
-    throw new IllegalStateException("Unexpected exception");
-  }
-
-  private void refresh(ThrashConfig thrashConfig) {
-    this.config = thrashConfig;
-  }
-
-  private long nextRTT() {
-    double u = rng.nextDouble();
-    int x = 0;
-    double cdf = 0;
-    while (u >= cdf) {
-      x++;
-      cdf = 1 - Math.exp(-1.0D * 1 / config.averageRTTInMs * x);
-    }
-    return x;
-  }
-}
diff --git a/internal-service/service-provider/src/main/java/com/aliware/tianchi/ThrashConfig.java b/internal-service/service-provider/src/main/java/com/aliware/tianchi/ThrashConfig.java
deleted file mode 100644
index cf77000..0000000
--- a/internal-service/service-provider/src/main/java/com/aliware/tianchi/ThrashConfig.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.aliware.tianchi;
-
-import java.util.concurrent.Semaphore;
-
-/**
- * @author guohaoice@gmail.com
- */
-public class ThrashConfig {
-    public static final ThrashConfig INIT_CONFIG=new ThrashConfig(4000,Integer.MAX_VALUE,10);
-    final long durationInMs;
-    final int averageRTTInMs;
-    final Semaphore permit;
-
-    public ThrashConfig(long durationInMs, int maxConcurrency, int averageRTTInMs) {
-        this.durationInMs = durationInMs;
-        this.averageRTTInMs = averageRTTInMs;
-        this.permit=new Semaphore(maxConcurrency);
-    }
-}
diff --git a/internal-service/service-provider/src/main/java/com/aliware/tianchi/policy/SmallConfig.java b/internal-service/service-provider/src/main/java/com/aliware/tianchi/policy/SmallConfig.java
deleted file mode 100644
index 30db975..0000000
--- a/internal-service/service-provider/src/main/java/com/aliware/tianchi/policy/SmallConfig.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package com.aliware.tianchi.policy;
-
-import java.util.Arrays;
-import java.util.List;
-import com.aliware.tianchi.ThrashConfig;
-
-/**
- * @author guohaoice@gmail.com
- */
-public class SmallConfig {
-    private final int baseRTT=20;
-    private final int onePeriodInMs=20_000;
-    private final int baseMaxConcurrency=10_000;
-    private final ThrashConfig config1=new ThrashConfig(onePeriodInMs,baseMaxConcurrency,baseRTT/2);
-    private final ThrashConfig config2=new ThrashConfig(onePeriodInMs,baseMaxConcurrency,baseRTT);
-    private final ThrashConfig config3=new ThrashConfig(onePeriodInMs,baseMaxConcurrency/2,baseRTT);
-    private final ThrashConfig config4=new ThrashConfig(onePeriodInMs,baseMaxConcurrency,baseRTT);
-    private final ThrashConfig config5=new ThrashConfig(onePeriodInMs,baseMaxConcurrency/2,baseRTT*2);
-    private final ThrashConfig config6=new ThrashConfig(onePeriodInMs,baseMaxConcurrency*2,baseRTT);
-    private final ThrashConfig config7=new ThrashConfig(onePeriodInMs,baseMaxConcurrency,baseRTT);
-    private final ThrashConfig config8=new ThrashConfig(onePeriodInMs,baseMaxConcurrency*2,baseRTT/2);
-    private final ThrashConfig config9=new ThrashConfig(onePeriodInMs,baseMaxConcurrency,baseRTT);
-
-    public final List<ThrashConfig> allConfig= Arrays.asList(config1,config2,config3,config4,config5,config6,config7,config8,config9);
-}
diff --git a/internal-service/service-provider/src/main/resources/logback.xml b/internal-service/service-provider/src/main/resources/logback.xml
deleted file mode 100644
index 9462137..0000000
--- a/internal-service/service-provider/src/main/resources/logback.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<configuration>
-    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
-        <file>service-provider.log</file>
-        <encoder>
-            <pattern>%date %level [%thread] %logger{10} [%file : %line] %msg%n</pattern>
-        </encoder>
-    </appender>
-
-    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
-        <encoder>
-            <pattern>%msg%n</pattern>
-        </encoder>
-    </appender>
-
-    <logger name="chapters.configuration.Foo" additivity="false">
-        <appender-ref ref="FILE" />
-    </logger>
-
-    <root level="info">
-        <appender-ref ref="STDOUT" />
-    </root>
-</configuration>
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 5a58537..e578c46 100644
--- a/pom.xml
+++ b/pom.xml
@@ -30,32 +30,12 @@
             <!--internal start-->
             <dependency>
                 <groupId>com.aliware.tianchi</groupId>
-                <artifactId>internal-gateway</artifactId>
-                <version>${project.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>com.aliware.tianchi</groupId>
-                <artifactId>service-api</artifactId>
-                <version>${project.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>com.aliware.tianchi</groupId>
-                <artifactId>service-consumer</artifactId>
-                <version>${project.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>com.aliware.tianchi</groupId>
-                <artifactId>service-provider</artifactId>
-                <version>${project.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>com.aliware.tianchi</groupId>
-                <artifactId>workspace-provider</artifactId>
+                <artifactId>workspace-gateway</artifactId>
                 <version>${project.version}</version>
             </dependency>
             <dependency>
                 <groupId>com.aliware.tianchi</groupId>
-                <artifactId>workspace-gateway</artifactId>
+                <artifactId>workspace-common</artifactId>
                 <version>${project.version}</version>
             </dependency>
             <!--internal end-->
@@ -69,11 +49,6 @@
                 <artifactId>logback-classic</artifactId>
                 <version>1.2.3</version>
             </dependency>
-            <dependency>
-                <groupId>org.apache.commons</groupId>
-                <artifactId>commons-lang3</artifactId>
-                <version>3.9</version>
-            </dependency>
         </dependencies>
     </dependencyManagement>
     <build>
@@ -91,8 +66,8 @@
         </plugins>
     </build>
     <modules>
-        <module>internal-gateway</module>
-        <module>internal-service</module>
-        <module>workspace</module>
+        <module>workspace-common</module>
+        <module>workspace-gateway</module>
+        <module>workspace-provider</module>
     </modules>
 </project>
\ No newline at end of file
diff --git a/internal-gateway/pom.xml b/workspace-common/pom.xml
similarity index 93%
rename from internal-gateway/pom.xml
rename to workspace-common/pom.xml
index 9d99293..1f52996 100644
--- a/internal-gateway/pom.xml
+++ b/workspace-common/pom.xml
@@ -9,7 +9,7 @@
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
-    <artifactId>internal-gateway</artifactId>
+    <artifactId>workspace-common</artifactId>
 
     <dependencies>
         <dependency>
diff --git a/workspace/pom.xml b/workspace-gateway/pom.xml
similarity index 66%
rename from workspace/pom.xml
rename to workspace-gateway/pom.xml
index 5230c79..c38ca43 100644
--- a/workspace/pom.xml
+++ b/workspace-gateway/pom.xml
@@ -9,12 +9,13 @@
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
-    <artifactId>workspace</artifactId>
-    <packaging>pom</packaging>
-    <modules>
-        <module>workspace-gateway</module>
-        <module>workspace-provider</module>
-    </modules>
+    <artifactId>workspace-gateway</artifactId>
 
+    <dependencies>
+        <dependency>
+            <groupId>com.aliware.tianchi</groupId>
+            <artifactId>workspace-common</artifactId>
+        </dependency>
+    </dependencies>
 
 </project>
\ No newline at end of file
diff --git a/workspace/workspace-provider/pom.xml b/workspace-provider/pom.xml
similarity index 65%
rename from workspace/workspace-provider/pom.xml
rename to workspace-provider/pom.xml
index 7d0f8a3..e4fb58c 100644
--- a/workspace/workspace-provider/pom.xml
+++ b/workspace-provider/pom.xml
@@ -3,7 +3,7 @@
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
-        <artifactId>workspace</artifactId>
+        <artifactId>adaptive-loadbalance</artifactId>
         <groupId>com.aliware.tianchi</groupId>
         <version>1.0.0</version>
     </parent>
@@ -11,4 +11,11 @@
 
     <artifactId>workspace-provider</artifactId>
 
+    <dependencies>
+        <dependency>
+            <groupId>com.aliware.tianchi</groupId>
+            <artifactId>workspace-common</artifactId>
+        </dependency>
+    </dependencies>
+
 </project>
\ No newline at end of file
diff --git a/workspace/README.md b/workspace/README.md
deleted file mode 100644
index b89adcf..0000000
--- a/workspace/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# Workspace
-
-选手在这个 module 下开发,其他 module 不允许修改。
\ No newline at end of file
diff --git a/workspace/workspace-gateway/pom.xml b/workspace/workspace-gateway/pom.xml
deleted file mode 100644
index 9a1c6a7..0000000
--- a/workspace/workspace-gateway/pom.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <parent>
-        <artifactId>workspace</artifactId>
-        <groupId>com.aliware.tianchi</groupId>
-        <version>1.0.0</version>
-    </parent>
-    <modelVersion>4.0.0</modelVersion>
-
-    <artifactId>workspace-gateway</artifactId>
-
-
-</project>
\ No newline at end of file
-- 
GitLab