spring boot整合dubbox进行服务拆分

时间:2022-05-06
本文章向大家介绍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