欢迎访问Spring Cloud中国社区

《重新定义Spring Cloud实战》由Spring Cloud中国社区倾力打造,基于Spring Cloud的Finchley.RELEASE版本,本书内容宽度足够广、深度足够深,而且立足于生产实践,直接从生产实践出发,包含大量生产实践的配置。欢迎加微信Software_King进群答疑,国内谁在使用Spring Cloud?欢迎登记

Dubbo迁移到SpringCloud

xiepeng · 5月前 · 4581 ·

1. 背景

    历史项目使用Dubbo进行服务构建,并基于Spring集成了一些所需的开源组件。
    在考虑新一轮的架构目标时,我们基于Dubbo和SpringCloud分别进行了方案规划,并结合自身状况评估后发现,基于Dubbo进行架构升级时,部分组件的集成或研发成本太大,而SpringCloud的生态系统则能够以较低的成本满足新的架构诉求。我们最终决定将整体的技术栈转换为SpringCloud,并对已有的业务系统进行迁移。

1.1 Dubbo工程现状概要

关键依赖版本
JDK 1.8 、Dubbo 2.5.3 、Spring 4.3.8

工程结构
使用maven构建,采用dubbo通用套路。
user
    user-api dubbo接口
    user-service 服务实现
    pom.xml

配置管理
运维配置写入文件,通过profile管理dev/test/mo/prod环境;业务配置使用自研配置系统管理。

Spring配置
绝大部分组件集成均使用spring的xml配置方式,并对xml文件进行了一定的切分。如:spring-dubbo.xml、spring-beans.xml、spring-*.xml。

Dubbo接口规范
返回数据进行了统一封装,入参过多时使用封装对象提交 。
Response<Integer> commitResourceDymaic(ResourceDymaic resourceDymaic);

1.2 迁移目标

1,使用springcloud的eureka、config、zuul构建基础架构,dubbo项目迁移到新架构中。

2,使用springboot+core(自研框架核心包)作为基础框架。初步阶段完成对已有项目的springboot集成调整,最终全面使用springboot与core统一实现AutoConfig。


2. 准备工作

2.1 dubbo快速集成验证springboot

如果有项目已经集成了springboot,并开始使用它所提供的start来自动装配,那么该步骤可以就此略过。

而对于还未集成spirngboot的项目,实施改造并没有看起来的那么复杂。单纯的集成springboot框架,仅完成以下调整就足够了,在改造前期,可以通过这种方式快速对项目进行依赖和配置的梳理调整。

maven依赖中父工程pom文件

<dependencyManagement>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-dependencies</artifactId>
        <version>${spring.boot.version}</version>
        <type>pom</type>
        <scope>import</scope>
    </dependency>
</dependencyManagement>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

dubbo的service工程pom文件

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

添加启动类和配置文件,在service的相应package下添加springboot启动类。

@SpringBootApplication
public class ApplicationSupport {
    public static void main(String[] args) {
        SpringApplication.run(ApplicationSupport.class, args);
    }
}

在resources下新增application.yml

spring:
    application:
        name: user

替换原项目启动方式,废弃原web.xml等配置文件,在启动类中通过注解加载spring的xml配置。