Spring Cloud与Dubbo的完美融合之手「Spring Cloud Alibaba」_spring-cloud-starter-dubbo-程序员宅基地

很早以前,在刚开始搞SpringCloud基础教程的时候,写过这样一篇文章:《微服务架构的基础框架选择:SpringCloud还是Dubbo?》,可能不少读者也都看过。之后也就一直有关于这两个框架怎么选的问题出来,其实文中我有明确的提过,SpringCloud与Dubbo的比较本身是不公平的,主要前者是一套较为完整的架构方案,而Dubbo只是服务治理与RPC实现方案。

由于Dubbo在国内有着非常大的用户群体,但是其周边设施与组件相对来说并不那么完善。很多开发者用户又很希望享受SpringCloud的生态,因此也会有一些SpringCloud与Dubbo一起使用的案例与方法出现,但是一直以来大部分SpringCloud整合Dubbo的使用方案都比较别扭。这主要是由于Dubbod的注册中心采用了ZooKeeper,而开始时SpringCloud体系中的注册中心并不支持ZooKeeper,所以很多方案是存在两个不同注册中心的,之后即使SpringCloud支持了ZooKeeper,但是由于服务信息的粒度与存储也不一致。所以,长期以来,在服务治理层面上,这两者一直都一套完美的融合方案。

直到SpringCloudAlibaba的出现,才得以解决这样的问题。在之前的教程中,我们已经介绍过使用SpringCloudAlibaba中的Nacos来作为服务注册中心,并且在此之下可以如传统的SpringCloud应用一样地使用Ribbon或Feign来实现服务消费。这篇,我们就来继续说说SpringCloudAlibaba下额外支持的RPC方案:Dubbo。

入门案例

我们先通过一个简单的例子,来直观地感受Nacos服务注册中心之下,利用Dubbo来实现服务提供方与服务消费方。这里省略Nacos的安装与使用,如果对Nacos还不了解,可以查看本系列的使用Nacos实现服务注册与发现,下面就直接进入Dubbo的使用步骤。

构建服务接口

创建一个简单的Java项目,并在下面定义一个抽象接口,比如:

publicinterfaceHelloService{

Stringhello(Stringname);

}

构建服务接口提供方

第一步:创建一个SpringBoot项目,在pom.xml中引入第一步中构建的API包以及SpringCloudAlibaba对Nacos和Dubbo的依赖,比如:

com.didispace

alibaba-dubbo-api

0.0.1-SNAPSHOT

org.springframework.boot

spring-boot-starter-actuator

org.springframework.boot

spring-boot-starter-web

org.springframework.cloud

spring-cloud-starter-dubbo

org.springframework.cloud

spring-cloud-starter-alibaba-nacos-discovery

//…

这里需要注意两点:

必须包含spring-boot-starter-actuator包,不然启动会报错。

spring-cloud-starter-dubbo包需要注意groupId,根据具体使用的springcloudalibaba版本依赖来确定。

项目孵化期间,使用的groupId为:org.springframework.cloud;

项目孵化之后,使用的groupId修改为了com.alibaba.cloud,所以用户需要注意是否使用正确。避免加载不到对应JAR包的问题。

第二步:实现Dubbo接口

@Service

publicclassHelloServiceImplimplementsHelloService{

@Override

publicStringhello(Stringname){

return"hello"+name;

}

}

注意:这里的@Service注解不是Spring的,而是org.apache.dubbo.config.annotation.Service注解。

第三步:配置Dubbo服务相关的信息,比如:

spring.application.name=alibaba-dubbo-server

server.port=8001

spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

#指定Dubbo服务实现类的扫描基准包

dubbo.scan.base-packages=com.didispace.alibaba.dubbo.server

dubbo.protocol.name=dubbo

dubbo.protocol.port=-1

dubbo.registry.address=spring-cloud://localhost

配置说明如下:

dubbo.scan.base-packages:指定Dubbo服务实现类的扫描基准包

dubbo.protocol:Dubbo服务暴露的协议配置,其中子属性name为协议名称,port为协议端口(-1表示自增端口,从20880开始)

dubbo.registry:Dubbo服务注册中心配置,其中子属性address的值“spring-cloud://localhost”,说明挂载到SpringCloud注册中心

注意:如果使用SpringBoot2.1及更高版本时候,需要增加配置spring.main.allow-bean-definition-overriding=true

第四步:创建应用主类,比如:

@EnableDiscoveryClient

@SpringBootApplication

publicclassDubboServerApplication{

publicstaticvoidmain(String[]args){

SpringApplication.run(DubboServerApplication.class,args);

}

}

构建服务接口消费方

第一步:创建一个SpringBoot项目,在pom.xml中引入第一步中构建的API包以及SpringCloudAlibaba对Nacos和Dubbo的依赖,具体内容与服务提供方一致:

com.didispace

alibaba-dubbo-api

0.0.1-SNAPSHOT

org.springframework.boot

spring-boot-starter-actuator

org.springframework.boot

spring-boot-starter-web

org.springframework.cloud

spring-cloud-starter-dubbo

org.springframework.cloud

spring-cloud-starter-alibaba-nacos-discovery

//…

第二步:配置Dubbo服务相关的信息,比如:

spring.application.name=alibaba-dubbo-client

server.port=8002

spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

dubbo.protocol.name=dubbo

dubbo.protocol.port=-1

dubbo.registry.address=spring-cloud://localhost

dubbo.cloud.subscribed-services=alibaba-dubbo-server

注意:

这里多增加了dubbo.cloud.subscribed-services参数,表示要订阅服务的服务名,这里配置的alibaba-dubbo-server对应的就是上一节服务提供方的spring.application.name的值,也就是服务提供方的应用名。

如果使用SpringBoot2.1及更高版本时候,需要增加配置spring.main.allow-bean-definition-overriding=true。

第三步:创建应用主类,并实现一个接口,在这个接口中调用Dubbo服务,比如:

@EnableDiscoveryClient

@SpringBootApplication

publicclassDubboClientApplication{

publicstaticvoidmain(String[]args){

SpringApplication.run(DubboClientApplication.class,args);

}

@Slf4j

@RestController

staticclassTestController{

@Reference

HelloServicehelloService;

@GetMapping("/test")

publicStringtest(){

returnhelloService.hello(“didispace.com”);

}

}

}

注意:这里的@Reference注解是org.apache.dubbo.config.annotation.Reference

测试验证

完成了上面的所有开发之后,我们可以将Nacos、服务提供者、服务消费者依次启动起来。在完成启动之后,我们可以在Nacos控制台的服务列表中看到上面定义的两个服务,比如:

file

接下来,我们就可以通过调用服务消费者中定义的/test接口来触发dubbo服务的消费了。如果一切顺畅,应该可以得到如下结果:

$curllocalhost:8002/test

hellodidispace.com

小结

通过上面的例子,如果你曾经同时玩过SpringCloud和Dubbo,一定会深有感触。你不用再同时顾虑Eureka和Zookeeper的配置,也不同同时关注这两个中间件的健康,只需要关注和维护好Nacos一个即可。而对于Dubbo的配置和使用来说,配置还是相当简单的,而代码编写上与以往的Dubbo没什么大的不同。在SpringCloudAlibaba的整合之下,Dubbo用户既可以享受到原本RPC带来性能优势,又可以更好的享受SpringCloud的各种福利;而对于SpringCloud用户来说,在服务治理层面,又对了一个不错的可选项。可以说这块的整合是真正的让这两大用户群体得到了很好的融合,起到了互相成就的作用。更多关于SpringCloud与SpringCloudAlibaba教程内容可点击查看。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/yihankexi/article/details/102813278

智能推荐

C++奥赛一本通排序题解_c++ 谁考了第k名奇数单增序列-程序员宅基地

文章浏览阅读912次。C++奥赛一本通刷题记录(排序) 2017.11.16 By gwj1139177410 都是拿STL水的…别怪我…… 谁考了第k名 openjudge01#include#includeusing namespace std;const int maxn = 110;struct node{ int id; float score_c++ 谁考了第k名奇数单增序列

Valgrind内存检测工具的整理-持续更新_更新valgrind-程序员宅基地

文章浏览阅读2.3k次。Valgrind内存检测工具的使用下载安装调用方式[command-line]参数介绍[valgrind-options]工具模块注意事项局限本文对Valgrind内存检测工具的使用方法作一个简单的记录,其内容大部分来自官方手册,将持续更新,建议收藏。下载源码链接:https://www.valgrind.org/downloads/current.html.手册下载:https://www.valgrind.org/docs/download_docs.html.安装./autogen,_更新valgrind

HAWQ个人学习笔记(一)——HAWQ介绍-程序员宅基地

文章浏览阅读3.3k次。一、什么是HAWQ?HAWQ是Hadoop原生SQL查询引擎,针对分析性的应用。它具有大规模并行处理很多传统数据库以及其他数据库没有的特性及功能,结合了MMP数据库的关键技术优势优势和Hadoop的可扩展性和便利性。读写依赖于HDFS。注:Hadoop是一种分布式文件系统,适用于大规模数据集的应用,具有高容错性。简称HDFS。二、特性丰富且兼容的ANSI SQL标准并且支持SQL 92、99、2003 OLAP以及基于Hadoop的PostgreSQL用户自定义函数支持多种语言:Python、J_hawq

大数据计算引擎之Spark(2) SparkCore-RDD_spark core engine-程序员宅基地

文章浏览阅读121次。本文地址:大数据计算引擎之Spark(2) SparkCore-RDDRDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据抽象,它代表一个不可变、可分区、里面的元素可并行计算的集合。RDD具有数据流模型的特点:自动容错、位置感知性调度和可伸缩性。RDD允许用户在执行多个查询时显式地将工作集缓存在内存中,后续的查询能够重用工作集,..._spark core engine

游戏任务设计(4):Puzzle、Challenge和任务叙事_puzzle任务-程序员宅基地

文章浏览阅读2.2k次,点赞2次,收藏4次。转自游戏任务设计(4):Puzzle、Challenge和任务叙事Puzzle型任务(解谜任务)如果这篇文章写作于1990年而不是2010年,肯定会写“Puzzle型任务的设计目的是智力挑战和由此带来的愉悦感”。就像神秘岛里的层层机关,就像国家宝藏里的条条线索,抽丝剥茧到最后揭开所有谜题……多有趣啊。就连在大众传媒和一般人的想象中,游戏设计师们干的也应该是类似这样的工作:他们(经常也有她..._puzzle任务

3.无重复字符的最长子串-leetcode第三题_获取一个字符串的最大无重复字符的子串,要求性能最优-程序员宅基地

文章浏览阅读148次。3. 无重复字符的最长子串话不多说,上答案。(ps:学习记录,并非最优解,仅供参考。)int lengthOfLongestSubstring(char* s) { int maxLen = 0; int len = 0; char *p = s; //当前指针位置 char *ps = s; //当前字串开始位置 char *pc = s;//..._获取一个字符串的最大无重复字符的子串,要求性能最优

随便推点

【GateWay】 微服务网关_springcloud 网关挂了会怎么样-程序员宅基地

文章浏览阅读952次。一、微服务网关介绍1.1 存在的问题在分布式项目中,不同的微服务有不同的网络地址,而外部的客户端完成一个业务需求时,可能涉及到多个微服务接口,若让客户端直接与多个微服务通信,会带来以下问题:业务复杂,客户端会多次请求不同的微服务,增加了业务处理时间和业务复杂度 存在跨域的问题 认证复杂,各个微服务都需要先对用户的请求进行身份认证 安全问题,直接将各个微服务模块都暴露给客户端 访问困难,根据实际情况,部分微服务设置了防火墙等方式,无法直接访问 重构复杂,随着项目咖啡啊,若项目需要重新划分_springcloud 网关挂了会怎么样

JDBC——用JDBC连接MySQL数据库实现简单登录注册程序(java web)_eclipse使用jdbc访问数据库开发一个登陆验证程序,用户名密码存放在数据库tb_user-程序员宅基地

文章浏览阅读2k次,点赞4次,收藏29次。1. 工程文件工作软件我用的是eclipse和MYSQL 8.0连接数据库用的驱动JDBC.jar一定要有,怎么用网上有教程2.数据库样式3.DBUtil.javapackage com.imooc.jdbc; import java.sql.Connection;import java.sql.DriverManager; //连接数据库public class DBUtil { private static final String URI = "jdbc:mysql://_eclipse使用jdbc访问数据库开发一个登陆验证程序,用户名密码存放在数据库tb_user

Django+Vue,前后端分离,实现用户权限认证_django+vue oauth认证登录-程序员宅基地

文章浏览阅读5.6k次,点赞12次,收藏73次。网上教程一大堆,要么思路不够清晰,要么给你扔一大段代码,只有几行注释。。。。看来我这个,你奶奶来都能实现前后端分离用户权限认证!Django采用token认证方式,使用 rest_framework_simplejwt 库配置权限认证。1、安装第三方库:pip install rest_frameworkpip install rest_framework_simplejwt2、项目根目录settings.py配置文件中写入以下配置项//settings.py //INSTALLED_A_django+vue oauth认证登录

android imageview中 scaletype 与 宽度固定高度自适应_scaletype 按照高度适配-程序员宅基地

文章浏览阅读1.6k次。原文地址:https://blog.csdn.net/qq_32515625/article/details/71700080这是scaletype的几乎所有展示 http://blog.csdn.net/larryl2003/article/details/6919513下面是 imageview 宽度固定,高度自适应的方法 <ImageView android:..._scaletype 按照高度适配

Java实现监听文件变化的监听器_java common.io 监听文件新增,读取完毕后加后缀名-程序员宅基地

文章浏览阅读1.4w次,点赞9次,收藏49次。1、准备 commons-io 2.0 以上版本Jar包,这里我才用 Maven 库依赖<dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.4</version>&l_java common.io 监听文件新增,读取完毕后加后缀名

JAVA字符串相同,equals判断却不相等的问题解决_java俩个大字符串equals为啥不等-程序员宅基地

文章浏览阅读4.6k次,点赞3次,收藏4次。String sta = "中国";//自定义的数据或生成的数据String stb = "中国";//数据库等存储软件查询出来的System,out.println(StringUtils.equals(sta,stb));false当需要判断两个字符串是否相等时,肉眼发现,两个字符串并没有区别之处这时就是字符串中可能包含不可见的字符,下面为大家提出一种解决方案解决方法:sta = sta.replaceAll("\\p{C}", "");//替换字符串中不可见字符s..._java俩个大字符串equals为啥不等

推荐文章

热门文章

相关标签