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)

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

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏老码农专栏

基于playframework v1构建一个新的Java web应用框架

1052
来自专栏猿天地

spring cloud gateway 全局过滤器

全局过滤器作用于所有的路由,不需要单独配置,我们可以用它来实现很多统一化处理的业务需求,比如权限认证,IP访问限制等等。

7152
来自专栏搜云库

Spring Boot 中使用 MyBatis 整合 Druid 多数据源

本文将讲述 spring boot + mybatis + druid 多数据源配置方案。 环境 CentOs7.3 安装 MySQL 5.7.19 二进制版本...

3267
来自专栏haifeiWu与他朋友们的专栏

Netty实战之第一个应用

作为一个正在Java路上摸爬滚打的小菜鸡,之前在项目中也用过Netty,也因为Netty报名阿里的中间件大赛,但终究功力太浅,最终不了了之,最近工作中又遇到了N...

1502
来自专栏Java Web

使用RESTful风格开发Java Web

1173
来自专栏王大锤

iOS AFNetworking “Request failed: unacceptable content-type: text/html”问题

3987
来自专栏LanceToBigData

JavaWeb(三)JSP概述

一、JSP概述 1.1、JSP简介   一种动态网页开发技术。它使用JSP标签在HTML网页中插入Java代码。标签通常以<%开头以%>结束。JSP是一种Jav...

2986
来自专栏Ryan Miao

SpringCloud学习5-如何创建一个服务提供者provider

1203
来自专栏AI-vell

java轻量RESTful api服务搭建(jersey+jetty)

由于开始要搭建一个java + python的服务,java端提供数据库增删改查逻辑供python端调用,第一时间想到了用REST(Representation...

4317
来自专栏JavaWeb

项目中Spring 声明式事务使用的一些坑点分析01

7118

扫码关注云+社区