由于小编是在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. pyqt5-信号与槽

    个人理解:pyqt5的信号就是C++中事件,比如鼠标单击事件;pyqt5中的槽就是c++事件函数,比如单击之后要去执行的函数 例子一 一个信号连接一个槽 import sysfrom PyQt5.Qt ...

  2. es6 Object.assign(target, ...sources)

    Object.assign() 方法用于将所有可枚举属性(对象属性)的值从一个或多个源对象复制到目标对象.它将返回目标对象. 语法 Object.assign(target, ...sources) ...

  3. DB2的HADR

    db2stop force; db2start; db2 restore db clmsdb; db2 start hadr on db clmsdb as standby; ************ ...

  4. Spring Boot Starters 究竟是怎么回事

    Spring Boot 对比 Spring MVC 最大的优点就是使用简单,约定大于配置.不会像之前用 Spring MVC 的时候,时不时被 xml 配置文件搞的晕头转向,冷不防还因为 xml 配置 ...

  5. 24.二叉树中和为某一值的路径(python)

    题目描述 输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径.(注意: 在返回值的list中,数组长度大 ...

  6. 防火墙firewalld 案例1.内网请求转发到外网

    环境: 内网应用服务端口流量需要转发请求到外网端口 解决思路: firewalld 的富规则 d主机: 富规则 d主机对外dnat发布5423端口,然后dnat请求s的80端口: s主机snat返回8 ...

  7. android stadio gradle问题

    https://www.jianshu.com/p/2bb0b6a7b479 https://www.jianshu.com/p/d175bef9770c Unable to resolve depe ...

  8. CF Round #569 Div2(contest1180)

    比赛链接:http://codeforces.com/contest/1180 Problem A 题意:给出n,问方块数.看图理解... Solution: 找一找规律就可以了,发现方块数为2n*( ...

  9. windows10 gcc编译C程序(简单编译)

    参考:http://c.biancheng.net/view/660.html gcc可以一次性完成C语言源程序的编译,也可以分步骤完成:下面先介绍一次性编译过程. 1.生成可执行程序 cd xxx ...

  10. sqli-labs(33)

    0X01构造闭合 发现‘ 被过滤了 那么 宽字节绕过 ?id=-%df%%20union%20,database(),%