天天看點

Dubbo遷移到SpringCloud

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配置。

@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的相關配置,略過。

三、服務遷移

在準備工作中,我們已經完成了對工程的調整并接入springcloud,服務在保持dubbo正常工作的基礎上,同時能夠連接配接到eureka進行服務提供。接下來,服務遷移的核心包含兩部分:

1,使原有的dubbo服務提供Restful規範接口

2,服務調用方接入調整

3.1 dubbo與springcloud獨立共存方案

初始狀态結構

共存狀态結構:保持原dubbo的service實作不變,額外基于service改造提供Restful接口。

該方式能夠最大程度保證原服務穩定運作,但會額外增加開發成本,長期保持共存也容易導緻消費方的調用混亂。

Dubbo遷移到SpringCloud

3.2 基于Feign的切換方案

修改原dubbo provider,同時向dubbo registry和eureka注冊相同服務。

修改原dubbo consumer,根據配置方式支援dubbo或http調用。

切換過程中,服務狀态如下:

Dubbo遷移到SpringCloud

具體實作思路:

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等多個知識點的架構資料)合理利用自己每一分每一秒的時間來學習提升自己,不要再用"沒有時間“來掩飾自己思想上的懶惰!趁年輕,使勁拼,給未來的自己一個交代

版權聲明:本文為CSDN部落客「weixin_34198453」的原創文章,遵循CC 4.0 BY-SA版權協定,轉載請附上原文出處連結及本聲明。

原文連結:https://blog.csdn.net/weixin_34198453/article/details/92422065