一:简介

      以前做项目时,分布式环境都是其它同事在搭建,自己也没参与分布式环境搭建,只负责开发,由于近段时间工作重心转到android,java后台有一段时间没有接触了,刚好这几天有空,决定自己动手亲自搭建一次spring+dubbo+zookeeper的运行环境,方便以后在工作中使用,如有描述错误的地方,请指正,谢谢。

     1 dubbo描述

   Dubbo是一个分布式服务框架,如果是一个小的erp系统,一台服务器足够支撑项目运行,项目就不会用Dubbo,如果是一个大的商城项目,用户访问量比较大,一台无法器根本无法支撑运行时,我们可以把订单模块,支付模块,静态页面等独立出来,放置在同一个局域网,不同服务器运行,这时我们就需要使用Dubbo, Dubbo原理图如下:

     

节点角色说明:

Provider: 暴露服务的服务提供方,比如支付系统实现支付接口,供订单系统调用

Consumer: 调用远程服务的服务消费方,比如订单系统调用支付系统提供的服务进行付款操作。

Registry: 服务注册与发现的注册中心。

Monitor: 统计服务的调用次调和调用时间的监控中心。

Container: 服务运行容器。

各个角色之间的调用关系:

1 服务容器负责启动,加载,运行服务提供者。2 服务提供者在启动时,向注册中心注册自己提供的服务。3 服务消费者在启动时,向注册中心订阅自己所需的服务。4注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。5 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。6 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心(此段描述来自网络)。

  2zookeeper下载地址,http://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.3.6/   下载后直接解压即可

二:环境搭建

  1 测试环境

我本地测试环境是 Window 7 64,Eclipse 4.4,jdk1.8,tomcat 8,zookeeper-3.3.6,apache-maven-3.5.0

2 创建项目

现在我们模拟一个商城环境,将支付模块和订单模块独立出来,在不同服务器上运行,然后相互之前调用,由于两个系统需要相互调用,即支付模块是服务提供者,又是消费者,订单模块也是服务提供者,又是消费者.

创建父工程shopping,创建完成后,设置父工程的Packaging为pom

  

    创建子工程,shopping-api(用于定义公共接口,公共实体类等),shopping-order(订单模块,需要依赖shopping-api,实现订单的service接口),shopping-pay(订单模块,需要依赖shopping-api,实现支付的service接口).

  3:service的定义及实现

  所有接口定义在shopping-api中,订单接口定义如下:

//定义订单读接口
package com.service.order; import java.util.List;
import com.bean.OrderBean;
/**
* 订单查询
* */
public interface OrderReadService {
List<OrderBean> listQuery();
OrderBean getOrder(long oId);
}

支付接口定义如下:

package com.service.pay;

/**
* 订单支付
* */
public interface PayService {
String pay(long orderId);
}
订单接口需要在shopping-order项目中实现,代码如下:
package com.order.impl;

import java.util.List;
import java.util.Random;
import java.util.Vector; import com.bean.OrderBean;
import com.service.order.OrderReadService; /**
* 订单查询实现类
* */
public class OrderReadServiceImpl implements OrderReadService { @Override
public List<OrderBean> listQuery() {
// TODO Auto-generated method stub
List<OrderBean> list = new Vector<OrderBean>();
for(int i=0;i<5;i++){
OrderBean bean = new OrderBean();
bean.setoId(i+10);
bean.setoMoney(100+new Random().nextInt(50));
bean.setoUserId(500+new Random().nextInt(50));
list.add(bean);
}
return list;
} @Override
public OrderBean getOrder(long oId) {
// TODO Auto-generated method stub
OrderBean bean = new OrderBean();
bean.setoId(oId);
bean.setoMoney(100+new Random().nextInt(50));
bean.setoUserId(500+new Random().nextInt(50));
return bean;
} }

 支付接口需要在shopping-pay项目中实现,代码如下:

package com.pay.impl;

import com.service.pay.PayService;

public class PayServiceImpl implements PayService {

    @Override
public String pay(long orderId) {
// TODO Auto-generated method stub
return orderId + "支付成功.";
} }

  4:项目之间的依赖关系

  由于shopping-api定义了完整的接口,shopping-order,shopping-pay实现了shopping-api项目下的接口,所以需要在shopping-order,shopping-pay项目中配置依赖关系,代码如下:

<dependency>
<groupId>shopping-api</groupId>
<artifactId>shopping-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>

  5:配置Dubbo提供者和消费者的xml

  由于两个项目之前需要相互调用,所以两个项目都需要配置服务提供者,和消费者,代码如下:

  shopping-order订单项目的xml配置如下:

<!--定义了提供方应用信息,用于计算依赖关系;在 dubbo-admin 或 dubbo-monitor 会显示这个名字,方便辨识 -->
<dubbo:application name="shopping-order" owner="programmer" organization="dubbox" />
<!--向 zookeeper 订阅 provider 的地址,由 zookeeper 定时推送 -->
<dubbo:registry address="zookeeper://localhost:2181" check="false"/>
<!-- 用dubbo协议在20880端口暴露服务 -->
<dubbo:protocol name="dubbo" port="20880" /> <!-- (配置订单服务提供者 )提供支付方的接口 -->
<dubbo:service ref="orderReadService" protocol="dubbo" interface="com.service.order.OrderReadService"></dubbo:service>
<bean id="orderReadService" class="com.order.impl.OrderReadServiceImpl"></bean>
<dubbo:service ref="orderWriterService" protocol="dubbo" interface="com.service.order.OrderWriterService"></dubbo:service>
<bean id="orderWriterService" class="com.order.impl.OrderWriterServiceImpl"></bean> <!-- 配置消费者 -->
<!--使用 dubbo 协议调用定义好的 api.PermissionService 接口 -->
<dubbo:reference id="payService" interface="com.service.pay.PayService" check="false"></dubbo:reference>

 shopping-pay支付项目的xml配置如下:

  <!--定义了提供方应用信息,用于计算依赖关系;在 dubbo-admin 或 dubbo-monitor 会显示这个名字,方便辨识 -->
<dubbo:application name="shopping-pay" owner="programmer" organization="dubbox" />
<!--向 zookeeper 订阅 provider 的地址,由 zookeeper 定时推送 -->
<dubbo:registry address="zookeeper://localhost:2181" check="false" />
<!-- 用dubbo协议在20880端口暴露服务,由于订单设置的端口是20880,此处设置20881,不然tomcat启动后,会冲突报错 -->
<dubbo:protocol name="dubbo" port="20881" /> <!-- (配置支付服务提供者)提供给订单项目调用 -->
<dubbo:service interface="com.service.pay.PayService" ref="payService" protocol="dubbo"></dubbo:service>
<bean id="payService" class="com.pay.impl.PayServiceImpl"></bean> <!-- (配置消费者) -->
<dubbo:reference interface="com.service.order.OrderReadService" id="orderReadService"></dubbo:reference>
<dubbo:reference interface="com.service.order.OrderWriterService" id="orderWriterService"></dubbo:reference>

三:创建tomcat运行环境

      我将不同的项目,放置在不同的tomcat下,创建过程:File-new-Other,弹出如下窗体

    

    

  添加完成,将项目导入tomcat,效果图如下

  shopping-pay将端口号设置为:8081,

  

   shopping-order将端口号设置为:8082

  

  

四:启动项目,调用接口测试

  启动tomcat前,需要先启动zookeeper,先进入之前解压的zookeeper/bin目录,运行zkServer.cmd,然后再启动tomcat,两个项目不分先后启动,但测试前,需要保证两个项目正常启动.

  直接在浏览器中输入如下地址测试,控制层的代码,没有贴出来,完整代码在文章最后有下载地址:

http://127.0.0.1:8081/shopping-pay/pay/orderList.do?id=10

http://127.0.0.1:8082/shopping-order/order/pay.do?id=123

五:注意事项

  因为两个项目,需要相互调用,所以配置服务端口暴露服务时,记得将两个端口设置为不一样,不然会出错,此处配置我也不是很熟悉,如配置不对,请指正,谢谢,配置如下:

<!-- 用dubbo协议在20880端口暴露服务 -->
<dubbo:protocol name="dubbo" port="20880" /> <!-- 用dubbo协议在20880端口暴露服务,由于订单设置的端口是20880,此处设置20881,不然tomcat启动后,会冲突报错 -->
<dubbo:protocol name="dubbo" port="20881" />

  另外还需要注意:向 zookeeper 订阅 provider 的地址,以及配置dubbo:service,需要把check设置为false,不然项目无法启动,

  

<dubbo:registry address="zookeeper://localhost:2181"  check="false" />

<dubbo:service interface="com.service.pay.PayService"  ref="payService" protocol="dubbo"></dubbo:service>

由于两个项目依赖于,shopping-api,虽然在pom.xml中引入了对shopping-api的依赖,我本地tomcat启动时,仍然报错,找不到shopping-api下的公共类,所以我将shopping-api打包成jar包,放置在shopping-order和shopping-pay项目中。

参考文献:

分布式系统架构实战demo:SSM+Dubbo
https://my.oschina.net/liughDevelop/blog/1480061#0-sqq-1-469-9737f6f9e09dfaf5d3fd14d775bfee85

dubbo 既是提供方又是消费方的问题
https://blog.csdn.net/q596333033/article/details/78573741

Dubbo架构

http://dubbo.apache.org/books/dubbo-dev-book/design.html

dubbo 知识总结 dubbo配置参考

https://blog.csdn.net/abcde474524573/article/details/53026110

这是本人第一次搭建dubbo环境,本文可能有错误的地方,希望大家指正,谢谢,完整代码下载地址:https://github.com/jlq023/dubbo-shopping

java 零基础搭建dubbo运行环境的更多相关文章

  1. 零基础搭建appium自动化环境

    目录 1.关键概念 2.安装过程 2.1.安装nodejs 2.2.安装appium 2.3.安装Android SDK 2.4.安装模拟器 2.5.安装Python3 2.6.安装appium Cl ...

  2. Java零基础搭建实时直播平台

    https://www.cnblogs.com/scywkl/p/12101437.html

  3. 【JAVA零基础入门系列】Day1 开发环境搭建

    [JAVA零基础入门系列](已完结)导航目录 Day1 开发环境搭建 Day2 Java集成开发环境IDEA Day3 Java基本数据类型 Day4 变量与常量 Day5 Java中的运算符 Day ...

  4. 【JAVA零基础入门系列】Day2 Java集成开发环境IDEA

    开发环境搭建好之后,还需要一个集成开发环境也就是IDE来进行编程.这里推荐的IDE是IDEA,那个老掉牙的Eclipse还是先放一边吧,(手动滑稽). IDEA的下载地址:http://www.jet ...

  5. [零基础学IoT Pwn] 环境搭建

    [零基础学IoT Pwn] 环境搭建 0x00 前言 这里指的零基础其实是我们在实战中遇到一些基础问题,再相应的去补充学习理论知识,这样起码不会枯燥. 本系列主要是利用网上已知的IoT设备(路由器)漏 ...

  6. JDK+Tomcat搭建JSP运行环境--JSP基础

    一.搭建JSP运行环境之前需要了解的基本知识 配置JSP运行环境之前,我们需要了解JSP的运行机制.只有了解JSP运行机制后,我们才能知道为什么要搭建JSP运行环境?如何去搭建JSP运行环境?为什么要 ...

  7. 【JAVA零基础入门系列】Day4 变量与常量

    这一篇主要讲解Java中的变量,什么是变量,变量的作用以及如何声明,使用变量. 那么什么是变量?对于初学者而言,可以将变量理解为盒子,这些盒子可以用来存放数据,不同类型的数据需要放在对应类型的盒子里. ...

  8. 【JAVA零基础入门系列】Day5 Java中的运算符

    运算符,顾名思义就是用于运算的符号,比如最简单的+-*/,这些运算符可以用来进行数学运算,举个最简单的栗子: 已知长方形的长为3cm,高为4cm,求长方形的面积. 好,我们先新建一个项目,命名为Rec ...

  9. 【JAVA零基础入门系列】Day6 Java字符串

    字符串,是我们最常用的类型,每个用双引号来表示的串都是一个字符串.Java中的字符串是一个预定义的类,跟C++ 一样叫String,而不是Char数组.至于什么叫做类,暂时不做过多介绍,在之后的篇章中 ...

随机推荐

  1. js如何开发游戏(聊天篇)

    公司最近有这方面的需求,期望我们能搞出点有趣的小游戏来帮助公司进行推广,公司没有专门做游戏开发的员工,很不幸这件事情掉到了前端头上. 我记得我以前在学习的时候曾经见过一些厉害的前端工程师编写过一些网页 ...

  2. up61博客模版版本v1.0.0

    经过两天的努力 终于把博客模板框架写出来了. 表示写模板累死了,很久没有写样式了,还是那么难搞.没有PHP写函数爽. 不管怎么样 第一版出来了.以下是部分截图.预览 当然在示例部署到项目上的时候 ,部 ...

  3. HttpSessionActivationListener序列化与反序列化

    一.序列化与反序列化 1.什么是序列化 把对象转化位字节序列的过程称为序列化(保存到硬盘,持久化) 把字节序列转化位对象的过程称为反序列化(存放于内存) 2.序列化的用途 把对象的字节序列永久保存到硬 ...

  4. Win10+QT5.7.1搭建opencv开发环境

    一.准备工作: 1下载Qt5.7.1软件qt-opensource-windows-x86-mingw530-5.7.1.exe(http://download.qt.io/official_rele ...

  5. 内嵌tomcat启动速度慢

    项目上最近要把内置的jetty换成tomcat, 来更好的支持servlet 3.0 本来以为换个容器, 几十行代码就好了. 实际上换了tomcat后, 一开始启动tomcat, 非常的慢. jett ...

  6. linux的shell学习笔记

    shell脚本第一行写明解释器的路径: #!/bin/bash运行脚本两种方式:使用bash命令运行shell文件,或授予脚本文件执行权限,可直接执行文件shell启动时,一开始执行一组命令来定义提问 ...

  7. MySQL多数据源笔记5-ShardingJDBC实战

    Sharding-JDBC集分库分表.读写分离.分布式主键.柔性事务和数据治理与一身,提供一站式的解决分布式关系型数据库的解决方案. 从2.x版本开始,Sharding-JDBC正式将包名.Maven ...

  8. adobe media encoder cc 2015在win10中打开崩溃的解决办法(该方法同样适用于adobe其他产品)

    今天就给大家讲讲adobe media encoder cc 2015启动的时候崩溃的问题,先来看看现象.就是这样了,然后我在网上找了很多办法,有的方法已经过时了,也或者因为现在新版本的adobe m ...

  9. New Windows 10 SDK - Toast Notification

    概述 Toast Notification 在 UWP App 中有很重要的作用,能够很大程度上增强 App 和用户之间的沟通,比如运营推广活动.版本更新.提醒类任务提示等等.Toast Notifi ...

  10. centos7的服务管理

    1,启动服务(每条都可以)systemctl start httpdsystemctl start httpd.serviceservice httpd start 2,停止服务systemctl s ...