Dubbo2.7.5整合SpringBoot構建分佈式系統詳解

 

        相信大家對於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的源碼。 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章