一个系统原来是使用dubbo的,现在想把微服务架构转为Spring Cloud。但是这个系统已经在使用中了,希望一步步的把dubbo服务一个个的转为Spring Cloud,转换一个使用一个,转换的过程中尽量少影响原系统。

比如现在要转换dubbo服务D1成Spring Cloud服务C1,D1又需要调用dubbo服务D2。怎么办呢?如果同时转换D1,D2的话,D2可能又会调用D3,这样可能引用一大堆服务。这种做法肯定不可取。一种更好的解决方案是:提供一个Spring Cloud的代理服务,这个代理服务同时是一个Spring Cloud服务和dubbo客户端,其作用就是将对Spring Cloud服务的调用转为对dubbo服务的调用。这样Spring Cloud服务C1需要调用的Spring Cloud服务C2就先以代理的方式实现。等服务C1测试完成后,再停掉代理中的C2,将D2转换为真正的Spring Cloud服务C2。这样逐步把所有的dubbo服务都转换成Spring Cloud服务。这种方案的优点是原系统不用做任何修改,避免了修改带来的风险。

这个方案的关键就是代理服务的实现。

假设有两个dubbo服务,分别为Hello1Service和Hello2Service如下:

public interface Hello1Service {String hello(String name);
}
public interface Hello2Service {String hello(String name);
}

创建一个MAVEN项目。POM文件为:

<?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.example</groupId><artifactId>CloudDubboProxy</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><name>CloudDubboProxy</name><description>Cloud Dubbo Proxy</description><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.1.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version><spring-cloud.version>Finchley.RC1</spring-cloud.version></properties><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jetty</artifactId></dependency--><dependency><groupId>com.alibaba</groupId><artifactId>dubbo</artifactId><version>2.8.4</version></dependency><!-- dependency><groupId>org.javassist</groupId><artifactId>javassist</artifactId><version>3.15.0-GA</version></dependency--><dependency><groupId>org.apache.mina</groupId><artifactId>mina-core</artifactId><version>1.1.7</version></dependency><dependency><groupId>org.glassfish.grizzly</groupId><artifactId>grizzly-core</artifactId><version>2.1.4</version></dependency><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.5</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.1.39</version></dependency><dependency><groupId>org.apache.bsf</groupId><artifactId>bsf-api</artifactId><version>3.1</version></dependency><dependency><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId><version>3.4.6</version></dependency><dependency><groupId>com.github.sgroschupf</groupId><artifactId>zkclient</artifactId><version>0.1</version></dependency><!-- dependency><groupId>org.apache.curator</groupId><artifactId>curator-framework</artifactId><version>2.5.0</version></dependency--><dependency><groupId>com.googlecode.xmemcached</groupId><artifactId>xmemcached</artifactId><version>1.3.6</version></dependency><dependency><groupId>de.ruedigermoeller</groupId><artifactId>fst</artifactId><version>1.55</version></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency><!-- dependency><groupId>com.alibaba</groupId><artifactId>dubbo-parent</artifactId><version>2.8.4</version><type>pom</type><scope>import</scope></dependency-->           </dependencies></dependencyManagement><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build><repositories><repository><id>spring-milestones</id><name>Spring Milestones</name><url>https://repo.spring.io/milestone</url><snapshots><enabled>false</enabled></snapshots></repository><repository><id>alimaven</id><name>aliyun maven</name><url>http://maven.aliyun.com/nexus/content/groups/public/</url><snapshots><enabled>false</enabled></snapshots></repository><repository>        <id> central</id>        <name> Maven Repository Switchboard</name>        <layout> default</layout>        <url> http://repo1.maven.org/maven2</url>        <snapshots>        <enabled> false</enabled>        </snapshots>        </repository> </repositories></project>

dubbo的Spring配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsdhttp://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"><dubbo:application name="demo-consumer" owner="programmer" organization="dubbox"/><dubbo:registry address="zookeeper://127.0.0.1:2181"/><!--uncomment this if you want to test dubbo's monitor--><!--<dubbo:monitor protocol="registry"/>--><dubbo:reference id="hello1Service" interface="com.alibaba.dubbo.demo.hello.Hello1Service"/><dubbo:reference id="hello2Service" interface="com.alibaba.dubbo.demo.hello.Hello2Service"/>
</beans>

Spring Cloud的配置文件:

#debug: true
eureka:client:serviceUrl:defaultZone: http://localhost:8761/eureka/
server:port: 9999
spring:application:name: service-aapplication:name: service-b

注意:Spring Cloud 1.x中只支持一个服务,Spring Cloud 2.x中可以定义多个服务。

代理的启动类:

@SpringBootApplication
@EnableEurekaClient
@RestController
public class CloudDubboProxyApplication {private static Hello1Service hello1Service;private static Hello2Service hello2Service;public static void main(String[] args) {ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:application-context.xml");context.start();hello1Service = context.getBean(Hello1Service.class);hello2Service = context.getBean(Hello2Service.class);SpringApplication.run(CloudDubboProxyApplication.class, args);}@RequestMapping("/a")public String ma(@RequestParam String name) {String s = hello1Service.hello("world");return "From Cloud service A: "+name+"<br>"+s;}@RequestMapping("/b")public String mb(@RequestParam String name) {String s = hello2Service.hello("world");return "From Cloud service B: "+name+"<br>"+s;}
}

写个测试类:

@SpringBootApplication
@EnableDiscoveryClient
@RestController
public class DemoRibbonApplication {public static void main(String[] args) {SpringApplication.run(DemoRibbonApplication.class, args);}@Bean@LoadBalancedRestTemplate restTemplate() {return new RestTemplate();}@AutowiredRestTemplate restTemplate;@RequestMapping(value = "/a")public String ha(@RequestParam String name){return restTemplate.getForObject("http://SERVICE-A/a?name="+name,String.class);}    @RequestMapping(value = "/b")public String hb(@RequestParam String name){return restTemplate.getForObject("http://SERVICE-B/b?name="+name,String.class);}
}

可以验证确实实现了Spring Cloud调用dubbo功能。

dubbo转Spring Cloud相关推荐

  1. Dubbo和Spring Cloud微服务架构对比

    一.为什么要使用微服务? 微服务提倡将单一应用程序划分成一组小的服务,服务之间互相协调.互相配合. 今天我们来了解下业内主要的微服务框架:Dubbo 和 Spring Cloud 微服务主要的优势 降 ...

  2. Dubbo:Spring Cloud 服务调用的新选择

    无论是Dubbo,还是Spring Cloud,大家可能都不会感到陌生. 那什么是Dubbo Spring Cloud呢?使用Dubbo Spring Cloud可以实现什么目的?基于其实现的路由和负 ...

  3. 深入理解分布式技术 - Dubbo vs Spring Cloud

    文章目录 概 Dubbo 总体架构 应用特性 Spring Cloud 总体架构 应用特性 Dubbo vs Spring Cloud 功能对比 调用方式 服务发现 开发成本 概 提到微服务开源框架, ...

  4. Dubbo和Spring Cloud微服务架构的对比

    微服务架构是互联网很热门的话题,是互联网技术发展的必然结果.它提倡将单一应用程序划分成一组小的服务,服务之间互相协调.互相配合,为用户提供最终价值.虽然微服务架构没有公认的技术标准和规范或者草案,但业 ...

  5. Dubbo和Spring Cloud微服务架构

    微服务架构是互联网很热门的话题,是互联网技术发展的必然结果.它提倡将单一应用程序划分成一组小的服务,服务之间互相协调.互相配合,为用户提供最终价值.虽然微服务架构没有公认的技术标准和规范或者草案,但业 ...

  6. 终极对决!Dubbo 和 Spring Cloud 微服务架构到底孰优孰劣?

    微服务架构是互联网很热门的话题,是互联网技术发展的必然结果.它提倡将单一应用程序划分成一组小的服务,服务之间互相协调.互相配合,为用户提供最终价值.虽然微服务架构没有公认的技术标准和规范或者草案,但业 ...

  7. dubbo web工程示例_带有Dubbo的Spring Cloud Alibaba

    在优锐课的学习分享中,我们可以看到关于如何在阿里巴巴的Spring Cloud实现中使用这个流行的RPC框架. 1.Spring Cloud Alibaba Spring Cloud Alibaba是 ...

  8. Java 微服务框架对比:Dubbo 和 Spring Cloud

    微服务特点: 微服务(Microservices)是一种架构风格,一个大型复杂软件应用由一个或多个微服务组成. 独立部署 松耦合 单一职责,每个服务仅关注一件任务 微服务框架 相关概念: rpc 1. ...

  9. Dubbo与Spring Cloud

    目录 1.Sping Cloud 2.Dubbo 1.Spring Cloud Spring Cloud,从命名我们就可以知道,它是Spring Source的产物,Spring社区的强大背书可以说是 ...

  10. 【重难点】【分布式 01】RESTful、RPC 对比、Dubbo、Spring Cloud 对比、Eureka、Zookeeper、Consul、Nacos 对比、分布式锁

    [重难点][分布式 01]RESTful.RPC 对比.Dubbo.Spring Cloud 对比.Eureka.Zookeeper.Consul.Nacos 对比.分布式锁 文章目录 [重难点][分 ...

最新文章

  1. asp.net c#截取指定字符串函数
  2. Citrix Provisioning Services 7.13企业实战
  3. 无法访问本地ip_当金万维异速联无法访问金蝶软件怎么办?
  4. RabbitMq org.springframework.amqp.AmqpIOException: java.io.IOException
  5. 5 大常用机器学习模型类型总结
  6. 小程序循环里做字符串拼接_昨天还在for循环里写加号拼接字符串的那个同事,今天已经不在了...
  7. 我发誓:下辈子再也不学JavaScript了
  8. @HystrixCommand 注解的作用与注意事项
  9. 超几何分布_概率小题——分布列专题
  10. Linux linux下的进程状态
  11. Spring Boot 线程池
  12. 买了基金之后要天天盯着吗?
  13. linux设备模型之mmc子系统
  14. 极速pdf编辑器的水印如何去掉_如何去掉PDF右下角的全能扫描王水印
  15. ❤️肝下25万字的《决战Linux到精通》笔记,你的Linux水平将从入门到入魔❤️【建议收藏】
  16. linux系统下查找应用,Linux系统find查找命令运用
  17. 如何开启QQ在线客服
  18. 主流机器视觉软件介绍
  19. python猴子分桃子的数学题_python编程练习-分桃子
  20. java中Excel导出echart图片

热门文章

  1. java山海经之轩辕_轩辕传奇手游山海经任务:盘古开天之遂古之初
  2. 聚观早报 | 美国又一家银行要暴雷;腾讯T13技术黄希彤被曝遭裁员
  3. 知识图谱:知识表示学习(KRL)/知识嵌入(KE)必读论文
  4. 风变编程python入门经典100题_风变编程《Python基础语法+爬虫精进》
  5. 累并快乐着---我的2016年总结
  6. 车机开发问题: igo导航无audio focus机制导致声音焦点被抢走
  7. 拨号上网显示服务器,宽带拨号上网什么意思?宽带拨号上网的操作步骤
  8. html5 文件解密,骇极干货 | 解密通过Monaca插件加密的文件
  9. 波与实体运动的区别(2) - 波动三要素
  10. 0/0型极限等于多少_鹤岗钢制乙级防火门多少一平方_辽宁中安华泰防火门