2.7.X的Dubbo,包名不再是com.alibaba,而是org.apache
先看工程目錄結構

一個公共api模塊,一個SpringBoot項目充當Dubbo服務,一個SpringBoot項目充當服務消費者。
代碼
父項目pom
<?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>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.demo</groupId>
<artifactId>dubbo-2.7.3</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>dubbo-api</module>
<module>dubbo-service</module>
<module>dubbo-consumer</module>
</modules>
<properties>
<java.version>1.8</java.version>
<dubbo.version>2.7.3</dubbo.version>
<!--如果curator版本與zookeeper不對應,會報錯:KeeperErrorCode = Unimplemented for /dubbo/com.demo.common.HelloService-->
<curator.version>2.13.0</curator.version>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>${dubbo.version}</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>${dubbo.version}</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>${curator.version}</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>${curator.version}</version>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
</project>
api模塊

只是提供了一個公共的服務接口
package com.demo.common; public interface HelloService { String hello(); }
pom
<?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>dubbo-2.7.3</artifactId>
<groupId>com.demo</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>dubbo-api</artifactId>
</project>
Dubbo服務模塊

主要提供服務實現
package com.demo.dubboservice.service.impl; import com.demo.common.HelloService; import org.apache.dubbo.config.annotation.Service; /** * 建議由服務提供方設置超時,在 Provider 上盡量多配置 Consumer 端屬性 * timeout 方法調用超時 * retries 失敗重試次數,缺省是 2 [2] * loadbalance 負載均衡算法 [3],缺省是隨機 random。還可以有輪詢 roundrobin、最不活躍優先 [4] leastactive 等 * actives 消費者端,最大並發調用限制,即當 Consumer 對一個服務的並發調用到上限后,新調用會阻塞直到超時 */ @Service(registry = "dubboRegistry", timeout = 3000, version = "1.0", retries = 3, loadbalance = "random", actives = 5) public class HelloServiceImpl implements HelloService { @Override public String hello() { return "動物園里有大西幾! 小凶許! 小腦斧! 梅發怒!"; } }
application.properties
spring.application.name=service-provider
server.port=9999
spring.main.allow-bean-definition-overriding=true
# Dubbo Application
# The default value of dubbo.application.name is ${spring.application.name}
# dubbo.application.name=${spring.application.name}
# 掃描dubbo服務(@Service.. @Reference..)
dubbo.scan.basePackages=com.demo.dubboservice.service.impl
# 通信協議
dubbo.protocol.id = dubbo
dubbo.protocol.name = dubbo
dubbo.protocol.port = 20880
# 注冊中心
dubbo.registry.id = dubboRegistry
dubbo.registry.timeout=5000
dubbo.registry.address=zookeeper://127.0.0.1:2181
# Dubbo 支持 zkclient 和 curator 兩種 Zookeeper 客戶端實現:在2.7.x的版本中已經移除了zkclient的實現,如果要使用zkclient客戶端,需要自行拓展
dubbo.registry.client=curator
# 元數據地址
dubbo.metadata-report.address=zookeeper://127.0.0.1:2181
pom
<?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>dubbo-2.7.3</artifactId>
<groupId>com.demo</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>dubbo-service</artifactId>
<name>dubbo-service</name>
<description>Demo project for Spring Boot</description>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.demo</groupId>
<artifactId>dubbo-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
服務消費者模塊

調用dubbo服務,提供前端接口
package com.demo.dubboconsumer.controller; import com.demo.common.HelloService; import org.apache.dubbo.config.annotation.Reference; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class HelloController { @Reference(version = "1.0") private HelloService helloService; @RequestMapping("/hello") public String hello(){ return helloService.hello(); } }
application.properties
spring.application.name=dubbo-consumer
server.port=9990
spring.main.allow-bean-definition-overriding=true
# Dubbo Application
# The default value of dubbo.application.name is ${spring.application.name}
# dubbo.application.name=${spring.application.name}
# 掃描dubbo服務(@Service.. @Reference..)
dubbo.scan.basePackages=com.demo.dubboconsumer.controller
# 通信協議
dubbo.protocol.id=dubbo
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880
# 注冊中心
dubbo.registry.id=dubboRegistry
dubbo.registry.timeout=5000
dubbo.registry.address=zookeeper://127.0.0.1:2181
dubbo.registry.client=curator
# 元數據地址
dubbo.metadata-report.address=zookeeper://127.0.0.1:2181
pom
<?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>dubbo-2.7.3</artifactId>
<groupId>com.demo</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>dubbo-consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>dubbo-consumer</name>
<description>Demo project for Spring Boot</description>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.demo</groupId>
<artifactId>dubbo-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
代碼搞定,又出了個新問題

為什么呢,因為中央倉庫里還沒有2.7.3版本的依賴,等有了就不會出現這個問題了(這里就要吐槽一下,Dubbo-SpringBoot-Starter項目與Dubbo項目的版本不同步有點尷尬)

臨時解決,去GitHub上下載2.7.3的源碼,然后本地install。

解壓縮,然后進入根目錄,執行 mvn install -Dmaven.test.skip=true

啟動
先在本地啟動一個3.4.X的zookeeper(去官網下載,然后復制conf里的zoo_sample.cfg,重命名zoo.cfg,即可啟動),然后先后啟動Dubbo服務以及消費者項目

訪問

如果你啟動Dubbo管控台(注:最好是最新版),可以看見Dubbo服務


點擊查看【詳情】,在最后有個【元數據】信息,這與前面配置的【元數據地址】是相關聯的。

