1. 背景
历史项目使用Dubbo进行服务构建,并基于Spring集成了一些所需的开源组件。web
在考虑新一轮的架构目标时,咱们基于Dubbo和SpringCloud分别进行了方案规划,并结合自身情况评估后发现,基于Dubbo进行架构升级时,部分组件的集成或研发成本太大,而SpringCloud的生态系统则可以以较低的成本知足新的架构诉求。咱们最终决定将总体的技术栈转换为SpringCloud,并对已有的业务系统进行迁移。spring
1.1 Dubbo工程现状概要sql
关键依赖版本api
JDK 1.8 、Dubbo 2.5.3 、Spring 4.3.8springboot
工程结构架构
使用maven构建,采用dubbo通用套路。并发
userapp
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配置。
@ImportResource("classpath:spring-root.xml")
2.2 集成springboot
咱们的最终目标中包含springboot框架来简化开发,例如使用springboot内置及dubbo等外部提供的一些starter,不过实际上他们与迁移并没有依赖或冲突干扰,能够按照实际情况
进行基础的AutoConfig。
在初次集成时尽量使用自动装配,去掉spring的xml配置。
使用@EnableTransactionManagement,@ComponentScan等注解取代xml相关配置;
使用dubbo-spring-boot-starter及注解取代dubbo的xml配置,git地址
maven依赖
<dependency> <groupId>com.alibaba.boot</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>0.1.0</version> </dependency>
自定义注解及AutoConfig取代三方组件的xml配置,例如elasticjob
@Configuration @ConditionalOnClass(ElasticJob.class) public class ElasticJobAutoConfig { @Autowired private ConfigurableApplicationContext configurableContext; @Bean(initMethod = "init") public ZookeeperRegistryCenter zookeeperRegistryCenter(@Value("${job.reg.address}") final String serverList, @Value("${job.reg.namespace}") final String namespace) { return new ZookeeperRegistryCenter(new ZookeeperConfiguration(serverList, namespace)); } }
2.3 搭建springcloud基础服务
部署config、eureka、zuul,有大量的资料供参考实施,略过。
在集成springboot后的项目上引入springcloud,完成eureka、config的相关配置,略过。
3、服务迁移
在准备工做中,咱们已经完成了对工程的调整并接入springcloud,服务在保持dubbo正常工做的基础上,同时可以链接到eureka进行服务提供。接下来,服务迁移的核心包含两部分:
1,使原有的dubbo服务提供Restful规范接口
2,服务调用方接入调整
3.1 dubbo与springcloud独立共存方案
初始状态结构
共存状态结构:保持原dubbo的service实现不变,额外基于service改造提供Restful接口。
该方式可以最大程度保证原服务稳定运行,但会额外增长开发成本,长期保持共存也容易致使消费方的调用混乱。
3.2 基于Feign的切换方案
修改原dubbo provider,同时向dubbo registry和eureka注册相同服务。
修改原dubbo consumer,根据配置方式支持dubbo或http调用。
切换过程当中,服务状态以下:
具体实现思路:
1,修改原dubbo服务定义的api接口,支持feign调用。
@FeignClient("demo") public interface DemoService { @RequestMapping(value = "/{version}/pt/demos/{appId}", method = RequestMethod.GET) Response<Integer> post(@PathVariable("appId") String appId); }
2,修改原dubbo服务的实现类,添加@RestController对外提供Restful接口
@Service @RestController public class DemoServiceImpl implements DemoService { @Override public Response<Integer> post(String appId) { return null; } }
3,消费者切换调用方式,若是原dubbo消费者使用了@Refrence注解,直接更改成@Autowoired便可。若使用了xml配置refrence则注解便可。
@Reference private DemoService demoService; //更改成 @Autowired private DemoService demoService;
存在的问题:spring MVC不支持继承接口中方法参数的组件,dubbo接口转换Restful接口时可能没法适应等。
欢迎工做一到五年的Java工程师朋友们加入Java架构开发:855801563
群内提供免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)合理利用本身每一分每一秒的时间来学习提高本身,不要再用"没有时间“来掩饰本身思想上的懒惰!趁年轻,使劲拼,给将来的本身一个交代