詳細搭建一個Spring boot+dubbo環境框架 demo~!

由於小編是在windows環境下搭建的,故該示例均爲在windows下操作,這裏只是提供一個快速搭建思路,linux操作也基本上差不多。

首先本示例的dubbo是基於zookeeper發佈訂閱消息的,所以需要先下載zookeeper,下載地址http://mirror.bit.edu.cn/apache/zookeeper/current/

下載完成後加壓之後目錄結構如圖所示:

進入\zookeeper\conf目錄下,修改zoo.cfg配置文件如下:(此處有註釋,可視具體情況配置)

修改完配置文件後,保存。然後進入\zookeeper\bin目錄,雙擊zkServer.cmd(linux平臺啓動./zkServer.sh),啓動zookeeper服務,啓動完成後的CMD窗口如圖所示:

爲了監控dubbo生產者提供的服務和消費者的情況,建議最好再搭建一個dubbo-admin平臺來管理,這裏小編比較懶,引用一下網上前輩的資源文件http://pan.baidu.com/s/1c0nmZG8,提取碼uvvb,下載到tomcat\webapps\ROOT下,把原有文件替換掉:如圖所示:

 

默認用戶信息如下:(你也可以通過apache-tomcat-8.5.30\webapps\ROOT\WEB-INF\dubbo.properties來修改)

dubbo.registry.address=zookeeper://127.0.0.1:2181
dubbo.admin.root.password=root
dubbo.admin.guest.password=guest

OK,到這裏配置工作完成了,進入tomcat的bin目錄下,雙擊startup.bat文件,啓動dubbo-admin服務。完成後如圖所示:

由於這裏我們還沒有發佈基於dubbo的生產者和消費者服務,所以此處顯示沒有服務。

下邊開始正式寫基於springboot+dubbo的代碼了:

首先新建一個simple-maven-project,操作步驟一次如下:

 

如果創建時沒有選擇parent project,後邊在pom添加springboot父級依賴效果一樣的:

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.1.RELEASE</version>
</parent>

然後添加依賴jar包,這裏直接使用阿里提供的dubbo-spring-boot-starter,該pom內已經包含了zookeeper,dubbo等所需的jar包;

<dependency> 
<groupId>com.alibaba.spring.boot</groupId> 
<artifactId>dubbo-spring-boot-starter</artifactId> 
<version>2.0.0</version> 
</dependency>

再添加zkclient否則會報錯:

<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>

這裏主項目已經建立完成了。

此時完整的pom如下:

<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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.ving</groupId>
<artifactId>demo-dubbo</artifactId>
<version>1.0.0</version>
<packaging>pom</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.1.RELEASE</version>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<boot.dubbo.version>2.0.0</boot.dubbo.version> 
<zkclient.version>0.10</zkclient.version>
</properties>
<dependencyManagement>
<dependencies>
<!-- alibaba dubbo-spring-boot-starter -->
<dependency> 
<groupId>com.alibaba.spring.boot</groupId> 
<artifactId>dubbo-spring-boot-starter</artifactId> 
<version>${boot.dubbo.version}</version> 
</dependency> 
<!-- ZooKeeper client -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>${zkclient.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>

下邊應該新建provider和consumer服務了,但是本着資源共享的原則,我們可以抽象出一個api模塊,專門存放provider和consumer都需要使用到的一些jar,實體類和接口;

選擇主項目,新建一個demo-dubbo-api子模塊:

然後新建一個實體類,UserDO

package com.dubbo.entity;

import java.io.Serializable;

/**
* @類名稱:UserDO
* @類描述:TODO
* @日期:2018年6月17日
* @版本:V1.0
*/
public class UserDO implements Serializable {

/** 
* @字段名:serialVersionUID
* @字段描述:{todo}
*/ 
private static final long serialVersionUID = 5438739092677089251L;

private Long id;
private String name;
private String passwrod;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPasswrod() {
return passwrod;
}
public void setPasswrod(String passwrod) {
this.passwrod = passwrod;
}
public UserDO() {
super();
// TODO Auto-generated constructor stub
}
public UserDO(Long id, String name, String passwrod) {
super();
this.id = id;
this.name = name;
this.passwrod = passwrod;
}

}

再新建一個service類:UserService,該接口即爲我們provider服務對外提供的服務接口:

package com.dubbo.api;

import java.util.List;

import javax.validation.constraints.NotBlank;

import com.dubbo.entity.UserDO;

/**
* @類名稱:UserService
* @類描述:
* @作者:Lv Ming
* @日期:2018年6月17日
* @版本:V1.0
*/
public interface UserService {

/**
* 通過id查詢用戶
* @param id
* @return T
* @日期:2018年6月17日
*/
public UserDO findById(@NotBlank Long id);

/**
* 查詢用戶列表
* @return List<T>
* @日期:2018年6月17日
*/
public List<UserDO> listUser();

}

然後pom引用一下provider和consumer都需要用到的依賴:

<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">
<modelVersion>4.0.0</modelVersion>
<artifactId>demo-dubbo-api</artifactId>
<parent>
<groupId>com.ving</groupId>
<artifactId>demo-dubbo</artifactId>
<version>1.0.0</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--com.dubbo-springBoot依賴 -->
<dependency>
<groupId>com.alibaba.spring.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
</dependency>
</dependencies>
</project>

 OK,到這裏demo-dubbo-api模塊搞定了;

下邊終於開始我們的核心模塊provider模塊了:

 同api模塊一樣,我們也在主項目上新建一個demo-dubbo-provider模塊:

 

 由於我們接下來寫的類要用到api模塊的實體類和接口及jar,所以先把依賴搞進來,pom如下:

<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">
<modelVersion>4.0.0</modelVersion>
<artifactId>demo-dubbo-provider</artifactId>
<parent>
<groupId>com.ving</groupId>
<artifactId>demo-dubbo</artifactId>
<version>1.0.0</version>
</parent>
<dependencies>
<dependency>
<groupId>com.ving</groupId>
<artifactId>demo-dubbo-api</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

然後我們新建一個serviceImpl類來實現我們api中定義的接口類,生產者服務,顧名思義就是要基於數據分析實現業務邏輯的,然後接口才能給提供給別人調用對吧,代碼如下:

package com.dubbo.server.service.impl;

import java.util.ArrayList;
import java.util.List;

import org.springframework.stereotype.Component;

import com.alibaba.dubbo.config.annotation.Service;
import com.dubbo.api.UserService;
import com.dubbo.entity.UserDO;

/**
* @類名稱:UserServiceImpl
* @類描述:實現用戶管理接口
* @作者:Lv Ming
* @日期:2018年6月17日
* @版本:V1.0
*/
@Service(interfaceClass = UserService.class) 
@Component
public class UserServiceImpl implements UserService {

@SuppressWarnings("serial")
private List<UserDO> users = new ArrayList<UserDO>(){{
add(new UserDO(1L, "熊大", "123"));
add(new UserDO(2L, "熊二", "234"));
add(new UserDO(3L, "熊三", "456"));
}};

/** 
* <p>覆蓋方法:findById</p>
* <p>描述:通過id查詢用戶</p>
* @param id
* @return
* @see com.dubbo.api.UserService#findById(java.lang.Long)
*/ 
@Override
public UserDO findById(Long id) {
return users.stream().filter(user -> user.getId() == id).findFirst().get();
}

/** 
* <p>覆蓋方法:listUser</p>
* <p>描述:查詢用戶列表</p>
* @return
* @see com.dubbo.api.UserService#listUser()
*/ 
@Override
public List<UserDO> listUser() {
return users;
}

}

然後我們新建一個providerApplication類來啓動服務。

package com.dubbo.server;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import com.alibaba.dubbo.spring.boot.annotation.EnableDubboConfiguration;

/**
* @類名稱:ProviderApplication
* @類描述:TODO
* @作者:Lv Ming 
* @日期:2018年6月16日 
* @版本:V1.0
*/

@SpringBootApplication
@EnableDubboConfiguration
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
}

到這裏基本功能已經寫完了,那麼怎麼把服務發佈到zookeeper呢。不要着急,既然我們使用了springboot,而且阿里也集成了dubbo-spring-boot-starter,那麼自然也提供了基於application.properties的配置方法,網上也有很多使用xml配置文件,然後在啓動類providerApplication上使用@ImportResource的方式導入配置,結果都大同小異,這裏也就不再演示了,我們使用最簡單的方式來實現就OK了,resources目錄下新建application.properties文件,配置如下:

server.port=7001
spring.dubbo.application.id=demo-dubbo-provider 
spring.dubbo.application.name=demo-dubbo-provider 
spring.dubbo.registry.address=zookeeper://127.0.0.1:2181 
spring.dubbo.server=true 
spring.dubbo.protocol.name=dubbo 
spring.dubbo.protocol.port=20880

此時我們此時運行providerApplication類,生產者服務就提供出去了,我們可以到dubbo-admin管理平臺去查看一下:

 

此時發現服務果然發佈出去了。到這裏生產者服務搞定了,下邊再來看看消費者是怎樣使用服務的:

同上,我們仍然基於主項目新建一份消費者服務demo-dubbo-consumer(當然實際項目中,我們的消費者和生產者肯定不會在一個項目中的,我們只需引用api模塊的pom就行了):

pom文件和生產者模塊的一樣就OK了:

<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">
<modelVersion>4.0.0</modelVersion>
<artifactId>demo-dubbo-consumer</artifactId>
<parent>
<groupId>com.ving</groupId>
<artifactId>demo-dubbo</artifactId>
<version>1.0.0</version>
</parent>
<dependencies>
<dependency>
<groupId>com.ving</groupId>
<artifactId>demo-dubbo-api</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

然後我們就當一次大爺,來消費一次了,創建一個UserController類:

package com.dubbo.client.controller;

import java.util.List;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.alibaba.dubbo.config.annotation.Reference;
import com.dubbo.api.UserService;
import com.dubbo.entity.UserDO;

/**
* @類名稱:HelloController
* @類描述:TODO
* @作者:Lv Ming
* @日期:2018年6月17日
* @版本:V1.0
*/
@RestController
@RequestMapping("/user")
public class UserController {

@Reference
UserService userService;

@GetMapping("/findById/{id}")
public UserDO findById(@PathVariable Long id){
return userService.findById(id);
}

@GetMapping("/listUser")
public List<UserDO> listUser(){
return userService.listUser();
}
}

啓動類ConsumerApplication:

package com.dubbo.client;


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import com.alibaba.dubbo.spring.boot.annotation.EnableDubboConfiguration;

/**
* @類名稱:ConsumerApplication
* @類描述:TODO
* @作者:Lv Ming 
* @日期:2018年6月16日 
* @版本:V1.0
*/
@SpringBootApplication
@EnableDubboConfiguration
public class ConsumerApplication {

public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}

application.properties文件配置:

## 避免和 server 工程端口衝突
server.port=7002
## Dubbo 服務消費者配置 
spring.dubbo.application.name=demo-dubbo-consumer 
spring.dubbo.application.id=demo-dubbo-consumer 
spring.dubbo.registry.address=zookeeper://127.0.0.1:2181 
spring.dubbo.protocol.port=20800 
spring.dubbo.protocol.name=dubbo

OK,到這裏,整個模塊開發完了,趕緊啓動一下消費者服務去dubbo-admin看一下吧:

 

 

 

 

OK。看來很順利,到此完成了,當然實際開發中,要複雜的很多,這裏只是爲了快速入門搭建出環境的一點參考demo,也希望各位兄長不吝賜教。

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