专栏首页猿天地spring boot整合dubbox进行服务拆分

spring boot整合dubbox进行服务拆分

Dubbo是一个来自阿里巴巴的开源分布式服务框架,当当根据自身的需求,为Dubbo实现了一些新的功能,包括REST风格远程调用、Kryo/FST序列化等等。并将其命名为Dubbox(即Dubbo eXtensions)。

Dubbox地址:https://github.com/dangdangdotcom/dubbox

由于dubbox没有发布到maven中央仓库,需要自己安装到本地maven库或者私库。

  • git clone https://github.com/dangdangdotcom/dubbox
  • 在checkout出来的dubbox目录执行mvn install -Dmaven.test.skip=true来尝试编译一下dubbo(并将dubbo的jar安装到本地maven库)
  • 下载解压一个zookeeper,编辑其conf/zoo.cfg后启动zookeeper用作dubbo注册中心:bin/zkServer.sh start

这些准备好后就开始创建一个多模块的maven项目,具体怎么分得看自己的业务需求。

下图是我这边测试用的,仅供参考。

  • cxytiandi 父(pom)工程
  • cxytiandi-api-inteface 所有接口定义
  • cxytiandi-common 通用的工具类
  • cxytiandi-datastore 数据库操作
  • cxytiandi-manager 后台项目
  • cxytiandi-model 所有实体类定义
  • cxytiandi-rs-api 所有rest api
  • cxytiandi-web 主web项目

父工程的pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.cxytiandi</groupId>
    <artifactId>cxytiandi</artifactId>
    <version>1.0.0</version>
    <packaging>pom</packaging>

    <properties>
        <cxytiandi.version>1.0.0</cxytiandi.version>
        <java.version>1.8</java.version>
        <dubbo.version>2.8.4</dubbo.version>
        <zookeeper.version>3.4.6</zookeeper.version>
        <sgroschupf.version>0.1</sgroschupf.version>
        <resteasy.version>3.0.7.Final</resteasy.version>
        <validation.version>1.0.0.GA</validation.version>
        <hibernate.version>4.3.1.Final</hibernate.version>
        <jetty.version>6.1.26</jetty.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencyManagement>

        <dependencies>
            <dependency>
                <groupId>com.cxytiandi</groupId>
                <artifactId>cxytiandi-common</artifactId>
                <version>${cxytiandi.version}</version>
            </dependency>
            <dependency>
                <groupId>com.cxytiandi</groupId>
                <artifactId>cxytiandi-api-interface</artifactId>
                <version>${cxytiandi.version}</version>
            </dependency>
            <dependency>
                <groupId>com.cxytiandi</groupId>
                <artifactId>cxytiandi-model</artifactId>
                <version>${cxytiandi.version}</version>
            </dependency>
            <dependency>
                <!-- Import dependency management from Spring Boot -->
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>1.4.2.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <!-- dubbo -->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>dubbo</artifactId>
                <version>${dubbo.version}</version>
            </dependency>

            <!-- zookeeper -->
            <dependency>
                <groupId>org.apache.zookeeper</groupId>
                <artifactId>zookeeper</artifactId>
                <version>${zookeeper.version}</version>
            </dependency>
            <dependency>
                <groupId>com.github.sgroschupf</groupId>
                <artifactId>zkclient</artifactId>
                <version>${sgroschupf.version}</version>
            </dependency>

            <!-- resteasy -->
            <dependency>
                <groupId>org.jboss.resteasy</groupId>
                <artifactId>resteasy-jaxrs</artifactId>
                <version>${resteasy.version}</version>
            </dependency>
            <dependency>
                <groupId>org.jboss.resteasy</groupId>
                <artifactId>resteasy-client</artifactId>
                <version>${resteasy.version}</version>
            </dependency>
            <dependency>
                <groupId>org.jboss.resteasy</groupId>
                <artifactId>resteasy-jackson-provider</artifactId>
                <version>${resteasy.version}</version>
            </dependency>
            <dependency>
                <groupId>javax.validation</groupId>
                <artifactId>validation-api</artifactId>
                <version>${validation.version}</version>
            </dependency>
            <dependency>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate-validator</artifactId>
                <version>${hibernate.version}</version>
            </dependency>
            <dependency>
                <groupId>org.mortbay.jetty</groupId>
                <artifactId>jetty</artifactId>
                <version>${jetty.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <modules>
        <module>cxytiandi-common</module>
        <module>cxytiandi-web</module>
        <module>cxytiandi-manager</module>
        <module>cxytiandi-rs-api</module>
        <module>cxytiandi-datastore</module>
        <module>cxytiandi-model</module>
        <module>cxytiandi-api-interface</module>
    </modules>
</project>

目前dubbo的配置有2种方式。

一种是和之前一样,基于xml的配置,然后用@ImportResource导入。

@SpringBootApplication
@ImportResource(locations={"classpath:applicationContext-rpc-provider.xml"})
public class DatastoreApplication {

    private static final Logger logger = LoggerFactory.getLogger(DatastoreApplication.class);

    @Bean
    public CountDownLatch closeLatch() {
        return new CountDownLatch(1);
    }

    public static void main(String[] args) {
        ApplicationContext ctx = new SpringApplicationBuilder()
                .sources(DatastoreApplication.class)
                .web(false)
                .run(args);

        logger.info("项目启动!");

        CountDownLatch closeLatch = ctx.getBean(CountDownLatch.class);
        try {
            closeLatch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
<!-- 应用名称 -->
<dubbo:application name="soa-users" />

<!-- 注册中心 -->
<dubbo:registry address="zookeeper://localhost:2181" />

<!-- 用dubbo协议在20880端口暴露服务 -->
 <dubbo:protocol name="dubbo" port="20881" accepts="500" />

<!-- 声明需要暴露的服务接口 -->
<dubbo:service interface="com.cxytiandi.api.inteface.rpc.ArticleRpcService" ref="ArticleRpcService"  protocol="dubbo" timeout="2000" version="1.0"/> 

第二种了就是基于注解的方式,本来spring boot就是提倡简化配置,如果我们还用xml就显得有点不协调了。

@Configuration
public class DubboBaseConfig {

    @Bean
    public AnnotationBean annotation() {
        AnnotationBean bean = new AnnotationBean();
        bean.setPackage("com.cxytiandi.datastore.api.rpc");
        return bean;
    }

    @Bean
    public RegistryConfig registry() {
        RegistryConfig registryConfig = new RegistryConfig();
        registryConfig.setAddress("127.0.0.1:2181");
        registryConfig.setProtocol("zookeeper");
        return registryConfig;
    }

    @Bean
    public ApplicationConfig application() {
        ApplicationConfig applicationConfig = new ApplicationConfig();
        applicationConfig.setName("soa-users");
        return applicationConfig;
    }

    @Bean
    public ProtocolConfig protocol() {
        ProtocolConfig protocolConfig = new ProtocolConfig();
        protocolConfig.setPort(20881);
        return protocolConfig;
    }

}

发布服务的话我们就用dubbo中提供的Service注解来发布服务。

@Component("ArticleRpcService")
@Service(interfaceClass = ArticleRpcService.class, version = "1.0")
public class ArticleRpcServiceImpl implements ArticleRpcService {
}

调用也是一样用dubbo的Reference注解

@Reference(interfaceClass = ArticleRpcService.class, version = "1.0")
private ArticleRpcService articleRpcServiceRef;

整个项目调用的流程图如下:

源码下载:http://cxytiandi.com/code/detail/12

本文分享自微信公众号 - 猿天地(cxytiandi)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2016-11-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Spring Cloud Feign 启动UnsatisfiedDependencyException

    在加入Swagger之后启动就报错了,由此可知肯定是冲突了 错误信息如下: org.springframework.beans.factory.Unsatisf...

    猿天地
  • 这个Maven依赖的问题,你敢说你没遇到过

    Maven 依赖没处理好的话经常会导致发生一些问题,非常烦。今天给大家分享一个依赖相关的问题,说不定你之前就遇到过。

    猿天地
  • spring-data-mongodb之MongoTemplate 修改数据

    今天我们学习如何使用spring-data-mongodb来对集合中的数据进行修改操作 首先准备要练习的数据2条,实体类Article的定义请参考之前的文章s...

    猿天地
  • Maven WEB 项目使用ProGuard进行混淆,最佳解决方案

    近期公司的Android项目做了混淆,虽说对于保护代码并不是100%的,但混淆后的代码可以使那些不法份子难以阅读,这样也能对代码的保护做出贡献。  于是,公司写...

    庞小明
  • FastDFS蛋疼的集群和负载均衡(九)之创建FastDFS的Maven项目

    用户2032165
  • SSM三大框架整合

    用户2146856
  • Apache 及 CDH Spark 源码编译

    (1)搭建Maven环境 1)解压Maven安装包 maven安装包下载地址:http://archive.apache.org/dist/maven/ma...

    魏晓蕾
  • JavaEE开发使用Maven管理的SpringMVC工程

    前几篇博客已经陆陆续续的聊了一些Spring的东西,今天博客我们就来聊一下SpringMVC。SpringMVC目前在JavaEE开发中可谓占据一席之地,用起来...

    lizelu
  • (七)整合spring cloud云服务架构 - common-service 项目构建过程

    我们将对common-service整个项目进行剖析,将整个构建的流程给记录下来,让更多的关注者来参考学习。

    用户7788846
  • Nginx 搭建图片服务器

    本章内容通过Nginx 和 FTP 搭建图片服务器。在学习本章内容前,请确保您的Linux 系统已经安装了Nginx和Vsftpd。

    芋道源码

扫码关注云+社区

领取腾讯云代金券