由于小编是在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,也希望各位兄长不吝赐教。

springboot+dubbo基于zookeeper快速搭建一个demo的更多相关文章

  1. SpringBoot(一):使用IDEA快速搭建一个SpringBoot项目(详细)

    环境: JDK1.8   Maven:3.5.4 1.打开IDEA,右上角选择File→New→Project 选择Spring Initializr(使用IDEA自带的插件创建需要电脑联网) 2.点 ...

  2. 快速搭建一个SSM框架demo

    我之所以写一个快速搭建的demo,主要想做一些容器的demo,所以为了方便大家,所以一切从简,简单的3层架构 先用mysql的ddl,后期不上oracle的ddl ; -- ------------- ...

  3. 快速搭建一个直播Demo

    缘由 最近帮朋友看一个直播网站的源码,发现这份直播源码借助 阿里云 .腾讯云这些大公司提供的SDK 可以非常方便的搭建一个直播网站.下面我们来给大家讲解下如何借助 腾讯云 我们搭建一个简易的 直播示例 ...

  4. Electron入门笔记(一)-自己快速搭建一个app demo

    Electron学习-快速搭建app demo 作者: 狐狸家的鱼 Github: 八至 一.安装Node 1.从node官网下载 ,最好安装.msi后缀名的文件,新手可以查看安装教程进行安装. 2. ...

  5. 快速搭建一个基于react的项目

    最近在学习react,快速搭建一个基于react的项目 1.创建一个放项目文件夹,用编辑器打开 2.打开集成终端输入命令: npm install -g create-react-app 3. cre ...

  6. jquery+flask+keras+nsfw快速搭建一个简易鉴黄工具

    1. demo 地址:http://www.huchengchun.com:8127/porn_classification 接口说明: 1. http://www.huchengchun.com:8 ...

  7. [原创] zabbix学习之旅五:如何快速搭建一个报警系统

    通过之前的文章,我们已搭建好zabbix server.agent和mail客户端,现在万事俱备,只差在server的界面中进行相应配置,即可快速搭建一个报警系统.总的来说,快速搭建一个报警系统的顺序 ...

  8. 基于 Jenkins 快速搭建持续集成环境--转

    源地址:http://www.ibm.com/developerworks/cn/java/j-lo-jenkins/ 持续集成是一种软件开发实践,对于提高软件开发效率并保障软件开发质量提供了理论基础 ...

  9. 快速搭建一个Spring Boot + MyBatis的开发框架

    前言:Spring Boot的自动化配置确实非常强大,为了方便大家把项目迁移到Spring Boot,特意总结了一下如何快速搭建一个Spring Boot + MyBatis的简易文档,下面是简单的步 ...

随机推荐

  1. Linux系统中的硬件问题如何排查?(6)

    Linux系统中的硬件问题如何排查?(6) 2013-03-27 10:32 核子可乐译 51CTO.com 字号:T | T 在Linux系统中,对于硬件故障问题的排查可能是计算机管理领域最棘手的工 ...

  2. oracle基本语句(第四章、数据库安全管理)

    1.用SYS用户以SYSDBA身份登录SQL Plus,使用DBA_USERS视图查看用户信息: SELECT USERNAME, ACCOUNT_STATUS, CREATED FROM DBA_U ...

  3. jmeter--单个接口通,自动化不通时

    单个接口通,自动化不通时,对比两者请求 post 请求的格式,内容编码

  4. C# 更改 Hashtable key 名称

    Hashtable ht = new Hashtable(); ht[; ht["B"] = ht["标题"]; ht.Remove("标题" ...

  5. 状态管理-vuex

    1.使用vuex // 使用vuex // 第一步:装包npm i vuex -S // 第二步: import Vuex from 'vuex' Vue.use(Vuex) // 第三步: cons ...

  6. AJAX 实例解析

    AJAX 实例 为了帮助您理解 AJAX 的工作原理,我们创建了一个小型的 AJAX 应用程序: 实例 AJAX 不是新的编程语言,而是一种使用现有标准的新方法.深圳dd马达 AJAX 是与服务器交换 ...

  7. CSS无图片三角形

    border:6px solid #f2f2f2; border-color:#999 transparent transparent transparent; border-style:solid ...

  8. Qt第三方库----QCustomPlot

    一.软件下载 下载地址:http://www.qcustomplot.com/index.php/download 这里推荐下载第一个链接的内容: 注:这里的第三方库要放在非中文目录下. 二.配置 ( ...

  9. codevs 5935 小球 x

    题目描述 Description 许多的小球一个一个的从一棵满二叉树上掉下来组成FBT(Full Binary Tree,满二叉树),每一时间,一个正在下降的球第一个访问的是非叶子节点.然后继续下降时 ...

  10. Tensorflow视频教程&Pytorch视频教程

    基于tensorflow做研究和基于pytorch做研究哪个好?哪个更容易复制代码,工业上更易用.Keras和tensorflow.pytorch的关系. Keras:Keras是一个由Python编 ...