1. 简介
Dubbo就是资源调度和治理中心的管理工具。
是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,是阿里巴巴SOA服务化治理方案的核心框架,每天为2,000+个服务提供3,000,000,000+次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点
Dubbo 就是类似于webservice的关于系统之间通信的框架,并可以统计和管理服务直接的调用情况(包括服务被谁调用了,调用的次数是如何,以及服务的使用状况)。
2. Dubbox工作原理
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盘根目录下,如图;
2)打开cmd控制台:输入命令;
mvn install:install-file -Dfile=d:\dubbo-2.8.4.jar -DgroupId=com.alibaba -DartifactId=dubbo -Dversion=2.8.4 -Dpackaging=jar
,如图:
查看本地仓库,如图:
5. 入门案例
5.1 服务提供者开发
完整项目GitHub地址:点击下载
5.1.1 创建service服务工程
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,如图:
在弹窗中Goals中输入tomcat启动命令:tomcat7:run
点击debug启动,如图:
5.2 服务调用者(消费者)开发
完成项目GitHub地址:点击下载
1)创建消费者工程
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接口到消费方工程,如图:
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
结果如图:
注意:有可能会报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,如图:
源码下载地址:hcxf
操作步骤:
1)进入dubbo-admin,复制其地址D:\pinyougouSource\soft\dubbo\dubbox-master\dubbo-admin
2)打开cmd控制台,进入dubbo-admin目录,如图:
3)执行maven命令:mvn package -Dmaven.skip.test=true,如图:
注意: -Dmaven.skip.test=true 表示跳过测试
4)等待控制台出现如图所示信息,表示打包完成
5)查看admin目录,发现生成了一个target目录,如图:
6)进入target目录,文件 dubbo-admin-2.8.4.war 就是我们需要的war文件,如图:
6.1.3 部署war包
将生成的war上传到Linux服务器上的tomcat的webapps目录,如图:
6.2 运行
运行tomcat,在本地浏览器输入网址:http://192.168.25.130:8080/dubbo-admin/ ,如图:
输入用户名和密码:用户名与密码均为root,如图:
点击登录,进入管理控制台,如图:
6.3 管理中心简单使用
6.3.1 查看服务
选择 服务治理——>服务,如图:
点击服务,可以查看服务列表,如图;
6.3.2 查看服务提供者
服务治理——> 提供者,如图;
点击提供者,如图:
6.3.3 服务消费者
如图: