目录
4.可能会遇到的问题(解决Dubbo无法发布被事务代理的Service问题 )
1. Dubbo概述
1.1 Dubbo简介
Apache Dubbo 是一款高性能的 Java RPC 框架。其前身是阿里巴巴公司开源的、轻量级的开源 Java RPC 框架,可以和 Spring 框架无缝集成, 2018 年阿里巴巴把这个框架捐献给了 apache 基金会 .
Dubbo 官网地址: http://dubbo.apache.org
Dubbo 提供了三大核心能力:
- 面向接口的远程方法调用
- 智能容错和负载均衡
- 以及服务自动注册和发现
1.2 Dubbo架构
图片来源于网络.
虚线都是异步访问,实线都是同步访问 蓝色虚线 : 在启动时完成的功能蓝色虚线 ( 实线 ) 都是程序运行过程中执行的功能 .
节点角色说明:
节点 |
角色名称 |
---|---|
Provider |
暴露服务的服务提供方 |
Consumer |
调用远程服务的服务消费方 |
Registry |
服务注册与发现的注册中心 |
Monitor |
统计服务的调用次数和调用时间的监控中心 |
Container |
服务运行容器 |
调用关系说明 :
2. Zookeeper(服务注册中心)
通过前面的Dubbo架构图可以看到,Registry(服务注册中心)在其中起着至关重要的作用。Dubbo官 方推荐使用Zookeeper作为服务注册中心。
2.1 Zookeeper介绍
Zookeeper 是 Apache Hadoop 的子项目,是一个树型的目录服务,支持变更推送,适合作为 Dubbo服务的注册中心,工业强度较高,可用于生产环境,并推荐使用 。 为了便于理解 Zookeeper 的树型目录服务,我们先来看一下我们电脑的文件系统 ( 也是一个树型目录结 构 ) :
我的电脑可以分为多个盘符(例如 C 、 D 、 E 等),每个盘符下可以创建多个目录,每个目录下面可以创建文件,也可以创建子目录,最终构成了一个树型结构。通过这种树型结构的目录,我们可以将文件分 门别类的进行存放,方便我们后期查找,而且磁盘上的每个文件都有一个唯一的访问路径.
Zookeeper树型目录服务:
流程说明:
- 服务提供者(Provider)启动时: 向 /dubbo/com.foo.BarService/providers 目录下写入自己的URL 地址
- 服务消费者(Consumer)启动时: 订阅 /dubbo/com.foo.BarService/providers 目录下的提供者 URL 地址。并向 /dubbo/com.foo.BarService/consumers 目录下写入自己的 URL 地址
- 监控中心(Monitor)启动时: 订阅 /dubbo/com.foo.BarService 目录下的所有提供者和消费者 URL 地址
2.2 安装Zookeeper
下载地址:http://archive.apache.org/dist/zookeeper/
Zookeeper 版本为 3.4.6 ,下载完成后可以获得名称为 zookeeper-3.4.6.tar.gz 的压缩文
件。
安装步骤:
2.3 Zookeeper基本指令
进入Zookeeper的bin目录,启动服务命令
./zkServer.sh start
停止服务命令
./zkServer.sh stop
查看服务状态:
./zkServer.sh status
客户端连接
./zkCli.sh
3. Dubbo入门案例
3.1 服务提供方开发
3.1.1 项目整体架构
3.1.2 各个部分代码
maven
applicationContext-service.xml
HelloService
HelloServiceImpl
3.2 服务消费方开发
3.2.1 项目整体架构
maven
applicationContext-web.xml
web.xml
HelloController
HelloService
3.3 启动并测试
首先启动zookeeper
然后启动 provider
最后启动 consumer
使用浏览器 访问
localhost:8082/demo/hello?name=csh
出现结果
证明 测试成功
4.可能会遇到的问题(解决Dubbo无法发布被事务代理的Service问题 )
4.1 错误场景
连接的数据库 了,且在Service层上加入 @Transactional 注解
4.2 错误提示
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.NullPointerException org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:982) org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:866) javax.servlet.http.HttpServlet.service(HttpServlet.java:621) org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:851) javax.servlet.http.HttpServlet.service(HttpServlet.java:728) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
4.3 解决办法
4.3.1 步骤一
修改applicationContext-service.xml配置文件,开启事务控制注解支持时指定proxy-target-class
属性,值为true。其作用是使用cglib代理方式为Service类创建代理对象
4.3.2 步骤二
修改HelloServiceImpl类,在Service注解中加入interfaceClass属性,值为HelloService.class,
作用是指定服务的接口类型
4.3.3 测试
问题得到成功解决