1. 简介

        Dubbo就是资源调度和治理中心的管理工具。       

       是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,是阿里巴巴SOA服务化治理方案的核心框架,每天为2,000+个服务提供3,000,000,000+次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点

        Dubbo 就是类似于webservice的关于系统之间通信的框架,并可以统计和管理服务直接的调用情况(包括服务被谁调用了,调用的次数是如何,以及服务的使用状况)。

2. Dubbox工作原理

dubbo 搭配什么网官_java

2.1 节点说明

2.1.1 Provider

提供方

2.1.2 Consumer

消费方

2.1.3 Registry

注册中心

2.1.4 Monitor

监控中心

2.1.5 Container

容器

2.2 调用关系说明

1) 0 服务容器负责启动,加载,运行服务提供者。

2) 1 服务提供者在启动时,向注册中心注册自己提供的服务

3) 2 服务消费者在启动时,向注册中心订阅自己所需的服务

4) 3 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者

5) 4 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用

6) 5 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心

        可以通俗的理解成房主与租客的关系,提供方(Provider)是房东,消费方(Consumer)是租客,但是,租客不知道房东的信息,所以租客可以去找中介,中介有很多房源信息即房东的信息,注册中心(Registry)就好比中介,当房东要租房的时候,就像中介发布房源信息,中介将房源信息记录下,等到租客订阅。所以租客不必自己去找房东要房东的信息,直接找中介就可以了。

3. 注册中心

        注册中心是一个软件,市面上注册中心有很多,dubbox官方推荐的注册中心是Zookeeper

关于Zookeeper的介绍,在另一篇笔记Zookeeper中有记载。

4. Dubbox本地 JAR包部署

        因为Dubbox的坐标在maven仓库中没有,所以,我们需要手动将dubbox的jar包安装到我们的本地仓库中。

操作步骤:

1)将 dubbo-2.8.4.jar 文件放在本地磁盘的某个地方,例如,我存放在D盘根目录下,如图;

dubbo 搭配什么网官_dubbo 搭配什么网官_02

2)打开cmd控制台:输入命令;

mvn install:install-file -Dfile=d:\dubbo-2.8.4.jar -DgroupId=com.alibaba -DartifactId=dubbo -Dversion=2.8.4 -Dpackaging=jar

,如图:

dubbo 搭配什么网官_dubbo 搭配什么网官_03

查看本地仓库,如图:

dubbo 搭配什么网官_xml_04

5. 入门案例

5.1 服务提供者开发

完整项目GitHub地址:点击下载

5.1.1 创建service服务工程

dubbo 搭配什么网官_spring_05

5.1.2 文件内容

1)web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
  	<!-- 加载spring容器 -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:applicationContext*.xml</param-value>
	</context-param>
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>
</web-app>

2)pom.xml

<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.bjc.dubbox.demo</groupId>
  <artifactId>serviceDemo</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>
  
  <properties>		
		<spring.version>4.2.4.RELEASE</spring.version>
   </properties>
    
	<dependencies>
		<!-- Spring -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-beans</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-jdbc</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-aspects</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-jms</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context-support</artifactId>
			<version>${spring.version}</version>
		</dependency>	
	
		<!-- dubbo相关 -->
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>dubbo</artifactId>
			<version>2.8.4</version>			
		</dependency>
		<dependency>
			<groupId>org.apache.zookeeper</groupId>
			<artifactId>zookeeper</artifactId>
			<version>3.4.6</version>
		</dependency>
		<dependency>
			<groupId>com.github.sgroschupf</groupId>
			<artifactId>zkclient</artifactId>
			<version>0.1</version>
		</dependency>
		
		<dependency>
			<groupId>javassist</groupId>
			<artifactId>javassist</artifactId>
			<version>3.11.0.GA</version>
		</dependency>
		
	</dependencies>
   <build>  
	  <plugins>
	      <plugin>  
	          <groupId>org.apache.maven.plugins</groupId>  
	          <artifactId>maven-compiler-plugin</artifactId>  
	          <version>2.3.2</version>  
	          <configuration>  
	              <source>1.7</source>  
	              <target>1.7</target>  
	          </configuration>  
	      </plugin>  
	      <plugin>
				<groupId>org.apache.tomcat.maven</groupId>
				<artifactId>tomcat7-maven-plugin</artifactId>
				<configuration>
					<!-- 指定端口 -->
					<port>8081</port>
					<!-- 请求路径 -->
					<path>/</path>
				</configuration>
	  	  </plugin>
	  </plugins>  
    </build>
  
</project>

3)applicationContext-service.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:p="http://www.springframework.org/schema/p"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

   
   
</beans>

4)业务接口与类编写

package com.bjc.service;

public interface UserService {
	String getName();
}
package com.bjc.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.bjc.service.UserService;

// 注意:这里的service注解用的是dubbox的
@Service
public class UserServiceImpl implements UserService{

	@Override
	public String getName() {
		return "Mary";
	}

}

5)在配置文件applicationContext-service.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:p="http://www.springframework.org/schema/p"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <!-- 访问Dubbox所要占用的端口(自己要占用的端口) 该配置可以省略 默认是20880-->
    <dubbo:protocol name="dubbo" port="20881"></dubbo:protocol>

	<!-- 当前服务工程名称,用于注册中心识别显示的名称 -->
   	<dubbo:application name="dubboxdemo-service"/>  
   	
   	<!-- 指定的注册中心的地址 这里的端口是服务端提供的端口号,是服务器上注册中心提供的端口-->
	<dubbo:registry address="zookeeper://192.168.25.130:2181"/> 
	
	<!-- 包扫描,扫描业务逻辑所在的包 -->
	<dubbo:annotation package="com.bjc.service.impl" /> 
   
   
</beans>

6)测试

右键项目——>run as ——> maven build,如图:

dubbo 搭配什么网官_dubbo 搭配什么网官_06

在弹窗中Goals中输入tomcat启动命令:tomcat7:run

dubbo 搭配什么网官_xml_07

点击debug启动,如图:

dubbo 搭配什么网官_spring_08

5.2 服务调用者(消费者)开发

完成项目GitHub地址:点击下载

1)创建消费者工程

dubbo 搭配什么网官_spring_09

2)配置文件

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
  <display-name>dubboxDemo_web</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  
  <!-- 解决post乱码 -->
	<filter>
		<filter-name>CharacterEncodingFilter</filter-name>
		<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>utf-8</param-value>
		</init-param>
		<init-param>  
            <param-name>forceEncoding</param-name>  
            <param-value>true</param-value>  
        </init-param>  
	</filter>
	<filter-mapping>
		<filter-name>CharacterEncodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>	
	
  <servlet>
  	<servlet-name>springmvc</servlet-name>
  	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  	<!-- 指定加载的配置文件 ,通过参数contextConfigLocation加载-->
  	<init-param>
  		<param-name>contextConfigLocation</param-name>
  		<param-value>classpath:springmvc.xml</param-value>
  	</init-param>
  </servlet>
  
  <servlet-mapping>
  	<servlet-name>springmvc</servlet-name>
  	<url-pattern>*.do</url-pattern>
  </servlet-mapping>
  
</web-app>

pom.xml

案例中与提供者一致就可以了

springMVC.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:p="http://www.springframework.org/schema/p"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    
	<mvc:annotation-driven >
		<mvc:message-converters register-defaults="false">
			<bean class="org.springframework.http.converter.StringHttpMessageConverter">  
				<constructor-arg value="UTF-8" />
			</bean>  
		</mvc:message-converters>	
	</mvc:annotation-driven>

</beans>

3)业务类编写

1. 拷贝提供方的service接口到消费方工程,如图:

dubbo 搭配什么网官_xml_10

2. 编写Controller

UserController.java

package com.bjc.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.alibaba.dubbo.config.annotation.Reference;
import com.bjc.service.UserService;

@Controller
@RequestMapping("/user")
public class UserController {
	
	// 注意:这里需要使用dubbox提供的应用注解,该注解的作用是远程注入
	@Reference
	private UserService userService;
	
	@RequestMapping("/showName")
	@ResponseBody
	public String showName(){
		return userService.getName();
	}

}

注意:这里service注入使用的注解是@Reference

4)在springMvc.xml文件中 引入dubbox服务配置

<?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:p="http://www.springframework.org/schema/p"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    
	<mvc:annotation-driven >
		<mvc:message-converters register-defaults="false">
			<bean class="org.springframework.http.converter.StringHttpMessageConverter">  
				<constructor-arg value="UTF-8" />
			</bean>  
		</mvc:message-converters>	
	</mvc:annotation-driven>
	
	<!-- 引用dubbo 服务 -->
	<dubbo:application name="dubboxdemo-web" />
	<dubbo:registry address="zookeeper://192.168.25.130:2181"/>
    <dubbo:annotation package="com.bjc.controller" />

</beans>

5)测试

在浏览器输入网址:http://localhost:8082/user/showName.do

结果如图:

dubbo 搭配什么网官_xml_11

注意:有可能会报zookeeper timeOut 的错误,可能原因是Linux的防火墙没关闭,关闭防火墙就可以了

以root身份执行命令:chkconfig iptables off  关闭防火墙。

6. 管理中心部署

       我们在开发时,需要知道注册中心都注册了哪些服务,以便我们开发和测试。我们可以通过部署一个管理中心来实现。其实管理中心就是一个web应用,部署到tomcat即可。

6.1 管理端安装

6.1.1 懒人方式获取war文件

        所谓懒人方式就是直接将war包部署到tomcat上,点击下载,m1lv

6.1.2 源码编译方式生成war文件

        该方式需要我们下载dubbox的源码dubbox-master.zip,将其解压之后,编译其中的dubbo-admin,如图:

dubbo 搭配什么网官_java_12

源码下载地址:hcxf

操作步骤:

1)进入dubbo-admin,复制其地址D:\pinyougouSource\soft\dubbo\dubbox-master\dubbo-admin

2)打开cmd控制台,进入dubbo-admin目录,如图:

dubbo 搭配什么网官_dubbo 搭配什么网官_13

3)执行maven命令:mvn package -Dmaven.skip.test=true,如图:

dubbo 搭配什么网官_java_14

注意: -Dmaven.skip.test=true 表示跳过测试

4)等待控制台出现如图所示信息,表示打包完成

dubbo 搭配什么网官_spring_15

5)查看admin目录,发现生成了一个target目录,如图:

dubbo 搭配什么网官_Dubbox_16

6)进入target目录,文件 dubbo-admin-2.8.4.war 就是我们需要的war文件,如图:

dubbo 搭配什么网官_java_17

6.1.3 部署war包

        将生成的war上传到Linux服务器上的tomcat的webapps目录,如图:

dubbo 搭配什么网官_dubbo 搭配什么网官_18

6.2 运行

运行tomcat,在本地浏览器输入网址:http://192.168.25.130:8080/dubbo-admin/  ,如图:

dubbo 搭配什么网官_xml_19

输入用户名和密码:用户名与密码均为root,如图:

dubbo 搭配什么网官_xml_20

点击登录,进入管理控制台,如图:

dubbo 搭配什么网官_Dubbox_21

6.3 管理中心简单使用

6.3.1 查看服务

选择 服务治理——>服务,如图:

dubbo 搭配什么网官_dubbo 搭配什么网官_22

点击服务,可以查看服务列表,如图;

dubbo 搭配什么网官_dubbo 搭配什么网官_23

6.3.2 查看服务提供者

服务治理——> 提供者,如图;

dubbo 搭配什么网官_java_24

点击提供者,如图:

dubbo 搭配什么网官_xml_25

6.3.3 服务消费者

如图:

dubbo 搭配什么网官_xml_26