zoukankan      html  css  js  c++  java
  • dubbo项目实战代码展示

    最近公司项目使用dubbo服务,于是就去网上搜索关于dubbo的相关资料,真的很多,但是对于很多人并不是很了解框架或者

    不是太适合新手的片段代码,于是我就根据项目的相关内容把dubbo部分单独切出来,所有代码可以运行。推荐先看一下

    dubbo的一篇文章http://doc.okbase.net/congcong68/archive/112508.html 。

    dubbo的介绍网上已经有很多了,我就不介绍它是什么了,我主要介绍怎么在项目中使用,怎么让一个小白会在项目中运用起

    来,就像买一辆汽车,你肯定是先让他跑起来,不会先把所有组件拆开来看看是怎么安装的吧。(如果你是,那么恭喜你,你

    已经是大神了),文字内容比较肤浅,适合初学者,如果有不当的地方欢迎指出来,留言

    下面我就介绍一下我的项目结构

      整个项目结构分为3个部分,dubbo-client 是消费者或者是调用方的代码(可以理解你自己的代码),dubbo-service存放的是

    dubbo的对外接口,只是接口的定义和基础实体类已经一些公共工具类,如果你想做的更细,可以把基础实体类和公共工具类

    提取出来放在dubbo-domain中,dubbo-web存放的是dubbo的对外接口的实现和dubbo的生产者的配置信息。

    那我们就开始对每个模块单独解释,首先从最基础的dubbo-service模块解释,一层层往上。

    这里我定一个一个User实体类,用于存放用户基本信息,一个返回结果集的封装类(可根据自己项目需求而定,不是必须要

    有),最后定义一个接口UserService.java和平常的接口并没有什么差异,看下具体内容

    [java] view plain copy
     
    1. package com.lwl.dubbo.service;  
    2.   
    3. import com.lwl.dubbo.domain.User;  
    4. import com.lwl.dubbo.rpc.RPCResponse;  
    5. /** 
    6.  * 用户的接口 
    7.  * @author Administrator 
    8.  * @create 2016-8-9 下午2:42:56 
    9.  * @version 1.0 
    10.  */  
    11. public interface UserService {  
    12.   
    13.     /** 
    14.      * 正常调用 
    15.      * @param id 
    16.      * @return 
    17.      * @author Administrator 
    18.      * @create 2016-8-9 上午10:16:50 
    19.      */  
    20.     public RPCResponse<User> findUserById(long id);  
    21.       
    22.     /** 
    23.      * 调用该方法会抛出异常 
    24.      * @return 
    25.      * @author Administrator 
    26.      * @create 2016-8-9 上午10:17:33 
    27.      */  
    28.     public RPCResponse<User> findUserThrowsException();  
    29.       
    30. }  

    定义了2个接口方法,第一个方法是根据ID 获取用户信息,第二个方法比较特殊,因为我在实现的时候是让他直接抛出异常,

    这样比较更加有代表性。好了,dubbo-service这个项目已经结束了,如果你需要更多的接口,请自行添加即可。然后把这项目

    maven打包成JAR包供dubbo-web和dubbo-client依赖。

    那接下来我们就要让dubbo服务先启起来,开启dubbo-web的项目,首先介绍一下dubbo-web的项目结构

    dubbo-web的结构要比dubbo-service复杂一点,但是对于已经开发过J2EE的各位看客来说,这个其实很简单的。还记得上一

    个dubbo-service项目的完成之后我们把他打包成一个JAR包了嘛,这时候我们就有使用这个JAR了,在pom文件中引入这个文

    件即可。

    然后UserServiceImpl实现dubbo-service接口中的UserService.java接口,接下来就是UserDao和UserDaoImpl这2个和数据库打

    交道的类了,但是我为了项目整洁去除了和数据库的交流,如果看客需要则自行添加即可。

    那我们看下UserServiceImpl.java干了什么事情呢?

    [java] view plain copy
     
    1. package com.lwl.dubbo.service.impl;  
    2.   
    3.   
    4. import javax.annotation.Resource;  
    5.   
    6. import org.springframework.stereotype.Service;  
    7.   
    8. import com.lwl.dubbo.dao.UserDao;  
    9. import com.lwl.dubbo.domain.User;  
    10. import com.lwl.dubbo.rpc.RPCResponse;  
    11. import com.lwl.dubbo.service.UserService;  
    12.   
    13. @Service("userService")  
    14. public class UserServiceImpl implements UserService {  
    15.   
    16.     @Resource(name="userDao")  
    17.     private UserDao userDao;  
    18.       
    19.     @Override  
    20.     public RPCResponse<User> findUserById(long id) {  
    21.         //这里使用封装类,而不是DAO继续使用封装类,是为了DAO层更好的复用起来  
    22.         RPCResponse<User> response = new RPCResponse<User>();  
    23.         try {  
    24.             //DAO层和我们之前开发的模式一样,没有使用封装类  
    25.             User result = userDao.findUserById(id);  
    26.             response.setResult(result);  
    27.         } catch (Exception e) {  
    28.             e.printStackTrace();  
    29.             response.setSuccess(false);  
    30.             response.setErrorMessage(e.getMessage());  
    31.         }  
    32.           
    33.         return response;  
    34.     }  
    35.   
    36.     //调用这个方法 会抛出异常  
    37.     @Override  
    38.     public RPCResponse<User> findUserThrowsException() {  
    39.         RPCResponse<User> response = new RPCResponse<User>();  
    40.         try {  
    41.             User result = userDao.findUserThrowsException();  
    42.             response.setResult(result);  
    43.         } catch (Exception e) {  
    44.             e.printStackTrace();  
    45.             response.setSuccess(false);  
    46.             response.setErrorMessage(e.getMessage());  
    47.         }  
    48.         return response;  
    49.     }  
    50.   
    51. }  

    看到这个类调用了DAO层的接口,但是DAO层并没有使用封装类,这是因为为了更好的复用DAO层的代码,所有就在接口实

    现层做封装。

    那DAO层的实现层是怎么实现的呢?

    [java] view plain copy
     
    1. package com.lwl.dubbo.dao.impl;  
    2.   
    3. import org.springframework.stereotype.Repository;  
    4.   
    5. import com.lwl.dubbo.dao.UserDao;  
    6. import com.lwl.dubbo.domain.User;  
    7. /** 
    8.  * DAO数据层操作 
    9.  * @author Administrator 
    10.  * @create 2016-8-9 上午10:30:03 
    11.  * @version 1.0 
    12.  */  
    13. @Repository("userDao")  
    14. public class UserDaoImpl implements UserDao {  
    15.   
    16.     /** 
    17.      * 通过模拟数据库数据,返回结果 
    18.      *      看客可以根据自己需要 从数据库获取数据然后返回 
    19.      * @param id 
    20.      * @return 
    21.      * @author Administrator 
    22.      * @create 2016-8-9 上午10:31:34 
    23.      */  
    24.     @Override  
    25.     public User findUserById(long id) {  
    26.         User info = new User();  
    27.         info.setId(id);  
    28.         info.setEmail("xxxxxxxxxx@163.com");  
    29.         info.setMobile("13844445555");  
    30.         info.setUsername("宇宙最帅");  
    31.         info.setPassword("12345600");  
    32.         return info;  
    33.     }  
    34.   
    35.     @Override  
    36.     public User findUserThrowsException() {  
    37.         //让程序出错,便于返回测试  
    38.         int i = 1/0;  
    39.         System.out.println(i);  
    40.         return null;  
    41.     }  
    42.   
    43. }  

    和想像的一样吧,就是我们平常开发中的那些代码,并没有什么特殊。

    好了代码都写完了,接下来才是重点,怎么让他和dubbo服务有关联,首先当然要引入dubbo的jar包,然后在给服务添加配置

    文件。

    下面是dubbo的配置文件dubbo_config.xml

    [html] view plain copy
     
    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <beans xmlns="http://www.springframework.org/schema/beans"  
    3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    4.        xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"  
    5.        xsi:schemaLocation="http://www.springframework.org/schema/beans  
    6.          http://www.springframework.org/schema/beans/spring-beans.xsd  
    7.          http://code.alibabatech.com/schema/dubbo  
    8.          http://code.alibabatech.com/schema/dubbo/dubbo.xsd">  
    9.   
    10.     <!--   
    11.       dubbo:registry 标签一些属性的说明:  
    12.           1)register是否向此注册中心注册服务,如果设为false,将只订阅,不注册。  
    13.           2)check注册中心不存在时,是否报错。  
    14.           3)subscribe是否向此注册中心订阅服务,如果设为false,将只注册,不订阅。  
    15.           4)timeout注册中心请求超时时间(毫秒)。  
    16.           5)address可以Zookeeper集群配置,地址可以多个以逗号隔开等。  
    17.      dubbo:service标签的一些属性说明:  
    18.          1)interface服务接口的路径  
    19.          2)ref引用对应的实现类的Bean的ID  
    20.          3)registry向指定注册中心注册,在多个注册中心时使用,值为<dubbo:registry>的id属性,多个注册中心ID用逗号分隔,如果不想将该服务注册到任何registry,可将值设为N/A  
    21.          4)register 默认true ,该协议的服务是否注册到注册中心。  
    22.      -->  
    23.        
    24.     <!-- 提供方应用信息,用于计算依赖关系 -->  
    25.     <dubbo:application name="dobbu-web"/>  
    26.     <dubbo:registry address="N/A"/>  
    27.     <!-- 用dubbo协议在20880端口暴露服务 -->  
    28.     <dubbo:protocol name="dubbo" port="20880"/>  
    29.     <!-- 等待时间,重试2次 -->  
    30.     <dubbo:provider timeout="120000" retries="0"/>  
    31.     <!-- 启动时不检查消费者 -->  
    32.     <dubbo:consumer check="false" timeout="120000" retries="0" lazy="true"/>  
    33.   
    34.     <!-- 基础信息 -->  
    35.     <dubbo:service ref="userService"  
    36.                    interface="com.lwl.dubbo.service.UserService"/>  
    37.                      
    38.                      
    39. </beans>  

    每个都有注释,如果对dubbo的标签不是很明白的看客,可以看看本文一开始推荐的那篇文章看看。

    接下里就是在applicationContext.xml文件中引入dubbo的配置文件即可:

    <import resource="classpath:dubbo_config.xml"/>

    好了,dubbo-web的开发已经完成了,现在运行一下,如果没有问题就打包成WAR包,发布服务吧!

    最后一个dubbo-client项目了,然后你发布服务了,肯定要有人来订阅吧,就好像你在卖东西,没有人来你这里买,你是不是很

    不开心啊。所以服务起来了,我们就要利用起来。

    dubbo-client项目看上去和平常项目没什么区别,只是多了一个dubbo的配置文件,用于订阅dubbo服务而已,当然dubbo-clien

    t项目也要依赖dubbo的JAR 和 dubbo-service ,将这2个添加到pom文件中。

    来我们先看一下项目的结构

    项目的关键至于dubbo-config配置文件,该文件告诉你订阅了哪些接口和哪个dubbo服务。项目主要有一个控制器和前端返回封装类,各自的代码是:

    [java] view plain copy
     
    1. package com.lwl.dubbo.controller;  
    2.   
    3. import javax.annotation.Resource;  
    4.   
    5. import org.springframework.stereotype.Controller;  
    6. import org.springframework.web.bind.annotation.RequestMapping;  
    7. import org.springframework.web.bind.annotation.RequestMethod;  
    8. import org.springframework.web.bind.annotation.ResponseBody;  
    9.   
    10. import com.lwl.dubbo.domain.User;  
    11. import com.lwl.dubbo.respone.ResultRespone;  
    12. import com.lwl.dubbo.rpc.RPCResponse;  
    13. import com.lwl.dubbo.service.UserService;  
    14.   
    15. @Controller  
    16. @RequestMapping("/user")  
    17. public class UserController {  
    18.   
    19.     @Resource(name="userService")  
    20.     private UserService userService;  
    21.       
    22.     @ResponseBody  
    23.     @RequestMapping(value="/id",method=RequestMethod.POST)  
    24.     public ResultRespone findUserById(long id){  
    25.         ResultRespone respone = new ResultRespone();  
    26.          RPCResponse<User>  result = userService.findUserById(id);  
    27.          if(result.isSuccess()){  
    28.              respone.setData(result.getResult());  
    29.          }else{  
    30.              respone.setSuccess(false);  
    31.              respone.setMsg(result.getErrorMessage());  
    32.          }  
    33.         return respone;  
    34.     }  
    35.       
    36.     @ResponseBody  
    37.     @RequestMapping(value="/exception",method=RequestMethod.POST)  
    38.     public ResultRespone findUserThrowsException(){  
    39.         ResultRespone respone = new ResultRespone();  
    40.          RPCResponse<User>  result = userService.findUserThrowsException();  
    41.          if(result.isSuccess()){  
    42.              respone.setData(result.getResult());  
    43.          }else{  
    44.              respone.setSuccess(false);  
    45.              respone.setMsg(result.getErrorMessage());  
    46.          }  
    47.         return respone;  
    48.     }  
    49.       
    50. }  

    [java] view plain copy
     
    1. package com.lwl.dubbo.respone;  
    2. /** 
    3.  * 用于将结果集返回给前端 
    4.  * @author Administrator 
    5.  * @create 2016-8-9 下午12:21:24 
    6.  * @version 1.0 
    7.  */  
    8. public class ResultRespone {  
    9.   
    10.       
    11.     private boolean success = true;//是否成功  
    12.       
    13.     private String msg;//错误信息或者提示信息  
    14.       
    15.     private Object data;//数据结果集  
    16.   
    17.     public boolean isSuccess() {  
    18.         return success;  
    19.     }  
    20.   
    21.     public void setSuccess(boolean success) {  
    22.         this.success = success;  
    23.     }  
    24.   
    25.     public String getMsg() {  
    26.         return msg;  
    27.     }  
    28.   
    29.     public void setMsg(String msg) {  
    30.         this.msg = msg;  
    31.     }  
    32.   
    33.     public Object getData() {  
    34.         return data;  
    35.     }  
    36.   
    37.     public void setData(Object data) {  
    38.         this.data = data;  
    39.     }  
    40.       
    41. }  
    然后前端使用html + ajax 请求后台控制器,代码如下index.html:
    [html] view plain copy
     
    1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
    2. <html>  
    3.     <head>  
    4.         <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
    5.         <meta http-equiv="X-UA-Compatible" content="IE=edge">  
    6.         <meta name="viewport" content="width=device-width, initial-scale=1">  
    7.           <script type="text/javascript" src="resources/jquery-1.8.3.min.js"></script>  
    8.      </head>     
    9. <body>  
    10.   
    11. <input type="button" value="根据ID获取用户对象" id="findUserById" />   
    12.   
    13.   
    14. <input type="button" value="findUserThrowsException" id="findUserThrowsException" />   
    15.   
    16.   
    17. <script type="text/javascript">  
    18.     $("#findUserById").click(function(){  
    19.         var data = {id : 102};  
    20.         ajaxDo("/dubbo-client/user/id",data);  
    21.     });  
    22.     $("#findUserThrowsException").click(function(){  
    23.         ajaxDo("/dubbo-client/user/exception",null);  
    24.     });  
    25.       
    26. function ajaxDo(url,data){  
    27.      $.ajax({  
    28.             url:url ,  
    29.             type: "post",  
    30.             dataType: "json",  
    31.             data: data,  
    32.             success:function(result){  
    33.                if(result.success){  
    34.                    var obj = JSON.stringify(result.data);  
    35.                    alert(obj);  
    36.                }else{  
    37.                    alert(result.msg);  
    38.                }  
    39.             }  
    40.         });  
    41. }     
    42.   
    43. </script>  
    44.   
    45. </body>  
    46. </html>  
    运行结果:

    好了,整个dubbo的服务以及完成了,稍后会将使用的代码上传到GIT上,到时候如果有需要的看客可以自己去查看,我也只是

    一个初学者,如果有不当的地方请指出来,文字内容比较浅,肤浅,没什么深奥的,我只是希望能帮到那些不知道怎么用的

    人。

    项目已经上传到github上,有需要的可以移步到https://github.com/1181888200/dubbo.git 

  • 相关阅读:
    C语言:运算结果保留两位小数
    FFmpeg: AVFrame中的data和extend_data的区别
    android studio: 配置版权信息(转)
    C++: C++11 成员函数作为pthread线程 (转)
    android studio: 取消行注释在第一列
    C 语言 int 读写是否需要加锁
    【转】浅析Linux中的零拷贝技术--简单形象
    【转】Linux 内核态与用户态--简明清晰的介绍
    delete如何找到多重继承对象的内存块起始地址
    【转】内存管理内幕mallco及free函数实现--简易内存分配器、内存池、GC技术
  • 原文地址:https://www.cnblogs.com/baihaojie/p/8467066.html
Copyright © 2011-2022 走看看