SpringCloud之Dubbo
1.简介
Apache Dubbo 是一款高性能、轻量级的开源 Java RPC 框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。
由于dubbo是针对二进制处理,所以效率最高。
2.SpringCloud集成Dubbo
注意事项
由于Dubbo语法不同于OpenFeign,OpenFeign只需要发现服务然后创建的方法与需要使用的一致即可。
Dubbo需要使用时需要保证有一个公共的微服务提供接口,生产者需要实现接口以及方法,消费者只需要调用方法即可。
本文使用的是nacos作为注册中心。
公共类编写
public interface DiscoveryService {
Integer getCount();
}
生产者
1.导入Maven依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
<!-- springBoot集成dubbo的依赖 -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.8</version>
</dependency>
<!-- 微服务中依赖 -->
<dependency>
<groupId>com.quick</groupId>
<artifactId>common-api</artifactId>
<version>1.0.0</version>
</dependency>
2.配置文件编写
bootstrap.yml
spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
config:
server-addr: 127.0.0.1:8848
refresh-enabled: true
file-extension: yaml
namespace: 3a22c228-8b7d-4e37-b68b-2014a5b3349f
application:
name: test
server:
port: 8081
dubbo:
application:
name: test
registry:
address: nacos://127.0.0.1:8848
# 配置dubbo的连接,dubbo的连接是长时间有效的websocket请求
protocol:
name: dubbo
port: 20880
3.编写启动类
@SpringBootApplication
@EnableDiscoveryClient
@EnableDubbo
public class NacosApplication {
public static void main(String[] args) {
SpringApplication.run(NacosApplication.class,args);
}
}
EnableDiscoveryClient主要是为了将服务自动配置到nacos中
EnableDubbo主要是为了激活dubbo的配置,会扫描dubbo的接口类。
4.编写dubbo服务
@Component
@DubboService(version = "1.0.0",interfaceClass = DiscoveryService.class)
public class DiscoveryServiceImpl implements DiscoveryService {
@Value("${test.count}")
private Integer count;
@Override
public Integer getCount() {
return count;
}
}
注意事项
之前使用dubbo的注解为@Service
2.7以上版本已经不推荐使用了,由于与spring的注解@Service不太好区分,进行了调整。
5.启动服务
消费者
1.导入Maven依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.8</version>
</dependency>
<dependency>
<groupId>com.quick</groupId>
<artifactId>common-api</artifactId>
<version>1.0.0</version>
</dependency>
2.配置文件编写
server:
port: 8088
spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
application:
name: dubbo
dubbo:
application:
name: dubbo
registry:
address: nacos://127.0.0.1:8848
protocol:
name: dubbo
port: 20881
注意事项
消费者的dubbo端口不能与生产者dubbo端口一致,dubbo相当于一个额外的服务。
3.编写启动类
@SpringBootApplication
@EnableDiscoveryClient
@EnableDubbo
public class DubboApplication {
public static void main(String[] args) {
SpringApplication.run(DubboApplication.class,args);
}
}
4.编写调用controller
@RestController
@RequestMapping("/test")
public class TestController {
@DubboReference(version = "1.0.0",interfaceClass = DiscoveryService.class)
private DiscoveryService discoveryService;
@GetMapping
public Integer get(){
return discoveryService.getCount();
}
}
在消费者端,使用
@DubboReference
注解可以声明一个对Dubbo服务的引用。这个注解告诉Dubbo框架,在需要远程调用服务时,应该通过Dubbo协议与注册中心(比如Nacos)获取提供者的地址,并将其动态注入到当前的微服务中。
5.启动服务
当 Dubbo 服务启动时,它会自动将服务的提供者信息注册到 Nacos 中,并且如果配置了消费者(即引用了其他 Dubbo 服务),也会将消费者的信息注册到 Nacos 中。
OpenFeign跟Dubbo的区别
- 通信协议:
- Dubbo: 默认使用自定义的Dubbo协议进行通信,这是一种二进制的RPC协议,专门设计用于高效的服务调用。Dubbo也支持其他协议如HTTP和REST,但主打的还是高性能的Dubbo协议。
- OpenFeign: 主要基于HTTP协议,通过HTTP请求和响应进行通信。它更适合与遵循RESTful风格的服务集成和通信。
- 服务治理:
- Dubbo: 提供了完善的服务治理能力,包括服务注册与发现、负载均衡、服务降级、容错处理(如重试、容错集群、快速失败等)、服务监控等。Dubbo可以对服务进行精细的管理和控制。
- OpenFeign: 主要专注于简化HTTP请求的编写和调用,对于服务治理的支持相对有限。OpenFeign通常与服务发现工具(如Eureka、Consul等)结合使用,但本身并不提供完整的服务治理功能。
- 使用场景:
- Dubbo: 更适合构建传统的面向服务的架构,特别是在大规模的分布式系统中,对服务的高性能、高可用和服务治理需求较为突出的场景。
- OpenFeign: 更适合构建基于RESTful API的微服务架构,用于简化和标准化HTTP API的调用,尤其是在前后端分离、微服务化程度较高的场景中使用较多。
n通常与服务发现工具(如Eureka、Consul等)结合使用,但本身并不提供完整的服务治理功能。
- 使用场景:
- Dubbo: 更适合构建传统的面向服务的架构,特别是在大规模的分布式系统中,对服务的高性能、高可用和服务治理需求较为突出的场景。
- OpenFeign: 更适合构建基于RESTful API的微服务架构,用于简化和标准化HTTP API的调用,尤其是在前后端分离、微服务化程度较高的场景中使用较多。