springboot+dubbo基于zookeeper快速搭建一个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,也希望各位兄长不吝赐教。
springboot+dubbo基于zookeeper快速搭建一个demo的更多相关文章
- SpringBoot(一):使用IDEA快速搭建一个SpringBoot项目(详细)
环境: JDK1.8 Maven:3.5.4 1.打开IDEA,右上角选择File→New→Project 选择Spring Initializr(使用IDEA自带的插件创建需要电脑联网) 2.点 ...
- 快速搭建一个SSM框架demo
我之所以写一个快速搭建的demo,主要想做一些容器的demo,所以为了方便大家,所以一切从简,简单的3层架构 先用mysql的ddl,后期不上oracle的ddl ; -- ------------- ...
- 快速搭建一个直播Demo
缘由 最近帮朋友看一个直播网站的源码,发现这份直播源码借助 阿里云 .腾讯云这些大公司提供的SDK 可以非常方便的搭建一个直播网站.下面我们来给大家讲解下如何借助 腾讯云 我们搭建一个简易的 直播示例 ...
- Electron入门笔记(一)-自己快速搭建一个app demo
Electron学习-快速搭建app demo 作者: 狐狸家的鱼 Github: 八至 一.安装Node 1.从node官网下载 ,最好安装.msi后缀名的文件,新手可以查看安装教程进行安装. 2. ...
- 快速搭建一个基于react的项目
最近在学习react,快速搭建一个基于react的项目 1.创建一个放项目文件夹,用编辑器打开 2.打开集成终端输入命令: npm install -g create-react-app 3. cre ...
- jquery+flask+keras+nsfw快速搭建一个简易鉴黄工具
1. demo 地址:http://www.huchengchun.com:8127/porn_classification 接口说明: 1. http://www.huchengchun.com:8 ...
- [原创] zabbix学习之旅五:如何快速搭建一个报警系统
通过之前的文章,我们已搭建好zabbix server.agent和mail客户端,现在万事俱备,只差在server的界面中进行相应配置,即可快速搭建一个报警系统.总的来说,快速搭建一个报警系统的顺序 ...
- 基于 Jenkins 快速搭建持续集成环境--转
源地址:http://www.ibm.com/developerworks/cn/java/j-lo-jenkins/ 持续集成是一种软件开发实践,对于提高软件开发效率并保障软件开发质量提供了理论基础 ...
- 快速搭建一个Spring Boot + MyBatis的开发框架
前言:Spring Boot的自动化配置确实非常强大,为了方便大家把项目迁移到Spring Boot,特意总结了一下如何快速搭建一个Spring Boot + MyBatis的简易文档,下面是简单的步 ...
随机推荐
- 记录手机端h5页面碰到的一些问题
关于input光标在手机端偏移 问题根本:不要使用line-height垂直居中. 解决方法:可直接定义height,然后高度由上下padding值撑开. 移动端清除input光标 ios input ...
- eclipse中没有server选项无法配置Tomcat
eclipse集成Tomcat: 打开eclipse - 窗口 - 首选项 - 服务器 - 运行时环境 找到Tomcat然后添加. eclipse添加插件: 开发WEB项目时要集成Tomcat可以并不 ...
- c# 谷歌动态口令对接
https://www.cnblogs.com/easyauthor/p/11054869.html Google 身份验证器与两步验证功能配合,可在您登录 Google 帐户时为您平添一重安全保障. ...
- js-弹框倒计时三秒后,自动关闭???
效果: js: //弹出窗,三秒倒计时 countdown(){ //点击发布按钮后,三秒倒计时开始 $(".btn-pub").click(function(){ var cou ...
- java+web+超大文件上传
javaweb上传文件 上传文件的jsp中的部分 上传文件同样可以使用form表单向后端发请求,也可以使用 ajax向后端发请求 1.通过form表单向后端发送请求 <form id=" ...
- asp.net+批量下载附件
asp.net 下载文件几种方式 protected void Button1_Click(object sender, EventArgs e) { /* 微软为Response对象提供了一个新的方 ...
- PCL智能指针疑云 <三> 智能指针作为函数的传值参数和传引用参数
一 函数的参数传递可以简单分类为“传值”和“传引用”. 声明函数时,形参带引用“&”,则函数调用时,是把实参所在的内存直接传给函数所开辟的栈内存.在函数内对形参的修改相当于对实参也进行修改. ...
- [51nod1383&1048]整数分解为2的幂:DP
算法一 分析 \(f[x]=f[x-1]+f[x/2] \times [x \equiv 0 \mod 2],O(n)\) 代码 n=int(input()) f=[0]*(n+5) f[0]=1 m ...
- Burp suite抓取HTTPS请求
一.下载链接:Burp suite 密码:orpr 二.抓取浏览器HTTPS请求 1.打开CMD,进入到Burp suite下载路径,执行:java -jar BurpLoader.jar 2.点击 ...
- sqli-labs(36)
0X01发现又是‘’被过滤了 ?id=%df%%20and%=%23 错误 ?id=1%df%27%20and%201=1%23 正确 存在注入 0X01爆数据库 ?id=-%df%%20unio ...