dubbo(入门级别使用)

dubbo(入门级别使用),第1张

dubbo(入门级别使用)

目录

1. Dubbo概述

1.1 Dubbo简介

1.2 Dubbo架构

2. Zookeeper(服务注册中心)

2.1 Zookeeper介绍

2.2 安装Zookeeper

2.3 Zookeeper基本指令

3. Dubbo入门案例

3.1 服务提供方开发

3.1.1 项目整体架构

3.1.2 各个部分代码

3.2 服务消费方开发

 3.3 启动并测试

4.可能会遇到的问题(解决Dubbo无法发布被事务代理的Service问题 )

4.1 错误场景

4.2 错误提示

4.3 解决办法


1. Dubbo概述 1.1 Dubbo简介   Apache Dubbo 是一款高性能的 Java RPC 框架。其前身是阿里巴巴公司开源的、轻量级的开源 Java RPC 框架,可以和 Spring 框架无缝集成, 2018 年阿里巴巴把这个框架捐献给了 apache 基金会 . Dubbo 官网地址: http://dubbo.apache.org Dubbo 提供了三大核心能力:
  • 面向接口的远程方法调用
  • 智能容错和负载均衡
  • 以及服务自动注册和发现
1.2 Dubbo架构

图片来源于网络.

虚线都是异步访问,实线都是同步访问 蓝色虚线 : 在启动时完成的功能蓝色虚线 ( 实线 ) 都是程序运行过程中执行的功能 .

节点角色说明: Dubbo架构 节点 角色名称 Provider 暴露服务的服务提供方 Consumer 调用远程服务的服务消费方 Registry 服务注册与发现的注册中心 Monitor 统计服务的调用次数和调用时间的监控中心 Container 服务运行容器 调用关系说明 :
0. 服务容器负责启动,加载,运行服务提供者。 1. 服务提供者在启动时,向注册中心注册自己提供的服务。 2. 服务消费者在启动时,向注册中心订阅自己所需的服务。 3. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。 4. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失 败,再选另一台调用。 5. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
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 的压缩文 件。

 安装步骤:

第一步:安装 jdk (略) 第二步:把 zookeeper 的压缩包( zookeeper-3.4.6.tar.gz )上传到 linux 系 统 第三步:解压缩压缩包 tar -zxvf zookeeper-3.4.6.tar.gz -C /usr 第四步:进入 zookeeper-3.4.6 目 录,创建 data 目录 mkdir data 第五步:进入 conf 目录 , 把 zoo_sample.cfg 改名为 zoo.cfg cd conf mv zoo_sample.cfg zoo.cfg 第六步:打开 zoo.cfg 文件 , 修改 data 属性: dataDir=/usr/zookeeper- 3.4.6/data
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



    4.0.0

    com.csh
    provider
    1.0-SNAPSHOT
    war

    
        UTF-8
        1.8
        1.8
        5.0.5.RELEASE
    
    
        
            org.springframework
            spring-context
            ${spring.version}
        
        
            org.springframework
            spring-beans
            ${spring.version}
        
        
            org.springframework
            spring-webmvc
            ${spring.version}
        
        
            org.springframework
            spring-jdbc
            ${spring.version}
        
        
            org.springframework
            spring-aspects
            ${spring.version}
        
        
            org.springframework
            spring-jms
            ${spring.version}
        
        
            org.springframework
            spring-context-support
            ${spring.version}
         
        
            com.alibaba
            dubbo
            2.6.0
        
        
            org.apache.zookeeper
            zookeeper
            3.4.7
        
        
            com.github.sgroschupf
            zkclient
            0.1
        
        
            javassist
            javassist
            3.12.1.GA
        
        
            com.alibaba
            fastjson
            1.2.47
        
    
    
        
            
                org.apache.maven.plugins
                maven-compiler-plugin
                2.3.2
                
                    1.8
                    1.8
                
            
            
                org.apache.tomcat.maven
                tomcat7-maven-plugin
                2.2
                 
                    8081 
                    /
                
            
        
    

applicationContext-service.xml



    
    
    
    
    
    
    
    
HelloService 
public interface HelloService {

    public String sayHello(String name);
}

HelloServiceImpl

@Service
public class HelloServiceImpl implements HelloService {
    @Override
    public String sayHello(String name) {
        return "Hello : "+name;
    }
}

 

3.2 服务消费方开发

3.2.1 项目整体架构

maven



    4.0.0

    com.csh
    consumer
    1.0-SNAPSHOT
    war

    
        UTF-8
        1.8
        1.8
        5.0.5.RELEASE
    
    
        
            org.springframework
            spring-context
            ${spring.version}
        
        
            org.springframework
            spring-beans
            ${spring.version}
        
        
            org.springframework
            spring-webmvc
            ${spring.version}
        
        
            org.springframework
            spring-jdbc
            ${spring.version}
        
        
            org.springframework
            spring-aspects
            ${spring.version}
        
        
            org.springframework
            spring-jms
            ${spring.version}
        
        
            org.springframework
            spring-context-support
            ${spring.version}
         
        
            com.alibaba
            dubbo
            2.6.0
        
        
            org.apache.zookeeper
            zookeeper
            3.4.7
        
        
            com.github.sgroschupf
            zkclient
            0.1
        
        
            javassist
            javassist
            3.12.1.GA
        
        
            com.alibaba
            fastjson
            1.2.47
        
    
    
        
            
                org.apache.maven.plugins
                maven-compiler-plugin
                2.3.2
                
                    1.8
                    1.8
                
            
            
                org.apache.tomcat.maven
                tomcat7-maven-plugin
                2.2
                 
                    8082 
                    /
                
            
        
    

applicationContext-web.xml



    
    
    
    




    
    

web.xml 



    Archetype Created Web Application
    
        contextConfigLocation
        classpath:applicationContext*.xml
    
    
        org.springframework.web.context.ContextLoaderListener
    .
   
       SpringMVC
        org.springframework.web.servlet.DispatcherServlet
       
           contextConfigLocation
           classpath:applicationContext-web.xml
       
   
    
        SpringMVC
        /
    

 

HelloController

@RestController
@RequestMapping("/demo")
public class HelloController {
    @Reference
    private HelloService helloService;

    @RequestMapping("/hello")
    public String sayHello(String name){
        String result = helloService.sayHello(name);
        System.out.println(result);
        return  result;
    }
}

 

HelloService

public interface HelloService {

    public String sayHello(String name);
}

 

 3.3 启动并测试

首先启动zookeeper

./zkServer.sh start   //启动zookeeper

./zkCli.sh                //与客户端连接

然后启动 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类创建代理对象

 

class="true"/>

4.3.2 步骤二

  修改HelloServiceImpl类,在Service注解中加入interfaceClass属性,值为HelloService.class,

作用是指定服务的接口类型

@Service(interfaceClass = HelloService.class)

@Transactional

  public class HelloServiceImpl implements HelloService {

   public String sayHello(String name) {

          return "hello " + name;

}

4.3.3 测试 问题得到成功解决

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5698630.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存