1、概述
官方文档:https://github.com/apache/dubbo-spring-boot-project/blob/master/README_CN.md
dubbo官方网站:http://dubbo.apache.org/
dubbo Spring Cloud 构建在原生的 Spring Cloud 之上,其服务治理方面的能力可认为是 Spring Cloud Plus, 不仅完全覆盖 Spring Cloud 原生特性,而且提供更为稳定和成熟的实现,特性比对如下表所示:
功能组件 | Spring Cloud | dubbo Spring Cloud |
---|---|---|
分布式配置(distributed configuration) | Git、Zookeeper、Consul、JDBC | Spring Cloud 分布式配置 + dubbo 配置中心 |
服务注册与发现(Service registration and discovery) | Eureka、Zookeeper、Consul | Spring Cloud 原生注册中心 + dubbo 原生注册中心 |
负载均衡(Load balancing) | Ribbon(随机、轮询等算法) | dubbo 内建实现(随机、轮询等算法 + 权重等特性) |
服务熔断(Circuit Breakers) | Spring Cloud Hystrix | Spring Cloud Hystrix + Alibaba Sentinel 等 |
服务调用(Service-to-service calls) | Open Feign、RestTemplate | Spring Cloud 服务调用 + dubbo @Reference |
链路跟踪(Tracing) | Spring Cloud Sleuth + Zipkin | Zipkin、opentracing 等 |
以上对比表格摘自dubbo Spring Cloud官方文档。
而且dubbo Spring Cloud 基于 dubbo Spring Boot 2.7.1 和 Spring Cloud 2.x 开发,无论开发人员是 dubbo 用户还是 Spring Cloud 用户, 都能轻松地驾驭,并以接近“零”成本的代价使应用向上迁移。dubbo Spring Cloud 致力于简化云原生开发成本,以达成提高研发效能以及提升应用性能等目的。
1.1 Spring Cloud 为什么需要RPC
在Spring Cloud构建的微服务系统中,大多数的开发者使用都是官方提供的Feign组件来进行内部服务通信,这种声明式的HTTP客户端使用起来非常的简洁、方便、优雅,但是有一点,在使用Feign消费服务的时候,相比较dubbo这种RPC框架而言,性能堪忧。
虽说在微服务架构中,会讲按照业务划分的微服务独立部署,并且运行在各自的进程中。微服务之间的通信更加倾向于使用HTTP这种简答的通信机制,大多数情况都会使用REST API。这种通信方式非常的简洁高效,并且和开发平台、语言无关,但是通常情况下,HTTP并不会开启KeepAlive功能,即当前连接为短连接,短连接的缺点是每次请求都需要建立TCP连接,这使得其效率变的相当低下。
对外部提供REST API服务是一件非常好的事情,但是如果内部调用也是使用HTTP调用方式,就会显得显得性能低下,Spring Cloud默认使用的Feign组件进行内部服务调用就是使用的HTTP协议进行调用,这时,我们如果内部服务使用RPC调用,对外使用REST API,将会是一个非常不错的选择,恰巧,dubbo Spring Cloud给了我们这种选择的实现方式。
2、示例
2.1 创建父工程
2.1.1 引入依赖
您可以为您的工程引入最新 dubbo-spring-boot-starter
的发布,增加以下依赖到工程的 pom.xml
文件中
<properties>
<spring-boot.version>2.3.0.RELEASE</spring-boot.version>
<dubbo.version>2.7.8</dubbo.version>
</properties>
<dependencyManagement>
<dependencies>
<!-- Spring Boot -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- Apache dubbo -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-dependencies-bom</artifactId>
<version>${dubbo.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>${dubbo.version}</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
</exclusion>
<exclusion>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
</exclusion>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- dubbo Spring Boot Starter -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.8</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
</dependency>
</dependencies>
2.2 创建子工程 dubbo-api
package com.ali.dubbo.api.service;
public interface HelloService {
String hello(String name);
}
2.3 创建子工程 dubbo-provider ,dubbo服务提供方
2.3.1 实现 HelloService
接口
package com.ali.dubbo.provider.service;
import com.ali.dubbo.api.service.HelloService;
import org.apache.dubbo.config.annotation.dubboService;
/**
* @program: dubbo-spring-cloud
* @description:
* @author: geoffrey
* @create: 2021-03-08 19:08
*/
@dubboService
public class HelloServiceImpl implements HelloService {
@Override
public String hello(String name) {
return "hello "+name;
}
}
2.3.2 编写 Spring Boot 引导程序
package com.ali.dubbo.provider;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnablediscoveryClient;
@SpringBootApplication
@EnablediscoveryClient
public class dubboProviderApplication {
public static void main(String[] args) {
SpringApplication.run(dubboProviderApplication.class, args);
}
}
2.3.3 配置 application.yml
server:
port: 8082
spring:
application:
name: dubbo-spring-cloud-provider
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848 #Nacos 服务发现与注册配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口。
main:
allow-bean-deFinition-overriding: true #在 Spring Boot 2.1 以及更高的版本增加该设定,因为 Spring Boot 默认调整了 Bean 定义覆盖行为。
dubbo:
scan:
base-packages: com.ali.dubbo.provider.service #指定 dubbo 服务实现类的扫描基准包
protocol: #dubbo服务暴露的协议配置,其中子属性name为协议名称,port为协议端口(-1 表示自增端口,从 20880 开始)
name: dubbo #Spring 应用名称,用于 Spring Cloud 服务注册和发现。该值在 dubbo Spring Cloud 加持下被视作dubbo.application.name,因此,无需再显示地配置dubbo.application.name。
port: -1
registry: #dubbo 服务注册中心配置
address: nacos://${spring.cloud.nacos.discovery.server-addr}
注意:在暴露dubbo服务方面,推荐使用外部化配置的方式,即指定Java服务实现类的扫描基准包。
dubbo Spring Cloud 继承了 dubbo Spring Boot 的外部化配置特性,也可以通过标注 @dubboComponentScan 来实现基准包扫描。
dubbo.scan.base-packages
:指定 dubbo 服务实现类的扫描基准包dubbo.protocol
:dubbo服务暴露的协议配置,其中子属性name为协议名称,port为协议端口(-1 表示自增端口,从 20880 开始)dubbo.registry
:dubbo 服务注册中心配置,其中子属性address 的值 "spring-cloud://192.168.44.129",说明挂载到 Spring Cloud 注册中心spring.application.name
:Spring 应用名称,用于 Spring Cloud 服务注册和发现。该值在 dubbo Spring Cloud 加持下被视作dubbo.application.name
,因此,无需再显示地配置dubbo.application.name
。spring.main.allow-bean-deFinition-overriding
:在 Spring Boot 2.1 以及更高的版本增加该设定,因为 Spring Boot 默认调整了 Bean 定义覆盖行为。spring.cloud.nacos.discovery
:Nacos 服务发现与注册配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口。
2.4 创建子工程 dubbo_consumer ,服务调用方
2.4.1 通过 @dubboReference
注入 HelloService
package com.ali.dubbo.consumer.controller;
import com.ali.dubbo.api.service.HelloService;
import org.apache.dubbo.config.annotation.dubboReference;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @program: dubbo-spring-cloud
* @description:
* @author: geoffrey
* @create: 2021-03-08 20:32
*/
@RestController
public class HelloController {
@dubboReference
private HelloService helloService;
@GetMapping("/hello")
public String hello() {
return helloService.hello("dubbo!");
}
}
2.4.2 编写 Spring Boot 引导程序
package com.ali.dubbo.consumer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnablediscoveryClient;
@SpringBootApplication
@EnablediscoveryClient
public class dubboConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(dubboConsumerApplication.class, args);
}
}
2.4.3 配置 application.yml
server:
port: 8081
spring:
application:
name: dubbo-spring-cloud-consumer
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848 #Nacos 服务发现与注册配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口。
main:
allow-bean-deFinition-overriding: true #在 Spring Boot 2.1 以及更高的版本增加该设定,因为 Spring Boot 默认调整了 Bean 定义覆盖行为。
dubbo:
scan:
base-packages: com.ali.dubbo.provider.service #指定 dubbo 服务实现类的扫描基准包
protocol: #dubbo服务暴露的协议配置,其中子属性name为协议名称,port为协议端口(-1 表示自增端口,从 20880 开始)
name: dubbo #Spring 应用名称,用于 Spring Cloud 服务注册和发现。该值在 dubbo Spring Cloud 加持下被视作dubbo.application.name,因此,无需再显示地配置dubbo.application.name。
port: -1
registry: #dubbo 服务注册中心配置
address: nacos://${spring.cloud.nacos.discovery.server-addr}
cloud:
subscribed-services: dubbo-spring-cloud-provider #表示要订阅服务的服务名,可以配置'*',代表订阅所有服务,不推荐使用。若需订阅多应用,使用 "," 分割。
3、测试
3.1 启动nacos
访问地址:http://192.168.0.110:8848/nacos/index.html
3.2 启动provider和consumer
访问地址:http://localhost:8081/hello
nacos服务列表
4、示例代码地址
https://gitee.com/xixingzhe2/learn/tree/master/dubbo
参考:
https://www.cnblogs.com/babycomeon/p/11546737.html
https://github.com/apache/dubbo-spring-boot-project/blob/master/README_CN.md