環境準備
- Java 1.8
- Apollo配置中心安裝,Github上有詳細的安裝過程
- Zookeeper註冊中心,官網下載和安裝
開始搭建
1. 創建配置
1.1 創建項目
前面安裝好Apollo後,從瀏覽器進入配置中心管理頁面(默認端口8070)
如上圖創建3個Project,分別爲demo-common(公共配置)、demo-provider(提供者配置)、demo-consumer(消費者配置)
1.2 創建公共Namespace
先進入demo-common項目,點擊左下角的添加 Add Namespace 按鈕
進入添加Namespace頁面後點擊 Create Namespace 按鈕
創建一個dubbo的Namespace,然後回到demo-common的項目配置中,此時項目多了一個dubbo的公共配置。然後在dubbo的Namespace下面添加如下配置
dubbo.protocol.name = dubbo
dubbo.registry.address = zookeeper://zookeeper-ip:2181
dubbo.registry.simplified = true
然後點擊 dubbo 上的 Realease 按鈕
1.3 添加私有配置
1.3.1 添加服務端的配置
- 添加上面創建的dubbo的Namespace,進入 demo-provider項目,點擊 Add Namespace按鈕,然後在下拉選項中選擇 dubbo,然後 Submit
- 回到 demo-provider 項目中,在 application 的 Namespace中添加以下配置,然後 Release
dubbo.application.name = demo-provider
dubbo.protocol.port = 20880
dubbo.scan.base-packages = com.dzeb.demo.service # dubbo的Service註解的類的包
1.3.2 添加消費端的配置
- 跟上面 demo-provider 一樣,進入 demo-consumer, 先添加公共的 dubbo 的 Namespace
- 在 application 的 Namespace 中添加以下配置,然後 Release
dubbo.application.name = demo-consumer
2. 創建Java工程
2.1 創建Java工程
創建 demo-provider、demo-consumer、demo-api 三個maven工程
2.2 添加Maven依賴
demo-provider的pom.xml:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
<!-- apollo 依賴 -->
<dependency>
<groupId>com.ctrip.framework.apollo</groupId>
<artifactId>apollo-client</artifactId>
<version>1.5.0</version>
</dependency>
<!-- zookeeper 需要用的依賴 -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.2.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.2.0</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.5.5</version>
</dependency>
<!-- dubbo 和 springboot 集成依賴 -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.4.1</version>
</dependency>
<!-- demo-api依賴 -->
<dependency>
<groupId>com.dzeb</groupId>
<artifactId>demo-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
demo-consumer 的 pom.xml:
<dependencies>
<!-- springboot web啓動 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
<!-- Apollo -->
<dependency>
<groupId>com.ctrip.framework.apollo</groupId>
<artifactId>apollo-client</artifactId>
<version>1.5.0</version>
</dependency>
<!-- dubbo -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.4.1</version>
</dependency>
<!-- zookeeper 需要用到的依賴-->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.2.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.2.0</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.5.5</version>
</dependency>
<!-- demo-api -->
<dependency>
<groupId>com.dzeb</groupId>
<artifactId>demo-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
2.3 配置使用 Apollo
demo-provider 的 resources/application.properties:
app.id = demo-provider # Apollo配置中心中的 demo-provider 的 appId
apollo.meta=http://apollo-ip:8080 # 配置中心的meta-server,默認8080端口
apollo.bootstrap.enabled = true # 注入默認application namespace的配置示例
apollo.bootstrap.namespaces = application,dubbo # 要使用的 Namespace
demo-consumer 的 resources/application.properties:
app.id = demo-consumer
apollo.meta=http://apollo-ip:8080
apollo.bootstrap.enabled = true
apollo.bootstrap.namespaces = application,dubbo
2.4 創建測試類
demo-api 工程創建類 DemoService:
public interface DemoService {
String sayHello(String name);
}
demo-provider 工程創建類 DefaultDemoService 和 DemoProviderApplication:
import org.apache.dubbo.config.annotation.Service;
import org.springframework.beans.factory.annotation.Value;
// 這裏的 Service 是 org.apache.dubbo.config.annotation 包下面的,不是 Spring 的 Service 註解
@Service(version = "1.0.0")
public class DefaultDemoService implements DemoService {
/**
* application name
*/
@Value("${dubbo.application.name}")
private String serviceName;
public String sayHello(String name) {
return String.format("[%s] : Hello, %s", serviceName, name);
}
}
@SpringBootApplication
public class DemoProviderApplication {
public static void main(String[] args) {
SpringApplication.run(DemoProviderApplication.class, args);
}
}
demo-consumer 工程創建類 DemoController 和 DemoApiApplication:
@RestController
@RequestMapping
public class DemoController {
@Reference(version = "1.0.0")
private DemoService demoService;
@RequestMapping("sayHello/{name}")
public ResponseEntity<String> sayHello(@PathVariable("name") String name) {
return ResponseEntity.ok().body(demoService.sayHello(name));
}
}
@SpringBootApplication
public class DemoApiApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApiApplication.class, args);
}
}
2.5 啓動訪問
分別啓動 DemoProviderApplication 和 DemoApiApplication,然後在瀏覽器或HTTP測試工具上訪問,如下
填坑
如果啓動遇到如下報錯:
java.lang.IllegalStateException: zookeeper not connected
有一種情況是超時導致的,可以在zookeeper配置的連接增加timeout(default 5000),然後 Release
zookeeper://zookeeper-ip:2181?timeout=10000
總結
這次搭建使用了最新的dubbo 2.7.x,其中有許多改動,比如默認配置中心和移除 zkclient 的實現:
爲了兼容2.6.x版本配置,在使用Zookeeper作爲註冊中心,且沒有顯示配置配置中心的情況下,Dubbo框架會默認將此Zookeeper用作配置中心,但將只作服務治理用途。
注意:在2.7.x的版本中已經移除了zkclient的實現,如果要使用zkclient客戶端,需要自行拓展
源碼地址
https://github.com/dingzebin/dubbo-apollo-demo