Dubbo 整合SpringCloud gateway, Hystrix
本文只是讨论怎么让Dubbo可以像SpringCloud一样开发微服务,仅供参考
因为很少碰到Dubbo项目,大部分项目都是Spring Cloud,只短暂经历过两个Dubbo项目。Dubbo项目没有gateway ,没有配置中心,微服务是怎么搭建的。参与的其中一个项目做得很别扭,其中一个项目直接从Spring Cloud把组件拿过来用。那么网关有了,熔断也有了,配置中心也有了。
zookeeper安装和配置省略
引入Spring Cloud gateway
引入pring cloud gateway依赖
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
<version>2.0.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
<version>2.0.0.RELEASE</version>
<!--SpringBoot版本-->
</dependency>
<dependency>
<groupId>io.projectreactor.ipc</groupId>
<artifactId>reactor-netty</artifactId>
<version>0.7.6.RELEASE</version>
</dependency>
</dependencies>
应用依赖:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.0.9.RELEASE</version> <!-- 根据你的Spring Boot版本选择 -->
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.0.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.10</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
<version>2.0.2.RELEASE</version>
</dependency>
</dependencies>
gateway yml 配置:
server:
port: 9001
spring:
application:
name: gateway
cloud:
zookeeper:
connect-string: localhost:2181
discovery:
#这里一定指定一个地方,services是默认的,可以不写
root: /services
gateway:
discovery:
locator:
enabled: true
lower-case-service-id: true
enabled: true
routes:
- id: web-filter
uri: lb://user
predicates:
- Path=/api/user/**
应用properties配置:
server.port=9090
spring.application.name=user
dubbo.scan.base-packages=com.wkw
spring.cloud.zookeeper.connect-string=127.0.0.1:2181
#这里一定指定一个地方,services是默认的,可以不写
spring.cloud.zookeeper.discovery.root=/services
#这里一定要和server.port一样不然gateway无法通过zookeeper访问
spring.cloud.zookeeper.discovery.instance-port=9090
dubbo.protocol.name=dubbo
dubbo.protocol.port=666
dubbo.registry.address=zookeeper://127.0.0.1:2181
通过zookeeper查看服务已经注册上来
添加@EnableDiscoveryClient注解,发现微服务:
gateway成功访问应用:
引入Hystrix
引入配置:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
<version>2.0.4.RELEASE</version>
</dependency>
这里说一下,就是Spring Cloud 的组件都可以通过springboot集成,根据spring cloud对spring boot版本的支持在spring官网找到特定的Hystrix版本,根据spring boot 2.0.9.RELEASE版本找对应版本的Hystrix版本
添加注解@EnableCircuitBreaker:
写一个错误熔断的方法,制造一个错误:
既然Hystrix成功了,精力有限其他组件就不演示,应该也可以引进来,都是由springboot集成到应用中。以前经历的项目把Config也集成到进来作配置中心。我发现他们还把Skywalking引进来作链路追踪
以下都是我认为Dubbo和Spring Cloud框架的区别,Dubbo完全不需要重复制造轮子,直接引用spring cloud的组件就可以
Dubbo | Spring Cloud | |
---|---|---|
注册中心 | zookeeper,nacos | eureka, nacos |
服务调用方式 | RPC (Netty) | RPC,Rest API(HTTP) |
服务网关 | Spring Cloud Netflix Zuul, Spring Cloud gateway | Spring Cloud Netflix Zuul,Spring Cloud gateway |
断路器 | 自带,Spring Cloud Netflix Hystrix | Spring Cloud Netflix Hystrix |
分布式配置 | Spring CLoud Config | Spring CLoud Config |
服务跟踪 | Spring Cloud Sleuth | Spring Cloud Sleuth |
消息总线 | Spring CLoud Bus | Spring CLoud Bus |
数据流 | Spring Cloud Stream | Spring Cloud Stream |
批量任务 | Spring Cloud Task | Spring Cloud Task |
限流 | Spring Cloud Netflix Hystrix,Spring Cloud Alibaba Sentinel | Spring Cloud Netflix Hystrix,Spring Cloud Alibaba Sentinel |
总结
总结一下,既然Dubbo可以用Spring Cloud的组件,那反过来使用Spring Cloud,把Dubbo的RPC引进来不就好了,Spring Cloud 只需要在Maven设置一个总的配置,组件版本可以自动匹配。把Feign拿掉,就可以使用Dubbo的netty通信
顺便说下,阿里云提供了一个dubbo案例,https://github.com/aliyun/alibabacloud-microservice-demo/tree/master