相信大家對於Dubbo都不陌生吧,前段時間看到Dubbo的官網上放出了最新的2.7.5的版本,發現新增了不少特性,這也是自從阿里將Dubbo交給apache維護之後迎來的首次比較大的更新。官網http://dubbo.apache.org。
進入官網之後我們查看文檔(http://dubbo.apache.org/zh-cn/docs/user/new-features-in-a-glance.html),首先來看第一個章節:
我們發現最新的版本是2.7.5,由於剛發佈不久,所以官方並不建議在生產環境使用 ,今天我們本着學習的心態可以先來嚐嚐鮮。
首先我們點擊文檔中左側的快速啓動,進入該章節,
我們發現官方文檔上的入門案例使用的是Spring的配置方式,而現在Spring官方推薦廣大開發者使用SpringBoot進行開發,因此本文也使用SpringBoot來嚐鮮。
首先打開idea,創建一個空項目,如下圖所示:
繼續點擊next, 創建完成之後點擊file -> new -> Module 創建一個模塊,
爲了方便構建應用,我們使用Spring Initializr 來快速構建,我們先創建服務提供者,填入相應的座標
接着我們點擊next
既然Dubbo我們今天玩最新的,那麼索性SpringBoot也用最新的吧,截止到今天最新的GA版本是2.2.6,這裏我們先直接next.
創建完成之後,我們創建相應的包結構,如下圖如所示:
UserServiceImpl 的代碼如下:
@Service
@Component
public class UserServiceImpl implements UserService {
@Override
public List<Address> getUserAddressList(String userId) {
Address address1 = new Address(1, "武漢市江漢區建銀大廈7樓702", "1", "tom", "027-15416474", "Y");
Address address2 = new Address(2, "武漢市武昌區中鐵大廈36樓204", "1", "jerry", "027-56253825", "N");
return Arrays.asList(address1,address2);
}
}
這裏需要注意的是@Service 註解我們要使用Dubbo的而不是Spring框架的,爲了能加載到Spring容器中,我們同時也加上@Component註解。對於UserService接口這裏我將其單獨提取出來了,形成一個interface模塊,將來所有的接口統一維護在interface模塊。
接着我們使用同樣的方法,再新建一個模塊,模塊的結構如下圖:
我們將開發者需要使用的實體類和接口劃分進該模塊中,Address和UserService的代碼如下圖所示:
public class Address implements Serializable {
private Integer id;
private String userAddress;
private String userId;
private String consignee;
private String phoneNum;
private String isDefault;
public Address() {
super();
// TODO Auto-generated constructor stub
}
public Address(Integer id, String userAddress, String userId, String consignee, String phoneNum,
String isDefault) {
super();
this.id = id;
this.userAddress = userAddress;
this.userId = userId;
this.consignee = consignee;
this.phoneNum = phoneNum;
this.isDefault = isDefault;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUserAddress() {
return userAddress;
}
public void setUserAddress(String userAddress) {
this.userAddress = userAddress;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getConsignee() {
return consignee;
}
public void setConsignee(String consignee) {
this.consignee = consignee;
}
public String getPhoneNum() {
return phoneNum;
}
public void setPhoneNum(String phoneNum) {
this.phoneNum = phoneNum;
}
public String getIsDefault() {
return isDefault;
}
public void setIsDefault(String isDefault) {
this.isDefault = isDefault;
}
}
public interface UserService {
/**
* 按照用戶id返回所有的用戶地址
* @param userId
* @return
*/
public List<Address> getUserAddressList(String userId);
}
好了,我們再回到provider模塊中,將interface模塊的座標在pom文件中引入即可。同時我們還要在provider模塊中加入Dubbo 的座標,完整的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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.wcan.dubbo</groupId>
<artifactId>boot-dubbo-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>boot-dubbo-provider</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- Dubbo Spring Boot Starter -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.5</version>
</dependency>
<dependency>
<groupId>com.wcan.dubbo</groupId>
<artifactId>boot-dubbo-interface</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>2.8.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
大家可能有疑問Dubbo的Starter座標從哪裏來的,這裏我們可以回到管網的首頁,如下圖:
我們點擊左邊的github,因爲Dubbo項目的源碼是託管在github上的,進入github上Dubbo 的項目頁面如下圖所示,:
上圖就是Dubbo項目的所有模塊,這裏我們直接來到當前頁面的末尾:
我們可以看到,在Dubbo ecosystem章節中有一個SpringBoot project for Dubbo的子章節,這裏我們點進去,往下拉:
在下面的pom文件中我們就可以看到Dubbo的starter的座標了。
好了回到我們項目中,這裏我們還需要引入操作zookeeper的客戶端工具 curator-recipes的座標,由於我使用的zookeeper是3.4d的版本 ,因此這裏curator-recipes 我選擇的是2.8,好了,服務提供方的模塊基本搭建完成了,這裏我們現在控制檯安裝一下interface模塊:
安裝成功之後的提示信息如下:
‘
好了,我們的provider模塊中應該不會再出現報錯信息了,接着我們來配置application.properties 文件,該文件的配置內容如下:
dubbo.application.name=boot-dubbo-provider
dubbo.registry.address=192.168.137.100:2181
dubbo.registry.protocol=zookeeper
dubbo.protocol.name=dubbo
dubbo.protocol.port=20881
dubbo.monitor.protocol=registry
首先我們配置的是服務提供者的映射規則,接着是註冊中心的地址和端口,這裏我們使用的是zookeeper,因此協議使用的也是zookeeper協議。 這裏我們可以查看文檔,
好了,後面的配置是關於Dubbo協議的 ,具體的信息可以參考文檔。配置文件寫好了之後我們還需要在啓動類上加上一個@EnableDubbo註解,該註解的功能是指定掃描包路徑。這裏我們可以直接加載啓動類上即可,
@EnableDubbo
@SpringBootApplication
public class BootDubboProviderApplication {
public static void main(String[] args) {
SpringApplication.run(BootDubboProviderApplication.class, args);
}
}
好了,準備工作已經做完了,這時候我們就可以啓動服務提供模塊了。
當我們出現這個錯誤信息的時候,一般都是zookeeper出現了問題,仔細檢查zookeeper的服務是否正常,端口是否暢通,配置文件中的ip是否正確等等,這裏是因爲我的zookeeper還沒啓動,好了,啓動zookeeper即可。
provider模塊編寫完成之後我們再創建一個consumer模塊,該模塊需要引入web模塊,方便測試。創建完成之後的項目結構如下圖所示:
接着我們編輯一下pom文件,將Dubbo的座標和interface的座標導入項目中即可,完整的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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.wcan.dubbo</groupId>
<artifactId>boot-dubbo-consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>boot-dubbo-consumer</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.5</version>
</dependency>
<dependency>
<groupId>com.wcan.dubbo</groupId>
<artifactId>boot-dubbo-interface</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.curator/curator-recipes -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>2.8.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
最後分別編寫controller和service層的代碼:
@Controller
public class UserAddressController {
@Autowired
private UserAddressService userAddressService;
@ResponseBody
@RequestMapping("/getAddressList")
public List<Address> getAddressList(String id){
return userAddressService.getUserAddress(id);
}
}
@Service
public class UserAddressServiceimpl implements UserAddressService {
@Reference
UserService userService;
@Override
public List<Address> getUserAddress(String userId) {
return userService.getUserAddressList(userId);
}
}
同樣的,我們將UserAddressService 接口放到interface模塊中,
public interface UserAddressService {
/**
* 獲取用戶地址列表
* @param userId
*/
public List<Address> getUserAddress(String userId);
}
好了,最後我們來配置服務消費者的配置文件,具體信息如下:
server.port=8081
dubbo.application.name=boot-dubbo-consumer
dubbo.registry.address=zookeeper://192.168.137.100:2181
dubbo.monitor.protocol=registry
最後我們啓動服務,打開postman訪問http://localhost:8081/getAddressList?id=1 即可看到服務調用的效果了
最後我們來看一下最新版Dubbo的控制檯,首先我們回到官方文檔上,我們查看左下角的運維管理章節:
選擇第一個章節,控制太介紹,如下圖:
我們打開git終端,執行上述命令即可,啓動控制檯之後訪問的界面如下所示:
可以看到我們發佈的服務了。好了關於最新版本的Dubbo整合SpringBoot就先介紹到這裏了。下次有空的話我們一起來構建一下Dubbo的源碼。