目录
1、介绍
2、代码实现
2.1 抽取公共模块
2.2 改造服务提供者
2.3 改造服务消费者
3、启动测试
1、介绍
Dubbo有两种使用方式:
1、基于SOA的思想,将一个单体架构拆分为web层和Services层,然后web和services借助Dubbo框架进行数据交互。 2、SpringCloud 整合Dubbo。
这篇博客所要介绍的就是第二种。
首先我们要想,为什么SpringCloud 要整合Dubbo?
在SpringCloud中会有多个微服务,不同的微服务访问一样的数据库,每个微服务都需要进行服务注册和服务发现,这个时候就要用到注册中心Nacos。
在微服务当中,各个服务之间如果要进行通信,要进行调用的话,使用的就是Feign。
那Feign这种协议究竟好不好呢?
Feign其实基于Http协议(应用层),调用的是REST风格的API 来完成数据交互容易成为性能瓶颈。
Dubbo框架的通信协议采用TCP协议(数据传输层)。
看下图:
我们可以看到Http 协议位于七层网络协议的应用层,TCP协议位于数据传输层,可以看到Http协议就是对TCP协议的封装,由于它做了更深层次的封装,所以它的效率可能就会低一些,特别是在高并发场景下性能可能会成为瓶颈。
所以这个时候,有的开发人员就会想了,既然Feign这个协议效率会存在瓶颈,我为什么不把Dubbo拿进来替换Feign呢?
哎,这个就是Dubbo 在SpringCloud 中的意义。
Dubbo框架的通信协议采用RPC协议来进行数据传输的,属于传输层协议,Dubbo默认通过Netty构造TCP长连接的方式进行通信,性能较高,使用SpringCloud整合Dubbo,那就是强强联合。
随着技术不断进步,现在Dubbo可以整合到Dubbo中去了。
借助Spring Cloud Alibaba提供了微服务开发的一站式解决方案,我们可以很轻松的完成Dubbo的整合。
在SpringCloud 中加入了 Dubbo,我们的架构整体就会发生了变化,我们的客户端请求网关,网关将请求路由到微服务,微服务呢需要进行注册中心的配置以及配置中心的管理,当然,各个微服务之间进行调用就不再是Feign,而是Dubbo。
2、代码实现
介绍完Dubbo在springcloud 中 的作用,接下来我们就进入代码实战。
这里使用的Demo是以前写过的。具体看这个专栏的文章:SpringCloud_一切总会归于平淡的博客-CSDN博客
以前我们是使用Feign进行服务之间的通信,现在我们将其改造为Dubbo。
2.1 抽取公共模块
抽取公共模块其实是比较简单的,我们来看看实现步骤:
1、创建dubbo-api模块
2、抽取公共模块
这里的实体类其实也可以放到另一个模块里然后进行引入,但是我太懒了,直接拉到dubbo-api模块来了,大家根据自己的习惯来吧。
2.2 改造服务提供者
我们接下来去修改user-service实现dubbo-api中的UserService接口。并使用@DubboService注解替换@Service对外暴露dubbo服务。
1、首先我们要先在user-service 中引入依赖。
代码语言:javascript复制<!--nacos注册中心的依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--springcloud alibaba dubbo依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>
<dependency>
<groupId>com.jie.demo</groupId>
<artifactId>dubbo-api</artifactId>
<version>1.0</version>
</dependency>
2、编写UserService实现类。
这样我们就向外暴露一个Dubbo服务。
3、编写application.yml 文件
代码语言:javascript复制dubbo:
protocol:
name: dubbo
port: 20881
registry:
address: spring-cloud://localhost #使用SpringCloud中的注册中心
scan:
base-packages: com.jie.user.service #dubbo中包扫描
2.3 改造服务消费者
1、首先在order-service 中引入依赖。
代码语言:javascript复制<!--nacos注册中心的依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--springcloud alibaba dubbo依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>
<dependency>
<groupId>com.jie.demo</groupId>
<artifactId>dubbo-api</artifactId>
<version>1.0</version>
</dependency>
2、使用@DubboReference引入Dubbo服务,调用远程服务。
3、编写application.yml 文件
代码语言:javascript复制#dubbo配置
dubbo:
registry:
address: spring-cloud://localhost #使用cloud的注册中心
consumer:
check: false #dubbo默认有启动检查
retries: 0 #dubbo内置的重试机制
3、启动测试
重启提供者和消费者的服务,然后发送一个请求测试。
注意:
实体类一定要实现序列化接口!!!