dubbo教程

本教程代码下载:https://download.csdn.net/download/zpcandzhj/10799379

如果此教程对您有帮助,就请有钱的捧个钱场,没钱的捧个人场(转载分享)哦~

在这里插入图片描述在这里插入图片描述

 

推荐 spring cloud 微服务教程:

https://blog.csdn.net/hellozpc/article/details/84144453

https://blog.csdn.net/hellozpc/article/details/83692496

 

             技术公众号【程猿薇茑】


 

1. 教程大纲

1、 了解什么是dubbo

2、 我们使用dubbo能做什么

3、 Dubbo快速入门案例

4、 Dubbo监控、admin控制台

参考资料:

http://dubbo.io/

https://www.gitbook.com/@dubbo

Dubbo项目GitHub主页:

https://github.com/alibaba/dubbo

 

2. 什么是dubbo

2.1. 简介

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

 

Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合)。从服务模型的角度来看,Dubbo采用的是一种非常简单的模型,要么是提供方提供服务,要么是消费方消费服务,所以基于这一点可以抽象出服务提供方(Provider)和服务消费方(Consumer)两个角色。Dubbo框架使得使用者可以像调用本地方法一样调用远程方法,而这一切只需要简单的配置。Dubbo完全兼容Spring配置方式注入,也与Spring boot无缝整合。

 

开发团队:

 

2.2. RPC

 

2.3. 官网

http://dubbo.io/

 

2.4. 版本说明

 

 

2017年9月份,沉寂了5年之久的Dubbo重新得到维护!

本教程基于2.5.7版本

2.5. 下载

Dubbo源码托管于github,并且将jar包发布到maven的中央仓库,所以可以从github和maven中央仓库来下载。

2.5.1. 源码下载

https://github.com/alibaba/dubbo

 

2.5.2. 发布包下载

http://repo1.maven.org/maven2/com/alibaba/dubbo/

 

3. 通过Maven编译构建dubbo

既然可以下载得到源码以及发布包,那么为什么要去构建dubbo呢?我们先来看下dubbo的主要模块:

 

其中,核心框架、管理控制台、简易监控中心、简易注册中心是我们需要的模块。目前只有核心模块jar包可以下载到,其它的均无法直接下载,所以我们需要构建dubbo。

3.1. 导入源码到IDEA

从githhub上下载dubbo源码得到dubbo-master.zip:

https://github.com/alibaba/dubbo

 

解压压缩包:

 

导入源码到IDEA:

 

右侧Maven Projects有红色报错信息,报maven插件无法加载,这个不要紧,待会编译打包Reimport一下即可!

如果POM文件有些划红线的地方也可不管,编译报错再详细分析。切勿编辑pom文件,可能造成一些换行等,编译pom文件会报无法解析(人品好的话编译不会报错,一次成功!)

3.2. 通过源码构建dubbo

在构建之前,各个源码包下面还没有target目录,构建成功之后,打好的jar包、war包会放到默认的输出目录下的target目录下。

 

配置运行参数:

 

 

点击运行按钮开始构建。

 

第一次构建耗时比较长,要联网下载许多jar包(建议使用阿里云的maven仓库)

maven_settings.xml中配置:


 
 
  1. <mirrors>
  2. <mirror>
  3. <id>nexus-aliyun </id>
  4. <mirrorOf>* </mirrorOf>
  5. <name>Nexus aliyun </name>
  6. <url>http://maven.aliyun.com/nexus/content/groups/public </url>
  7. </mirror>
  8. </mirrors>

构建完成:


 
 
  1. [INFO] Reactor Summary:
  2. [INFO]
  3. [INFO] dubbo-parent ....................................... SUCCESS [  0.171 s]
  4. [INFO] Hessian Lite(Alibaba embed version) ................ SUCCESS [  6.314 s]
  5. [INFO] dubbo-common ....................................... SUCCESS [  6.943 s]
  6. [INFO] dubbo-container .................................... SUCCESS [  0.005 s]
  7. [INFO] dubbo-container-api ................................ SUCCESS [  1.129 s]
  8. [INFO] dubbo-container-spring ............................. SUCCESS [  1.416 s]
  9. [INFO] dubbo-container-jetty .............................. SUCCESS [  1.341 s]
  10. [INFO] dubbo-container-log4j .............................. SUCCESS [  1.343 s]
  11. [INFO] dubbo-container-logback ............................ SUCCESS [  1.416 s]
  12. [INFO] dubbo-remoting ..................................... SUCCESS [  0.004 s]
  13. [INFO] dubbo-remoting-api ................................. SUCCESS [  4.595 s]
  14. [INFO] dubbo-remoting-netty ............................... SUCCESS [  2.015 s]
  15. [INFO] dubbo-remoting-mina ................................ SUCCESS [  1.652 s]
  16. [INFO] dubbo-remoting-grizzly ............................. SUCCESS [  0.925 s]
  17. [INFO] dubbo-remoting-p2p ................................. SUCCESS [  1.690 s]
  18. [INFO] dubbo-remoting-http ................................ SUCCESS [  0.965 s]
  19. [INFO] dubbo-remoting-zookeeper ........................... SUCCESS [  1.657 s]
  20. [INFO] dubbo-remoting-netty4 .............................. SUCCESS [  2.108 s]
  21. [INFO] dubbo-rpc .......................................... SUCCESS [  0.004 s]
  22. [INFO] dubbo-rpc-api ...................................... SUCCESS [  2.920 s]
  23. [INFO] dubbo-rpc-default .................................. SUCCESS [  2.990 s]
  24. [INFO] dubbo-rpc-injvm .................................... SUCCESS [  1.493 s]
  25. [INFO] dubbo-rpc-rmi ...................................... SUCCESS [  1.602 s]
  26. [INFO] dubbo-rpc-hessian .................................. SUCCESS [  1.681 s]
  27. [INFO] dubbo-rpc-http ..................................... SUCCESS [  0.784 s]
  28. [INFO] dubbo-rpc-webservice ............................... SUCCESS [  1.870 s]
  29. [INFO] dubbo-cluster ...................................... SUCCESS [  3.492 s]
  30. [INFO] dubbo-registry ..................................... SUCCESS [  0.005 s]
  31. [INFO] dubbo-registry-api ................................. SUCCESS [  2.279 s]
  32. [INFO] dubbo-monitor ...................................... SUCCESS [  0.004 s]
  33. [INFO] dubbo-monitor-api .................................. SUCCESS [  1.530 s]
  34. [INFO] dubbo-filter ....................................... SUCCESS [  0.004 s]
  35. [INFO] dubbo-filter-validation ............................ SUCCESS [  0.899 s]
  36. [INFO] dubbo-filter- cache ................................. SUCCESS [   0.822 s]
  37. [INFO] dubbo-registry- default ............................. SUCCESS [   1.977 s]
  38. [INFO] dubbo-monitor- default .............................. SUCCESS [   1.567 s]
  39. [INFO] dubbo-registry-multicast ........................... SUCCESS [   1.674 s]
  40. [INFO] dubbo-config ....................................... SUCCESS [   0.004 s]
  41. [INFO] dubbo-config-api ................................... SUCCESS [   3.004 s]
  42. [INFO] dubbo-config-spring ................................ SUCCESS [   3.852 s]
  43. [INFO] dubbo-rpc-thrift ................................... SUCCESS [   3.846 s]
  44. [INFO] dubbo-rpc-memcached ................................ SUCCESS [   0.790 s]
  45. [INFO] dubbo-rpc-redis .................................... SUCCESS [   0.828 s]
  46. [INFO] dubbo-registry-zookeeper ........................... SUCCESS [   1.580 s]
  47. [INFO] dubbo-registry-redis ............................... SUCCESS [   1.641 s]
  48. [INFO] dubbo .............................................. SUCCESS [ 39.232 s]
  49. [INFO] dubbo-simple ....................................... SUCCESS [   0.005 s]
  50. [INFO] dubbo-registry-simple .............................. SUCCESS [   4.940 s]
  51. [INFO] dubbo-monitor-simple ............................... SUCCESS [   9.127 s]
  52. [INFO] dubbo- admin ........................................ SUCCESS [ 11.274 s]
  53. [INFO] dubbo-demo ......................................... SUCCESS [   0.004 s]
  54. [INFO] dubbo-demo-api ..................................... SUCCESS [   0.660 s]
  55. [INFO] dubbo-demo-provider ................................ SUCCESS [   3.590 s]
  56. [INFO] dubbo-demo-consumer ................................ SUCCESS [   3.541 s]
  57. [INFO] dubbo- test ......................................... SUCCESS [   0.004 s]
  58. [INFO] dubbo- test- benchmark ............................... SUCCESS [   4.688 s]
  59. [INFO] dubbo- test- compatibility ........................... SUCCESS [   0.041 s]
  60. [INFO] dubbo- test-integration ............................. SUCCESS [   0.044 s]
  61. [INFO] dubbo- test-examples ................................ SUCCESS [   3.082 s]
  62. [INFO] ------------------------------------------------------------------------
  63. [INFO] BUILD SUCCESS
  64. [INFO] ------------------------------------------------------------------------
  65. [INFO] Total time: 02: 39  min
  66. [INFO] Finished at: 2017 -11 -19T14: 33: 11+ 08: 00
  67. [INFO] Final Memory: 41M/ 163M
  68. [INFO] ------------------------------------------------------------------------

3.3. 找到对应的模块包

3.3.1. 核心框架

 

3.3.2. 管理控制台

 

3.3.3. 简易监控中心

 

3.3.4. 简易注册中心

4. Dubbo框架说明

4.1. 背景

4.2. 需求

4.3. 架构

 

 

调用关系:

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

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

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

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

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

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

5. 快速入门案例

5.1. 实现功能

假设现在需要开发2个独立的业务系统,B系统和A系统。A系统调用B系统暴露的接口获取数据,比如查询用户列表

 

5.2. 安装zookeeper

要运行dubbo,首先需要搭建一个注册中心,比如使用zk作为服务注册中心

zk安装包解压如下:

 

修改配置文件conf/zoo.cfg:设置data目录,该目录必须存在。

 

 

 双击zkServer启动zookeeper服务(cmd文件是windows脚本,sh文件是linux下的脚本):

 

5.3. 搭建B系统(B模块)

5.3.1. 创建工程

新建一个maven项目

 

新建模块

 

上一步也可以不选骨架,这样生成的目录没有webapp目录,需要手动创建!并且手动改pom文件的packing类型为war

<packaging>war</packaging>

 

一路next,直到finish。

 

5.3.2. 导入依赖

 

编辑模块systemB的pom文件:

Dubbo核心jar可以先install到本地maven仓库。其实如果联网,一旦保存pom文件,maven工具会自动远程仓库下载。


 
 
  1. <project xmlns= "http://maven.apache.org/POM/4.0.0" xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
  2.          xsi:schemaLocation= "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  3.     <parent>
  4.         <artifactId>dubbodemo</artifactId>
  5.         <groupId>cn.com.zpc</groupId>
  6.         <version> 1.0-SNAPSHOT</version>
  7.     </parent>
  8.     <modelVersion> 4.0.0</modelVersion>
  9.     <artifactId>systemB</artifactId>
  10.     <packaging>war</packaging>
  11.     <name>systemB Maven Webapp</name>
  12.     <url>http: //maven.apache.org</url>
  13.     <dependencies>
  14.         <dependency>
  15.             <groupId>junit</groupId>
  16.             <artifactId>junit</artifactId>
  17.             <version> 3.8.1</version>
  18.             <scope>test</scope>
  19.         </dependency>
  20.         <!-- 采用spring配置方式使用dubbo,所以需要导入spring容器依赖-->
  21.         <dependency>
  22.             <groupId>org.springframework</groupId>
  23.             <artifactId>spring-webmvc</artifactId>
  24.             <version> 4.3.10.RELEASE</version>
  25.         </dependency>
  26.         <dependency>
  27.             <groupId>org.slf4j</groupId>
  28.             <artifactId>slf4j-log4j12</artifactId>
  29.             <version> 1.6.4</version>
  30.         </dependency>
  31.         <dependency>
  32.             <groupId>com.alibaba</groupId>
  33.             <artifactId>dubbo</artifactId>
  34.             <version> 2.5.7</version>
  35.             <!-- 排除传递spring依赖-->
  36.             <exclusions>
  37.                 <exclusion>
  38.                     <artifactId>spring</artifactId>
  39.                     <groupId>org.springframework</groupId>
  40.                 </exclusion>
  41.                 <exclusion>
  42.                     <artifactId>spring-web</artifactId>
  43.                     <groupId>org.springframework</groupId>
  44.                 </exclusion>
  45.                 <exclusion>
  46.                     <artifactId>spring-beans</artifactId>
  47.                     <groupId>org.springframework</groupId>
  48.                 </exclusion>
  49.                 <exclusion>
  50.                     <artifactId>spring-context</artifactId>
  51.                     <groupId>org.springframework</groupId>
  52.                 </exclusion>
  53.             </exclusions>
  54.         </dependency>
  55.     </dependencies>
  56.     <build>
  57.         <finalName>systemB</finalName>
  58.         <plugins>
  59.             <plugin>
  60.                 <groupId>org.apache.tomcat.maven</groupId>
  61.                 <artifactId>tomcat7-maven-plugin</artifactId>
  62.                 <version> 2.2</version>
  63.                 <configuration>
  64.                     <port> 8081</port>
  65.                     <path>/</path>
  66.                 </configuration>
  67.             </plugin>
  68.         </plugins>
  69.     </build>
  70. </project>

5.3.3. 配置log4j文件

在resources下新建log4j.properties:


 
 
  1. log4j.rootLogger=DEBUG,A1
  2. log4j.appender.A1=org.apache.log4j.ConsoleAppender
  3. log4j.appender.A1.layout=org.apache.log4j.PatternLayout
  4. log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c]-[%p] %m%n

5.3.4. 创建User对象


 
 
  1. package com.zpc.dubbo.systemb.pojo;
  2. public class Userimplements java.io.Serializable{
  3.      private static final longserialVersionUID = - 2668999087589887337L;
  4.     privateLong id;
  5.     privateString username;
  6.     privateString password;
  7.     privateInteger age;
  8.      publicLong getId() {
  9.         returnid;
  10.     }
  11.      public voidsetId(Longid) {
  12.          this.id= id;
  13.     }
  14.      publicString getUsername() {
  15.         returnusername;
  16.     }
  17.      public voidsetUsername(Stringusername) {
  18.          this.username= username;
  19.     }
  20.      publicString getPassword() {
  21.         returnpassword;
  22.     }
  23.      public voidsetPassword(Stringpassword) {
  24.          this.password= password;
  25.     }
  26.      publicInteger getAge() {
  27.         returnage;
  28.     }
  29.      public voidsetAge(Integerage) {
  30.          this.age= age;
  31.     }
  32. }

5.3.5. 创建UserService(接口)并提供查询服务


 
 
  1. package com.zpc.dubbo.systemb.service;
  2. import com.zpc.dubbo.systemb.pojo.User;
  3. import java.util.List;
  4. public interface UserService{
  5.      /**
  6.      * 查询所有的用户数据
  7.      */
  8.     publicList<User>queryAll();
  9. }

5.3.6. 创建UserServiceImpl实现类


 
 
  1. package com.zpc.dubbo.systemb.service.impl;
  2. import com.zpc.dubbo.systemb.pojo.User;
  3. import com.zpc.dubbo.systemb.service.UserService;
  4. import java.util.ArrayList;
  5. import java.util.List;
  6. public class UserServiceImplimplements UserService{
  7.      /**
  8.      * 实现查询,这里做模拟实现,不做具体的数据库查询
  9.      */
  10.      @Override
  11.     publicList<User>queryAll() {
  12.         List<User>list = new ArrayList<User>();
  13.          for(inti = 0;i < 10;i++) {
  14.             Useruser = new User();
  15.             user.setAge( 20+ i);
  16.             user.setId(Long.valueOf(i+ 1));
  17.             user.setPassword( "123456");
  18.             user.setUsername( "username_"+ i);
  19.             list.add(user);
  20.         }
  21.         returnlist;
  22.     }
  23. }

5.3.7. 编写dubbo配置文件

dubbo-provider.xml

 

具体配置:


 
 
  1. <beansxmlns="http://www.springframework.org/schema/beans"
  2.         xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo= "http://code.alibabatech.com/schema/dubbo"
  3.         xsi:schemaLocation= "http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-4.0.xsd
  4.    http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
  5.      <!-- 提供方应用信息,用于计算依赖关系 -->
  6.      <dubbo:applicationname="dubbo-b-provider"/>
  7.      <!-- 这里使用的注册中心是zookeeper -->
  8.      <dubbo:registryaddress="zookeeper://127.0.0.1:2181"client="zkclient"/>
  9.      <!-- 用dubbo协议在20880端口暴露服务 -->
  10.      <dubbo:protocolname="dubbo"port="20880"/>
  11.      <!-- 将该接口暴露到dubbo中 -->
  12.      <dubbo:serviceinterface="com.zpc.dubbo.systemb.service.UserService"ref="userServiceImpl"/>
  13.      <!-- 将具体的实现类加入到Spring容器中 -->
  14.      <beanid="userServiceImpl"class="com.zpc.dubbo.systemb.service.impl.UserServiceImpl"/>
  15. </beans>

5.3.8. 导入zookeeper依赖


 
 
  1. <dependency>
  2. <groupId>org.apache.zookeeper </groupId>
  3. <artifactId>zookeeper </artifactId>
  4. <version>3.4.8 </version>
  5. </dependency>
  6. <dependency>
  7. <groupId>com.github.sgroschupf </groupId>
  8. <artifactId>zkclient </artifactId>
  9. <version>0.1 </version>
  10. </dependency>

5.3.9. 编写Web.xml


 
 
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <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" id="WebApp_ID" version="2.5">
  3. <display-name>dubbo-b </display-name>
  4. <context-param>
  5. <param-name>contextConfigLocation </param-name>
  6. <param-value>classpath:dubbo/dubbo-*.xml </param-value>
  7. </context-param>
  8. <!--Spring的ApplicationContext载入 -->
  9. <listener>
  10. <listener-class>org.springframework.web.context.ContextLoaderListener </listener-class>
  11. </listener>
  12.      <welcome-file-list>
  13.      <welcome-file>index.jsp </welcome-file>
  14.      </welcome-file-list>
  15. </web-app>

5.3.10. 启动tomcat

使用maven插件启动服务器:

 

查看tomcat启动日志:


 
 
  1. 2017 -11 -19 16: 49: 45, 033 [DubboZkclientConnector-SendThread( 127.0 .0 .1: 2181)] [org.apache.zookeeper.ClientCnxn]-[INFO]Opening socket connection to server 127.0 .0 .1/ 127.0 .0 .1: 2181. Will not attempt to authenticate using SASL (unknown error)
  2. 2017-11-19 16:49:45,034 [DubboZkclientConnector-SendThread(127.0.0.1:2181)] [org.apache.zookeeper.ClientCnxn]-[INFO]Socket connection established to 127.0.0.1/127.0.0.1:2181, initiating session
  3. 2017-11-19 16:49:45,035 [DubboZkclientConnector-SendThread(127.0.0.1:2181)] [org.apache.zookeeper.ClientCnxn]-[DEBUG] Session establishment request sent on 127.0.0.1/127.0.0.1:2181
  4. 2017-11-19 16:49:45,190 [DubboZkclientConnector-SendThread(127.0.0.1:2181)] [org.apache.zookeeper.ClientCnxn]-[INFO] Session establishment complete on server 127.0.0.1/127.0.0.1:2181, sessionid = 0x15fd342ea0c0000, negotiated timeout = 30000
  5. 2017 -11 -19 16: 49: 45, 191 [DubboZkclientConnector-EventThread] [org.I0Itec.zkclient.ZkClient]-[DEBUG] Received event: WatchedEvent state:SyncConnected type:None path: null
  6. 2017 -11 -19 16: 49: 45, 192 [DubboZkclientConnector-EventThread] [org.I0Itec.zkclient.ZkClient]-[INFO] zookeeper state changed (SyncConnected)
  7. 2017-11-19 16:49:45,192 [DubboZkclientConnector-EventThread] [org.I0Itec.zkclient.ZkClient]-[DEBUG] Leaving process event
  8. 2017-11-19 16:49:45,192 [DubboZkclientConnector] [org.I0Itec.zkclient.ZkClient]-[DEBUG] State is SyncConnected
  9. 2017-11-19 16:49:45,194 [localhost-startStop-1] [com.alibaba.dubbo.registry.zookeeper.ZookeeperRegistry]-[INFO]  [DUBBO]Register: dubbo://192.168.181.1:20880/com.zpc.dubbo.systemb.service.UserService?anyhost=true&application=dubbo-b-provider&dubbo=2.5.7&generic=false&interface=com.zpc.dubbo.systemb.service.UserService&methods=queryAll&pid=5564&side=provider×tamp=1511081384696, dubbo version: 2.5.7, current host: 127.0.0.1
  10. 2017-11-19 16:49:45,209 [DubboZkclientConnector-SendThread(127.0.0.1:2181)] [org.apache.zookeeper.ClientCnxn]-[DEBUG] Reading reply sessionid:0x15fd342ea0c0000, packet:: clientPath:null serverPath:null finished:false header:: 1,3  replyHeader:: 1,569,-101  request:: '/dubbo/com.zpc.dubbo.systemb.service.UserService/providers,F  response::  

可以看到,已经将UserService服务注册到zookeeper注册中心,协议采用的是dubbo。

Zookeeper控制台显示收到连接:

 

5.4. 搭建A系统(A模块)

5.4.1. 创建工程

步骤可以参照搭建B系统!A系统创建完成:

 

5.4.2. 导入依赖

A系统的pom文件:参考B系统,一模一样!

5.4.3. 配置log4j文件


 
 
  1. log4j.properties(和B系统一样配置即可):
  2. log4j.rootLogger=DEBUG,A1
  3. log4j.appender.A1=org.apache.log4j.ConsoleAppender
  4. log4j.appender.A1.layout=org.apache.log4j.PatternLayout
  5. log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c]-[%p] %m%n

5.4.4. 从B系统中拷贝User对象、UserService接口到A系统

注意是从B系统完全拷贝到A系统,包名不能改动!

 

5.4.5. 编写A系统的dubbo配置文件

dubbo-consumer.xml:


 
 
  1. <beansxmlns="http://www.springframework.org/schema/beans"
  2.         xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo= "http://code.alibabatech.com/schema/dubbo"
  3.         xsi:schemaLocation= "http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-4.0.xsd
  4.    http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
  5.      <!-- 提供方应用信息,用于计算依赖关系 -->
  6.      <dubbo:applicationname="dubbo-a-consumer"/>
  7.      <!-- 这里使用的注册中心是zookeeper -->
  8.      <dubbo:registryaddress="zookeeper://127.0.0.1:2181"client="zkclient"/>
  9.      <!-- 从注册中心中查找服务 -->
  10.      <dubbo:referenceid="userService"interface="com.zpc.dubbo.systemb.service.UserService"/>
  11. </beans>

5.4.6. 编写UserService测试用例


 
 
  1. package com.zpc.dubbotest;
  2. import com.zpc.dubbo.systemb.pojo.User;
  3. import com.zpc.dubbo.systemb.service.UserService;
  4. import org.junit.Before;
  5. import org.junit.Test;
  6. import org.springframework.context.ApplicationContext;
  7. import org.springframework.context.support.ClassPathXmlApplicationContext;
  8. import java.util.List;
  9. public class TestUserService{
  10.     privateUserService userService;
  11.      @Before
  12.      public voidsetUp()throws Exception{
  13.         ApplicationContextapplicationContext = new ClassPathXmlApplicationContext(
  14.                  "classpath:dubbo/*.xml");
  15.          this.userService= applicationContext.getBean(UserService.class);
  16.     }
  17.      @Test
  18.      public voidtestQueryAll() {
  19.         List<User>users = this.userService.queryAll();
  20.          for(Useruser :users) {
  21.             System.out.println(user);
  22.         }
  23.     }
  24. }

5.4.7. 查看效果

(重写了User的toString方法!)

把zookeeper、B系统运行起来,再运行A系统的测试用例:

 

可以看到,已经查询到10条数据,那么,也就是说A系统通过B系统提供的服务获取到了数据。

5.5. 解决代码重复问题

通过刚刚的示例我们可以发现,其中User对象和UserService在A系统和B系统中都使用,那么,我们是否应该将该代码复用,而不用硬拷贝?

答案是肯定的。

在使用dubbo时,provider需要将提供服务所需要的java代码(bean、interface等)单独打包成jar提供给consumer使用。

5.5.1. 创建dubbo_systemB_api模块

5.5.2. 将systemB中的pojo和service接口剪切到dubbo-systemB-api中

注意:B系统和A系统的pojo与service接口全部删除,全部直接依赖dubbo-systemB-api!

5.5.3. 在systemB的pom.xml文件中添加dubbo-systemB-api的依赖,并且将pojo与service接口删除

<


 
 
  1. dependency>
  2.      <groupId>cn.com.zpc </groupId>
  3.      <artifactId>dubbo_systemB_api </artifactId>
  4.      <version>1.0-SNAPSHOT </version>
  5. </dependency>

修改dubbo-provider.xml

<


 
 
  1. !-- 将该接口暴露到dubbo中 -->
  2. <dubbo:serviceinterface= "com.zpc.systemb.api.service.UserService" ref= "userServiceImpl"/>

5.5.4. 在systemA的pom.xml文件中添加dubbo-systemB-api的依赖,并且将pojo与service接口删除

<


 
 
  1. dependency>
  2.      <groupId>cn.com.zpc </groupId>
  3.      <artifactId>dubbo_systemB_api </artifactId>
  4.      <version>1.0-SNAPSHOT </version>
  5. </dependency>

修改dubbo-consumer.xml


 
 
  1. <!-- 从注册中心中查找服务 -->
  2. <dubbo:referenceid="userService"interface="com.zpc.systemb.api.service.UserService"/>

 

此时目录结构如下(只有api包中保留接口和pojo类定义):

 

5.5.5. 测试

测试之前先rebuild项目!

 

依次启动zookeeper和系统B,再运行系统A中的测试用例!

 

测试,发现,和之前实现一样。

 

其实也可以把接口保留B系统中(毕竟B系统提供的服务嘛)。然后在A系统中直接依赖B系统的jar包即可。

6. 管理界面

dubbo提供了一套在线管理整个服务的功能,管理控制台为阿里内部裁剪版本,开源部分主要包含:路由规则,动态配置,服务降级,访问控制,权重调整,负载均衡,等管理功能。

6.1. 安装

将dubbo-admin-2.5.7.war部署到tomcat的webapps目录下的ROOT目录里:

 

6.2. 修改配置文件

 

6.3. 启动tomcat

 

 

 

6.4. 查看管理界面

使用如下用户登录(密码和用户名一致,如root/root):

 

登录http://127.0.0.1:8080/

Tomcat端口未必是8080,看自己怎么配的。

效果:

 

 

功能:

 

 

提供者:

消费者:

 

应用:

 

 

7. dubbo的配置详解

7.1. <dubbo:protocol/>

服务提供者协议配置:
配置类:com.alibaba.dubbo.config.ProtocolConfig
说明:如果需要支持多协议,可以声明多个<dubbo:protocol>标签,并在<dubbo:service>中通过protocol属性指定使用的协议。

标签

属性

对应URL参数

类型

是否必填

缺省值

作用

描述

兼容性

<dubbo:protocol>

id

 

string

可选

dubbo

配置关联

协议BeanId,可以在<dubbo:service protocol="">中引用此ID,如果ID不填,缺省和name属性值一样,重复则在name后加序号。

2.0.5以上版本

<dubbo:protocol>

name

<protocol>

string

必填

dubbo

性能调优

协议名称

2.0.5以上版本

<dubbo:protocol>

port

<port>

int

可选

dubbo协议缺省端口为20880,rmi协议缺省端口为1099,http和hessian协议缺省端口为80 
如果配置为-1 或者 没有配置port,则会分配一个没有被占用的端口。Dubbo 2.4.0+,分配的端口在协议缺省端口的基础上增长,确保端口段可控。

服务发现

服务端口

2.0.5以上版本

<dubbo:protocol>

host

<host>

string

可选

自动查找本机IP

服务发现

-服务主机名,多网卡选择或指定VIP及域名时使用,为空则自动查找本机IP,-建议不要配置,让Dubbo自动获取本机IP

2.0.5以上版本

<dubbo:protocol>

threadpool

threadpool

string

可选

fixed

性能调优

线程池类型,可选:fixed/cached

2.0.5以上版本

<dubbo:protocol>

threads

threads

int

可选

100

性能调优

服务线程池大小(固定大小)

2.0.5以上版本

<dubbo:protocol>

iothreads

threads

int

可选

cpu个数+1

性能调优

io线程池大小(固定大小)

2.0.5以上版本

<dubbo:protocol>

accepts

accepts

int

可选

0

性能调优

服务提供方最大可接受连接数

2.0.5以上版本

<dubbo:protocol>

payload

payload

int

可选

88388608(=8M)

性能调优

请求及响应数据包大小限制,单位:字节

2.0.5以上版本

<dubbo:protocol>

codec

codec

string

可选

dubbo

性能调优

协议编码方式

2.0.5以上版本

<dubbo:protocol>

serialization

serialization

string

可选

dubbo协议缺省为hessian2,rmi协议缺省为java,http协议缺省为json

性能调优

协议序列化方式,当协议支持多种序列化方式时使用,比如:dubbo协议的dubbo,hessian2,java,compactedjava,以及http协议的json等

2.0.5以上版本

<dubbo:protocol>

accesslog

accesslog

string/boolean

可选

 

服务治理

设为true,将向logger中输出访问日志,也可填写访问日志文件路径,直接把访问日志输出到指定文件

2.0.5以上版本

<dubbo:protocol>

path

<path>

string

可选

 

服务发现

提供者上下文路径,为服务path的前缀

2.0.5以上版本

<dubbo:protocol>

transporter

transporter

string

可选

dubbo协议缺省为netty

性能调优

协议的服务端和客户端实现类型,比如:dubbo协议的mina,netty等,可以分拆为server和client配置

2.0.5以上版本

<dubbo:protocol>

server

server

string

可选

dubbo协议缺省为netty,http协议缺省为servlet

性能调优

协议的服务器端实现类型,比如:dubbo协议的mina,netty等,http协议的jetty,servlet等

2.0.5以上版本

<dubbo:protocol>

client

client

string

可选

dubbo协议缺省为netty

性能调优

协议的客户端实现类型,比如:dubbo协议的mina,netty等

2.0.5以上版本

<dubbo:protocol>

dispatcher

dispatcher

string

可选

dubbo协议缺省为all

性能调优

协议的消息派发方式,用于指定线程模型,比如:dubbo协议的all, direct, message, execution, connection等

2.1.0以上版本

<dubbo:protocol>

queues

queues

int

可选

0

性能调优

线程池队列大小,当线程池满时,排队等待执行的队列大小,建议不要设置,当线程程池时应立即失败,重试其它服务提供机器,而不是排队,除非有特殊需求。

2.0.5以上版本

<dubbo:protocol>

charset

charset

string

可选

UTF-8

性能调优

序列化编码

2.0.5以上版本

<dubbo:protocol>

buffer

buffer

int

可选

8192

性能调优

网络读写缓冲区大小

2.0.5以上版本

<dubbo:protocol>

heartbeat

heartbeat

int

可选

0

性能调优

心跳间隔,对于长连接,当物理层断开时,比如拔网线,TCP的FIN消息来不及发送,对方收不到断开事件,此时需要心跳来帮助检查连接是否已断开

2.0.10以上版本

<dubbo:protocol>

telnet

telnet

string

可选

 

服务治理

所支持的telnet命令,多个命令用逗号分隔

2.0.5以上版本

<dubbo:protocol>

register

register

boolean

可选

true

服务治理

该协议的服务是否注册到注册中心

2.0.8以上版本

<dubbo:protocol>

contextpath

contextpath

String

可选

缺省为空串

服务治理

 

2.0.6以上版本

 

7.2. 协议

dubbo提供的协议有:

 

7.2.1. dubbo://

Dubbo缺省协议采用单一长连接和NIO异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况。

Dubbo缺省协议不适合传送大数据量的服务,比如传文件,传视频等,除非请求量很低。

配置:

 

执行过程:

 

默认连接:

限制最大连接:

 

7.3. <dubbo:registry/>

注册中心配置:

配置类:com.alibaba.dubbo.config.RegistryConfig

说明:如果有多个不同的注册中心,可以声明多个<dubbo:registry>标签,并在<dubbo:service>或<dubbo:reference>的registry属性指定使用的注册中心。

 

标签

属性

对应URL参数

类型

是否必填

缺省值

作用

描述

兼容性

<dubbo:registry>

id

 

string

可选

 

配置关联

注册中心引用BeanId,可以在<dubbo:service registry="">或<dubbo:reference registry="">中引用此ID

1.0.16以上版本

<dubbo:registry>

address

<host:port>

string

必填

 

服务发现

注册中心服务器地址,如果地址没有端口缺省为9090,同一集群内的多个地址用逗号分隔,如:ip:port,ip:port,不同集群的注册中心,请配置多个<dubbo:registry>标签

1.0.16以上版本

<dubbo:registry>

protocol

<protocol>

string

可选

dubbo

服务发现

注同中心地址协议,支持dubbo, http, local三种协议,分别表示,dubbo地址,http地址,本地注册中心

2.0.0以上版本

<dubbo:registry>

port

<port>

int

可选

9090

服务发现

注册中心缺省端口,当address没有带端口时使用此端口做为缺省值

2.0.0以上版本

<dubbo:registry>

username

<username>

string

可选

 

服务治理

登录注册中心用户名,如果注册中心不需要验证可不填

2.0.0以上版本

<dubbo:registry>

password

<password>

string

可选

 

服务治理

登录注册中心密码,如果注册中心不需要验证可不填

2.0.0以上版本

<dubbo:registry>

transport

registry.transporter

string

可选

netty

性能调优

网络传输方式,可选mina,netty

2.0.0以上版本

<dubbo:registry>

timeout

registry.timeout

int

可选

5000

性能调优

注册中心请求超时时间(毫秒)

2.0.0以上版本

<dubbo:registry>

session

registry.session

int

可选

60000

性能调优

注册中心会话超时时间(毫秒),用于检测提供者非正常断线后的脏数据,比如用心跳检测的实现,此时间就是心跳间隔,不同注册中心实现不一样。

2.1.0以上版本

<dubbo:registry>

file

registry.file

string

可选

 

服务治理

使用文件缓存注册中心地址列表及服务提供者列表,应用重启时将基于此文件恢复,注意:两个注册中心不能使用同一文件存储

2.0.0以上版本

<dubbo:registry>

wait

registry.wait

int

可选

0

性能调优

停止时等待通知完成时间(毫秒)

2.0.0以上版本

<dubbo:registry>

check

check

boolean

可选

true

服务治理

注册中心不存在时,是否报错

2.0.0以上版本

<dubbo:registry>

register

register

boolean

可选

true

服务治理

是否向此注册中心注册服务,如果设为false,将只订阅,不注册

2.0.5以上版本

<dubbo:registry>

subscribe

subscribe

boolean

可选

true

服务治理

是否向此注册中心订阅服务,如果设为false,将只注册,不订阅

2.0.5以上版本

<dubbo:registry>

dynamic

dynamic

boolean

可选

true

服务治理

服务是否动态注册,如果设为false,注册后将显示后disable状态,需人工启用,并且服务提供者停止时,也不会自动取消册,需人工禁用。

2.0.5以上版本

7.4. 注册中心

7.4.1. zookeeper注册中心

 

原理:

 

流程说明:

l 服务提供者启动时

n 向/dubbo/com.foo.BarService/providers目录下写入自己的URL地址。

l 服务消费者启动时

n 订阅/dubbo/com.foo.BarService/providers目录下的提供者URL地址。

n 并向/dubbo/com.foo.BarService/consumers目录下写入自己的URL地址。

l 监控中心启动时

n 订阅/dubbo/com.foo.BarService目录下的所有提供者和消费者URL地址。

 

支持以下功能:

l 当提供者出现断电等异常停机时,注册中心能自动删除提供者信息。

l 当注册中心重启时,能自动恢复注册数据,以及订阅请求。

l 当会话过期时,能自动恢复注册数据,以及订阅请求。

l 当设置<dubbo:registry check="false" />时,记录失败注册和订阅请求,后台定时重试。

l 可通过<dubbo:registry username="admin" password="1234" />设置zookeeper登录信息。

l 可通过<dubbo:registry group="dubbo" />设置zookeeper的根节点,不设置将使用无根树。

l 支持*号通配符<dubbo:reference group="*" version="*" />,可订阅服务的所有分组和所有版本的提供者。

zkClient的使用:

 

 

 

 

推荐 spring cloud 微服务教程:

https://blog.csdn.net/hellozpc/article/details/84144453

https://blog.csdn.net/hellozpc/article/details/83692496

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值