1.Dubbo和OpenFeign的简介
- Dubbo一个高性能rpc框架,用于构建分布式微服务架构,它提供了服务注册与发现,负载均衡,容错机制等功能。Dubbo具有高性能和低延迟的特点,适合于大规模的分布式系统。
- OpenFeign一个基于Java的声明式HTTP客户端框架,它简化了编写远程调用代码的过程。OpenFeign允许开发人员通过编写接口的方式定义对远程服务的访问,然后通过注解来配置请求参数、路径等信息。OpenFeign会根据接口的定义自动生成具体的实现代码。它还提供了负载均衡、错误处理等功能,可以与Spring Cloud等微服务框架无缝集成。
2.Dubbo和OpenFeign的区别
- 协议支持:Dubbo支持多种协议,包括Dubbo协议、HTTP协议、RMI等。OpenFeign主要使用HTTP协议进行通信。
- 使用方式:Dubbo更加底层,需要显式定义接口和实现类,并配置各种参数。OpenFeign则更加注重于声明式的编程模型,通过定义接口和注解来实现远程调用,减少了手动编写具体实现的工作。
- 生态系统:Dubbo是一个独立的RPC框架,它提供了完整的分布式服务治理的解决方案。OpenFeign则是Spring Cloud生态系统中的一部分,与其他Spring Cloud组件(如Eureka、Ribbon、Hystrix等)紧密集成,提供了更全面的微服务开发解决方案。
- 功能特性:Dubbo提供了更多的功能特性,如负载均衡、容错机制、服务注册与发现等,适合于大规模的分布式系统。OpenFeign则更加关注于RESTful风格的接口调用,适用于构建轻量级的微服务。
3.SpringCloud集成Dubbo
- 添加pom
<!--dubbo-->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.15</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.dubbo/dubbo-registry-nacos -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-registry-nacos</artifactId>
<version>2.7.15</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-metadata-definition-protobuf</artifactId>
<version>2.7.15</version>
</dependency>
- 服务端和消费端配置
dubbo:
application:
name: vector-member # 与服务名一致即可
logger: slf4j
# 元数据中心 local 本地 remote 远程 这里使用远程便于其他服务获取
# 注意 这里不能使用 本地 local 会读取不到元数据
metadataType: remote
protocol:
# 设置为 tri 即可使用 Triple 3.0 新协议
# 性能对比 dubbo 协议并没有提升 但基于 http2 用于多语言异构等 http 交互场景
# 使用 dubbo 协议通信
name: dubbo
# dubbo 协议端口(-1表示自增端口,从20880开始)
port: -1
serialization: hessian2
registry:
address: nacos://localhost:8848?username=nacos&password=nacos
check: false
metadata-report:
address: nacos://localhost:8848?username=nacos&password=nacos
provider:
version: 1.0.0
consumer:
version: 1.0.0
# 禁止消费者启动时检查提供者是否可用
check: false
- 公共模块声明远程调用接口
- 服务提供者实现接口编写服务业务
- 服务消费者使用@DubboReference注入接口,调用服务方法。
4.踩坑记录
- 未发现提供者
No provider available for the service.dubbo xxxxxxxx
解决方法: 如下图dubbo在启动时会默认检测@DubboReference标注的提供端服务是否可用,不可用则抛出No provider available for the service.dubbo xxxxxxxx. 因此我们只要在consumer禁用检查即可.
这也是两个业务模块互相调用的配置项。
- 类型转化异常
java.lang.ClassCastException: class java.util.HashMap cannot be cast to class com.vector.score.vo.ArtistVO (java.util.HashMap is in module java.base of loader ‘bootstrap’; com.vector.score.vo.ArtistVO is in unnamed module of loader ‘app’)
这个原因可能是配置了允许序列化泛化调用配置引起的.
- 序列化报错
This serialization only supports google protobuf objects, current object class is: java.lang.Long
可以通过debug 观察远程调用结果了解. 该错误是强制类型转化错误. dubbo默认hession2序列化.基本类型不变.但对象传输会变为k-v形式.应该转为map.
倘若使用protobuf 也是不支持对象传输.需要转为map并引入
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-metadata-definition-protobuf</artifactId>
<version>2.7.15</version>
</dependency>