基于注解方式的dubbo+spring mvc整合

最近项目使用了dubbo进行服务治理,搭建了一套基于注解方式的dubbo+spring mvc的框架,注册中心使用zookeeper。
关于dubbo的介绍就不多说了,网上有很多可以自行搜索,直接上代码。

项目使用的maven,采用多模块方式。先看一下示例项目框架。


基于注解方式的dubbo+spring mvc整合_第1张图片
image.png

其中dubbo-config模块管理所有项目所需的配置文件,在打包时打入对应的服务内。

一、项目包依赖 pom.xml



    4.0.0

    com.sanjinbest.dubbo
    sanjinbest.dubbo
    pom
    1.0-SNAPSHOT
    
        user-service
        dubbo-web
        dubbo-config
    

    
        UTF-8
        3.0.1
        4.3.7.RELEASE
        4.12
        0.2
        2.5.4
    

    
        
            
            
                com.alibaba
                dubbo
                ${dubbo.version}
                
                    
                        org.springframework
                        spring
                    
                
            

            
            
                com.101tec
                zkclient
                ${zookeeper.version}
            

            
            
                javax.servlet
                javax.servlet-api
                ${servlet.version}
            
            
                junit
                junit
                ${junit.version}
                test
            

            
                org.hamcrest
                hamcrest-core
                1.3
            

            
            
                org.springframework
                spring-core
                ${springframework.version}
            
            
                org.springframework
                spring-context
                ${springframework.version}
            
            
                org.springframework
                spring-web
                ${springframework.version}
            
            
                org.springframework
                spring-beans
                ${springframework.version}
            
            
                org.springframework
                spring-aop
                ${springframework.version}
            
            
                org.springframework
                spring-expression
                ${springframework.version}
            
            
                org.springframework
                spring-aspects
                ${springframework.version}
            
            
                org.springframework
                spring-context-support
                ${springframework.version}
            
            
                org.springframework
                spring-tx
                ${springframework.version}
            
            
                org.springframework
                spring-webmvc
                ${springframework.version}
            
            
                org.springframework
                spring-test
                ${springframework.version}
            
            
                org.springframework.mobile
                spring-mobile-device
                ${spring.mobile.version}
            
            
                org.springframework
                spring-jdbc
                ${springframework.version}
            
        
    

二、dubbo服务端

1、服务端配置




    
    

    
    

    
    

    
    

    
    


这里使用的注册中心是zookeeper。

2、服务端applicationContext.xml




    
        
        
            
                classpath*:dubbo.properties
            
        
    
    
    
    
    
    
    


3、服务接口类

package com.sanjinbest.dubbo.user.api;

/**
 * 
  • * * @author lixin * @create 2017/11/3 */ public interface IUserInfoService { String getName(); int getAge(); }

    这里提供了一个返回name 和 age的方法。当发布服务给第三方的时候,只需要将该接口打成jar包发布即可。

    4、接口实现类

    package com.sanjinbest.dubbo.user.provider;
    
    import com.sanjinbest.dubbo.user.api.IUserInfoService;
    
    /**
     * 
  • * * @author lixin * @create 2017/11/3 */ @com.alibaba.dubbo.config.annotation.Service @org.springframework.stereotype.Service public class UserInfoServiceProvider implements IUserInfoService{ @Override public String getName() { return "sanjinbest"; } @Override public int getAge() { return 29; } }

    这里有一个需要注意的地方,该实现类内使用了2个service注解:
    @com.alibaba.dubbo.config.annotation.Service dubbo服务对外暴露服务
    @org.springframework.stereotype.Service spring容器注入

    5、dubbo本地测试启动

    package mock;
    
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    import java.io.IOException;
    
    /**
     * 
  • * * @author lixin * @create 2017/9/18 */ public class UserProviderMock { public static void main(String[] args) { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"classpath*:spring/applicationContext.xml"}); System.out.println("user provider start..."); context.start(); try { System.in.read(); } catch (IOException e) { e.printStackTrace(); } } }

    如果是线上使用,可以使用运行jar包的方式运行,下面是打jar包的配置:

    
        
            
            user-provider
            
                
                    org.apache.maven.plugins
                    maven-jar-plugin
                    3.0.2
                    
                        ${project.build.directory}/classes/
                        
                            
                                com.alibaba.dubbo.container.Main
                                
                                false
                                true
                                lib/
                            
                            
                                .
                            
                        
                    
                
    
                
                    org.apache.maven.plugins
                    maven-dependency-plugin
                    
                        
                            copy-dependencies
                            package
                            
                                copy-dependencies
                            
                            
                                jar
                                jar
                                
                                    ${project.build.directory}/lib
                                
                                false
                                true
                                true
                                true
                                false
                            
                        
                    
                
            
    
            
                
                    ../../dubbo-config/config/
                
                
                
                    ${project.build.directory}/classes
                    src/main/resources
                    true
                    
                        **/*.xml
                        **/*.properties
                    
                
                
                
                    ${project.build.directory}/classes/META-INF/spring
                    src/main/resources/spring
                    true
                    
                        applicationContext.xml
                    
                
            
        
    

    最后看一下dubbo的配置参数:

    #服务注册中心(如果注册中心为集群,这里需要使用“,”分隔)
    dubbo.user.registry.server=127.0.0.1:2181
    #服务暴露端口
    dubbo.user.protocol.port=20080
    #请求超时时间
    dubbo.user.timeout=3000
    #请求失败重试次数
    dubbo.user.retries=0
    #客户端(如果订阅的服务为集群,这里需要使用“,”分隔)
    dubbo.user.client=127.0.0.1:2181
    

    到此,一个简单的dubbo服务就搭建好了,我们启动一下看看。
    直接运行类UserProviderMock.java

    image.png

    如果看到"user provider start..."就证明启动成功了!
    下面我们来看一下dubbo的客户端。

    三、dubbo客户端

    1、dubbo客户端配置

    
    
    
        
        
    
        
        
    
        
        
    
        
    
    

    然后将其import进入applicationContext.xml即可。
    先跑一下单元测试。

    2、单元测试

    package com.sanjinbest.dubbo.mock;
    
    import com.alibaba.dubbo.config.annotation.Reference;
    import com.sanjinbest.dubbo.user.api.IUserInfoService;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    
    /**
     * 
  • * * @author lixin * @create 2017/9/18 */ @RunWith(SpringJUnit4ClassRunner.class) //使用junit4进行测试 @ContextConfiguration(locations={"classpath*:spring/applicationContext.xml"}) //加载配置文件 public class MockDubbo { @Reference private IUserInfoService iUserInfoService; @Test public void test(){ System.out.println("Hello : " + iUserInfoService.getName()); System.out.println("age : " + iUserInfoService.getAge()); } }
    基于注解方式的dubbo+spring mvc整合_第2张图片
    image.png

    3、与spring mvc结合

    完成了单元测试,在尝试与spring mvc进行结合使用。与spring mvc的结合用其实非常简单,spring mvc的配置不变,只需要将spring-mvc与dubbo配置都交给applictionContext.xml进行管理就好。
    spring-mvc.xml

    
    
    
        
        
    
        
        
    
        
        
            
            
            
        
    
    
    

    applictionContext.xml

    
    
    
        
            
            
                
                    classpath*:dubbo.properties
                
            
        
    
        
        
        
        
    
        
        
        
        
    
    

    web.xml

    
    
    
      
        encodingFilter
        org.springframework.web.filter.CharacterEncodingFilter
        true
        
          encoding
          UTF-8
        
      
      
        encodingFilter
        /*
      
    
      
        SpringMVC
        org.springframework.web.servlet.DispatcherServlet
        
        
          contextConfigLocation
          classpath*:spring/applicationContext.xml
        
        1
        true
      
      
        SpringMVC
        /
      
    
      Archetype Created Web Application
    
    
    
    

    在看一下测试的controller和service

    package com.sanjinbest.dubbo.controller;
    
    import com.sanjinbest.dubbo.service.IndexService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    /**
     * 
  • * * @author lixin * @create 2017/11/6 */ @Controller public class IndexController{ @Autowired private IndexService indexService; @RequestMapping(value="/user",method = RequestMethod.GET) @ResponseBody public String user(){ return indexService.userInfo(); } }

    controller的写法没有特殊变化,主要看一下service的。

    package com.sanjinbest.dubbo.service;
    
    import com.alibaba.dubbo.config.annotation.Reference;
    import com.sanjinbest.dubbo.user.api.IUserInfoService;
    import org.springframework.stereotype.Service;
    
    /**
     * 
  • * * @author lixin * @create 2017/11/6 */ @Service public class IndexService { @Reference private IUserInfoService iUserInfoService; public String userInfo(){ return iUserInfoService.getName() + "," + iUserInfoService.getAge(); } }

    service这里注入dubbo接口,需要使用注解@Reference
    启动后看一下测试结果:

    基于注解方式的dubbo+spring mvc整合_第3张图片
    image.png

    最后,我们看一下dubbo-admin后台。
    dubbo-admin.war可以在dubbo的官网上下载,下载后放到tomcat webapps内,解压war包,修改配置文件webapps/dubbo-admin/WEB-INF/dubbo.properties
    设置dubbo.registry.address参数,我使用的是本地的zookeeper。

      dubbo.registry.address=zookeeper://127.0.0.1:2181
      dubbo.admin.root.password=root
      dubbo.admin.guest.password=guest
    

    启动tomcat,然后请求地址http://127.0.0.1:8080/dubbo-admin/
    用户名和密码都是root。
    dubbo-admin的功能有很多,就不作详细说明了,到此一个使用dubbo服务的spring mvc示例就介绍结束。
    本文只对dubbo的搭建作一个初步的介绍,后续会有一些dubbo的线上使用介绍。
    示例项目下载地址 : https://pan.baidu.com/s/1nvj3XpB 密码: 46vr

    写的比较粗糙,可能会存在一些错误。欢迎大家反馈交流。

    你可能感兴趣的:(基于注解方式的dubbo+spring mvc整合)