应用场景
当你的微服务体系中既有内部服务间需要高性能的RPC通信,又存在需要对外暴露RESTful API的服务时,可以使用Spring Cloud的组件(如Spring Cloud Gateway)作为API网关处理外部请求,并通过Dubbo处理内部高性能服务调用。
此外,在对性能有极高要求的核心服务上,Dubbo的高性能RPC通信能力可以提供显著优势。同时,利用Spring Cloud的其他组件(如配置管理、断路器等)来加强系统的稳定性和可维护性。
Spring Cloud介绍
定位:Spring Cloud是一个全面的微服务生态体系,提供了一系列开箱即用的组件,涵盖了服务发现、配置管理、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话、集群状态管理等微服务架构所需的功能。它基于Spring Boot,易于上手,与Spring生态系统高度整合。
协议:倾向于使用HTTP/RESTful作为服务间通信协议,通过Feign等组件实现服务调用,这使得服务可以跨语言调用,灵活性高,但可能牺牲部分性能。
生态环境:Spring Cloud生态丰富,支持多种注册中心(如Eureka、Consul、Zookeeper)、配置中心、监控工具等,能够快速搭建和管理复杂的微服务架构。
易用性:提供了丰富的自动化配置,减少手动配置,适合快速开发和部署。
Dubbo介绍
定位:Dubbo是一款高性能的RPC框架,专为高并发、低延迟的微服务通信设计,更侧重于服务的调用和治理,提供强大的服务治理功能,如负载均衡、服务路由、故障恢复等。
协议:默认使用Dubbo协议,这是一种高效的二进制协议,适合内部服务间通信,提供高性能的远程调用。同时,Dubbo也支持RESTful等协议。
生态环境:Dubbo虽然起初生态相对较小,但现在已逐渐丰富,特别是官方提供集成插件后,可以更好地融入Spring生态,同时保持其高性能的特性。
定制性和性能:Dubbo提供了较高的可定制性和优化空间,适合对性能有严格要求的场景。它对Java环境优化较多,特别适合Java微服务之间的通信。
集成实践
1. 引入依赖
首先,确保你的pom.xml文件中包含了Dubbo和Spring Boot Starter的依赖。
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
<version>${spring.cloud.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
<version>${spring.cloud.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>${dubbo.version}</version>
</dependency>
<!-- Dubbo Spring Boot Starter -->
<dependency>
<groupId>com.alibaba.spring.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>${dubbo-spring-boot-starter.version}</version>
</dependency>
<!-- Zookeeper客户端 -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>${curator.version}</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>${curator.version}</version>
</dependency>
</dependencies>
2. 配置Dubbo和Zookeeper
在application.yml文件中添加如下配置Dubbo和Spring Cloud以使用Zookeeper作为注册中心,以及配置Gateway路由:
spring:
application:
name: your-service-name
cloud:
zookeeper:
connect-string: ${zookeeper.address}
discovery:
enabled: true
gateway:
discovery:
locator:
enabled: true
routes:
- id: service-route
uri: lb://your-service-name
predicates:
- Path=/api/**
filters:
- StripPrefix=1 # 如果你的API路径需要去除前缀,例如/api/去掉,可以使用此过滤器
dubbo:
application:
name: ${spring.application.name}
metadata-type: remote # 在低版本dubbo中,metadata-type默认为local,会导致dubbo实例元数据获取失败,配置为remote即可解决,或者用高版本dubbo
registry:
address: zookeeper://${zookeeper.address}
parameters:
rootPath: /dubbo/services #这里指定dubbo服务注册到zookeeper的根路径,是为了避免与注册到zookeeper的spring cloud实例冲突,产生class cast异常
protocol:
name: dubbo
port: -1 # 让Dubbo自动分配端口
# 如果你直接配置了Zookeeper地址,则需要在这里指定
zookeeper:
address: 127.0.0.1:2181
3. 启用Dubbo服务
在服务实现类上添加@EnableDubbo注解,并指定接口和协议:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
@SpringBootApplication
@EnableDubbo(scanBasePackages = "com.example.your.service.package")
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
4. Dubbo服务接口与实现
定义Dubbo服务接口并实现它,确保服务接口和实现类被Spring管理,并且服务接口上有正确的@DubboService注解。
// 服务接口
public interface YourService {
String sayHello(String name);
}
// 服务实现
@DubboService(interfaceClass = YourService.class)
public class YourServiceImpl implements YourService {
@Override
public String sayHello(String name) {
return "Hello, " + name;
}
}
总结
通过上述配置,我们成功地将Dubbo和Spring Cloud整合在一起,实现了微服务架构的高性能RPC通信,兼顾使用Spring Cloud生态中的Gateway组件与外部达到负载均衡的通讯。