Dubbo是一个高性能服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案,使得应用可通过高性能RPC实现服务的输出和输入功能,和Spring框架可以无缝集成。

作为一个分布式服务框架,以及SOA治理方案,Dubbo其功能主要包括:高性能NIO通讯及多协议集成,服务动态寻址与路由,软负载均衡与容错,依赖分析与服务降级等。Dubbo最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合)。从服务模型的角度来看,Dubbo采用的是一种非常简单的模型,要么是提供方提供服务,要么是消费方消费服务,所以基于这一点可以抽象出服务提供方(Provider)和服务消费方(Consumer)两个角色。

Dubbo包含远程通讯、集群容错和自动发现三个核心部分。提供透明化的远程方法调用,实现像调用本地方法一样调用远程方法,只需简单配置,没有任何API侵入。同时具备软负载均衡及容错机制,可在内网替代F5等硬件负载均衡器,降低成本,减少单点。可以实现服务自动注册与发现,不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的IP地址,并且能够平滑添加或删除服务提供者。

下图来自Dubbo官网,描述了服务注册中心、服务提供方、服务消费方、服务监控中心之间的调用关系,具体如下图所示:

今天的第一个dubbo程序主要就是实现Consumer对Provider的调用
一、Provider(服务提供方)步骤

1.pom.xml如下

<!-- 这里是配置的编译JDK版本和编码方式 -->
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.target>1.8</maven.compiler.target>
</properties> <dependencies>
<!-- spring引入 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.0.2.RELEASE</version>
</dependency>
<!-- zookeeper客户端 -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.3</version>
</dependency>
<!-- zookeeper核心包 -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.5</version>
</dependency>
<!-- dubbo核心包引入 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.5.7</version>
<scope>compile</scope>
<exclusions>
<exclusion>
<artifactId>spring</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
</exclusions>
</dependency>
</dependencies>

2.dubbo.xml配置(程序主配置)

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <context:component-scan base-package="cn.duanjt" /> <!-- 提供方应用信息,用于计算依赖关系 -->
<dubbo:application name="storeServer" /> <!-- 使用zookeeper注册中心暴露服务地址 -->
<dubbo:registry address="zookeeper://127.0.0.1:2181" /> <!-- 用dubbo协议在20880端口暴露服务 -->
<dubbo:protocol name="dubbo" port="20880" />
<dubbo:protocol name="rmi" port="21880" /> <!--和本地bean一样实现服务 -->
<bean id="vipUserService" class="cn.duanjt.service.impl.VipUserService" /> <dubbo:service interface="cn.duanjt.service.UserService" ref="vipUserService" protocol="dubbo" />
</beans>

说明:

  • 我们需要在包cn.duanjt(可以是子包下面)下面创建一个接口UserService
  • 我们需要在包cn.duanjt(可以是子包下面)下面创建一个接口UserService的实现类VipUserService
  • 如上的xml配置就是根据接口和实现类暴露接口给zookeeper
  • protocol表示协议方式,可以是dubbo、rmi等。因为dubbo是支持多协议的

3.主方法代码如下:

public class SpringServer {
public static void main(String[] args) throws IOException {
ClassPathXmlApplicationContext ac=new ClassPathXmlApplicationContext("classpath:dubbo.xml");
ac.start();
System.out.println("服务端启动完成");
System.in.read();
}
}

二、Consumer(服务消费方)步骤

其实消费方也是可以使用jar包的方式调用,但是为了实现不同的方式,消费方我们使用spring-mvc的方式进行实现。

1.首先搭建一个普通的spring-mvc程序,不会的可以参考spring-mvc

2.pom.xml如下:

<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.target>1.8</maven.compiler.target>
</properties> <dependencies>
<!-- servlet的引用 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
<!-- spring引用 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.0.2.RELEASE</version>
</dependency>
<!-- zkclient引用 -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.3</version>
</dependency>
<!-- zookeeper核心包的引用 -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.5</version>
</dependency>
<!-- dubbo核心包的引用 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.5.7</version>
<scope>compile</scope>
<exclusions>
<exclusion>
<artifactId>spring</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
</exclusions>
</dependency>
</dependencies>

3.在springmvc的配置文件(spring-mvc.xml)中引入dubbo配置

4.dubbo.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <!-- 就是注册到zookeeper的名字 -->
<dubbo:application name="store_client"></dubbo:application>
<!-- zookeeper地址 -->
<dubbo:registry address="zookeeper://127.0.0.1:2181"></dubbo:registry> <dubbo:consumer check="false" />
<!-- 从zookeeper引用 -->
<dubbo:reference id="userService" interface="cn.duanjt.service.UserService"></dubbo:reference>
</beans>

说明:

  • 需要创建一个接口UserService。该接口和服务方的接口完全一致。

5.controller的代码如下:

@Controller
public class UserController {
@Autowired
UserService service; @RequestMapping("/index")
public String index(HttpServletRequest request, HttpServletResponse response) {
String res = service.getDetail("china");//远程rpc调用
request.setAttribute("detail", res);//将结果设置到detail中
return "index";
}
}

6.前端jsp页面(index.jsp)如下:

<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>首页</title>
</head>
<body>
你好,接收到的数据是: ${detail }
</body>
</html>

前端请求的地址是:http://localhost:8080/index

最后附一张图:

最新文章

  1. php设计模式--面向对象
  2. myeclipse配置maven
  3. 背水一战 Windows 10 (27) - 控件(文本类): TextBlock
  4. Dynamics AX 2012 R2 RemoteApp导出项目报错
  5. Legolas工业自动化平台入门(一)搭建应用
  6. 一个不错的能将HTML表格导出为excel,pdf等的jquery插件
  7. ios开发 ad hoc
  8. 手势冲突UIPanGestureRecognizer 和UIPinchGestureRecognizer
  9. java 基础之数据类型
  10. linux自定义开机启动服务
  11. Centos6.6升级python版本
  12. IndexAction.java (Java之负基础实战)
  13. ubuntu开机自动关闭独显,使用集成显卡
  14. 一种dubbo逻辑路由方案(服务化隔离环境)
  15. pc-H5 适配方案
  16. Android-Java-死锁
  17. deeplearning.ai学习LSTM
  18. STM32输入捕获模式设置并用DMA接收数据
  19. 【MAVEN】搜索错误“Index downloads are disabled,search results may be incomplete”
  20. CI 2.2 + smarty 3.1.18 完美整合配置成功

热门文章

  1. 成绩统计程序(Java)
  2. topcoder srm 480 div1
  3. Android Java层,Native层,Lib层打印Log简介【转】
  4. Django 创建项目笔记
  5. 如何合并ts文件?
  6. 题解——loj6277 数列分块入门1(分块)
  7. webpack用 babel将ES6转译ES5
  8. 【Hadoop 分布式部署 四:配置Hadoop 2.x 中主节点(NN和RM)到从节点的SSH无密码登录】
  9. cmd中utf-8编码的问题
  10. 常用模块(subprocess/hashlib/configparser/logging/re)