一、前言
** Dubbo是阿里巴巴公司开源的一个高性能、轻量级的Java RPC框架,用于构建分布式服务架构。Dubbo提供了三大核心能力:面向接口的远程方法调用、智能容错和负载均衡,以及服务自动注册和发现。**
二、Dubbo的特点
** 面向接口代理的高性能RPC调用**:提供高性能的基于代理的远程调用能力,服务以接口为粒度,为开发者屏蔽远程调用底层细节。
** 智能负载均衡**:内置多种负载均衡策略,智能感知下游节点健康状况,显著减少调用延迟,提高系统吞吐量。
** 服务自动注册与发现**:支持多种注册中心服务,服务实例上下线实时感知。
** 高度可扩展能力**:遵循微内核+插件的设计原则,所有核心能力如Protocol、Transport、Serialization被设计为扩展点,平等对待内置实现和第三方实现。
** 运行期流量调度**:内置条件、脚本等路由策略,通过配置不同的路由规则,轻松实现灰度发布、同机房优先等功能。
** 可视化的服务治理与运维**:提供丰富服务治理、运维工具,随时查询服务元数据、服务健康状态及调用统计,实时下发路由策略、调整配置参数。
三、Dubbo框架的应用场景
** 微服务架构**:Dubbo框架提供了服务治理、集群容错、负载均衡等功能,适用于构建大规模微服务架构。
** RPC远程调用**:Dubbo框架基于RPC协议进行远程调用,适用于构建分布式系统中不同服务之间的通信。
** 分布式服务治理**:Dubbo框架提供了服务注册、发现、动态路由等功能,适用于管理分布式系统中的服务。
** 服务监控**:Dubbo框架提供了丰富的监控功能,可以监控服务的运行状态、性能指标等。
四、实战案例
** 关于Nacos的解释与下载安装,请参考我的文章** 《微服务:Nacos简介以及安装部署》
项目整体结构
dubbo-api: 该模块只定义了接口
dubbo-provider: 该模块实现了interface模块的具体接口;接口服务提供者
dubbo-consumer: 该模块接口服务的消费者,通过dubbo远程调用provider服务。
1. 父工程依赖管理
** 我们构建一个父子工程项目**
java
<groupId>com.demo</groupId>
<artifactId>demo-dubbo-nacos</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>demo-dubbo-nacos-api</module>
<module>demo-dubbo-nacos-provider</module>
<module>demo-dubbo-nacos-consumer</module>
</modules>
2. dubbo-api接口定义
2.1 依赖管理
java
<parent>
<artifactId>demo-dubbo-nacos</artifactId>
<groupId>com.demo</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>demo-dubbo-nacos-api</artifactId>
2.2 定义服务接口
** 只定义接口,不需要实现接口**
java
public interface ServiceA {
String greet(String name);
}
3. 服务提供者dubbo-provider
3.1 依赖管理
java
<parent>
<artifactId>demo-dubbo-nacos</artifactId>
<groupId>com.demo</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>demo-dubbo-nacos-provider</artifactId>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<spring-cloud.version>Greenwich.SR2</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter</artifactId>
<version>2.1.2.RELEASE</version>
<exclusions>
<exclusion>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-context</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-dubbo</artifactId>
<version>2.1.2.RELEASE</version>
</dependency>
<dependency>
<groupId>com.demo</groupId>
<artifactId>demo-dubbo-nacos-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-nacos-discovery</artifactId>
<version>2.1.1.RELEASE</version>
<exclusions>
<exclusion>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-context</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-context</artifactId>
<version>2.1.1.RELEASE</version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.1.1.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.1.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
3.2 实现api中的接口
java
@Service(
version = "1.0.0",
interfaceClass = ServiceA.class,
loadbalance = "roundrobin"
)
public class ServiceAImpl implements ServiceA {
public String greet(String name) {
// 具体业务实现
return "hello, " + name;
}
}
3.3 配置文件
java
server.port=8081
spring.application.name=demo-dubbo-nacos-provider
dubbo.scan.base-packages=com.demo.dubbo.nacos
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880
dubbo.registry.address=spring-cloud://localhost
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
4. 服务消费者dubbo-consumer
4.1 依赖管理
java
<parent>
<artifactId>demo-dubbo-nacos</artifactId>
<groupId>com.demo</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>demo-dubbo-nacos-consumer</artifactId>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.1.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter</artifactId>
<version>2.1.2.RELEASE</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-dubbo</artifactId>
<version>2.1.2.RELEASE</version>
</dependency>
<dependency>
<groupId>com.demo</groupId>
<artifactId>demo-dubbo-nacos-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-nacos-discovery</artifactId>
<version>2.1.1.RELEASE</version>
<exclusions>
<exclusion>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-context</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-context</artifactId>
<version>2.1.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.5</version>
</dependency>
</dependencies>
4.2 配置文件
java
server.port=8082
spring.application.name=demo-dubbo-nacos-consumer
dubbo.cloud.subscribed-services=demo-dubbo-nacos-provider
dubbo.scan.base-packages=com.demo.dubbo.nacos
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
4.3 测试controller
java
package com.demo.dubbo.nacos;
import com.demo.dubbo.nacos.api.ServiceA;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestController {
@Reference(version = "1.0.0",
interfaceClass = ServiceA.class)
private ServiceA serviceA;
@GetMapping("/greet")
public String greet(String name) {
return serviceA.greet(name);
}
}
5. 运行结果
5.1 启动Nacos
5.2 启动服务提供者provider与服务消费者consumer
5.3 在浏览输入地址
调用成功
五、说明
** 在Spring Boot中,即使不添加@EnableDubbo注解,也可以使用Dubbo,这主要是因为Dubbo官方提供了一个DubboAutoConfiguration自动配置类。这个自动配置类会在Spring Boot启动时自动扫描项目中与Dubbo相关的类,并将它们注册到Dubbo容器中,使得Dubbo能够正常工作。**
具体来说,DubboAutoConfiguration会自动判断当前应用是否引入了Dubbo的相关依赖。如果引入了,那么就会自动配置Dubbo的相关组件;如果没有引入,那么就不会进行任何操作。因此,在Spring Boot项目中,即使没有显式地使用@EnableDubbo注解,只要引入了Dubbo的依赖,并且配置了相应的Dubbo属性(如服务提供者的地址、服务消费者的引用等),就可以使用Dubbo进行远程服务调用。
此外,Spring Boot与Dubbo的整合还有多种方式,比如:
①. 导入dubbo-starter,在application.properties配置属性,使用@Service(暴露服务)和@Reference(引用服务)。这种方式可以显式地使用Dubbo的注解,但不需要添加@EnableDubbo注解。
②. 保留Dubbo的XML配置文件,导入dubbo-starter,并使用@ImportResource导入Dubbo的配置文件。这种方式可以使用XML来配置Dubbo的服务,同样不需要添加@EnableDubbo注解。
** 总的来说,在Spring Boot中使用Dubbo时,是否添加@EnableDubbo注解并不是必须的,可以通过其他方式来配置和使用Dubbo。**
** 以上就是一个完整的springboot整合dubbo以Nacos为注册中心的入门案例,希望本文对你有所帮助。**