springboot+dubbo基于zookeeper快速搭建一个demo

由于小编是在windows环境下搭建的,故该示例均为在windows下操作,这里只是提供一个快速搭建思路,linux操作也基本上差不多。

首先本示例的dubbo是基于zookeeper发布订阅消息的,所以需要先下载zookeeper,下载地址http://mirror.bit.edu.cn/apache/zookeeper/current/

下载完成后加压之后目录结构如图所示:

进入zookeeperconf目录下,修改zoo.cfg配置文件如下:(此处有注释,可视具体情况配置)

修改完配置文件后,保存。然后进入zookeeperin目录,双击zkServer.cmd(linux平台启动./zkServer.sh),启动zookeeper服务,启动完成后的CMD窗口如图所示:

为了监控dubbo生产者提供的服务和消费者的情况,建议最好再搭建一个dubbo-admin平台来管理,这里小编比较懒,引用一下网上前辈的资源文件http://pan.baidu.com/s/1c0nmZG8,提取码uvvb,下载到tomcatwebappsROOT下,把原有文件替换掉:如图所示:

 

默认用户信息如下:(你也可以通过apache-tomcat-8.5.30webappsROOTWEB-INFdubbo.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,也希望各位兄长不吝赐教。

原文地址:https://www.cnblogs.com/mingxiaoyue/p/9194431.html