文章目录
Dubbo介绍
Dubbo基本架构
官方文档:https://dubbo.incubator.apache.org/zh-cn/overview/home/
官方博客:https://dubbo.incubator.apache.org/zh-cn/blog/2023/02/23/一文帮你快速了解-dubbo-核心能力/
Dubbo是什么,它能做什么
Apache Dubbo 是一款RPC服务开发框架,用于解决微服务架构下的服务治理与通信问题,官方提供了 Java、Golang 等多语言 SDK 实现。使用 Dubbo 开发的微服务原生具备相互之间的远程地址发现与通信能力, 利用 Dubbo 提供的丰富服务治理特性,可以实现诸如服务发现、负载均衡、流量调度等服务治理诉求。Dubbo 被设计为高度可扩展,用户可以方便的实现流量拦截、选址的各种定制逻辑。
Dubbo 的主要功能包括以下几个方面:
1.远程服务调用
Dubbo 提供了透明的 RPC (Remote Procedure Call) 远程服务调用机制。应用程序可以像调用本地方法一样调用远程服务,而不必关心底层的网络通信细节。
2.服务注册与发现
Dubbo 通过服务注册中心(如 Zookeeper、Nacos 等)进行服务的动态注册与发现。服务提供者启动时将自身信息注册到注册中心,消费者通过注册中心发现并调用服务,这样系统可以自动管理服务的上线和下线。
3.负载均衡
Dubbo 提供了多种负载均衡策略,如随机、轮询、最少活跃调用等。通过负载均衡机制,Dubbo 可以将请求合理地分配到多个服务实例,确保系统的高可用性和性能。
4.服务降级和熔断
当某个服务出现故障或性能问题时,Dubbo 可以通过服务降级和熔断机制防止故障蔓延,保护系统的整体稳定性。消费者可以配置服务降级策略,当某个服务不可用时,执行本地的降级逻辑。
5.集群容错
Dubbo 提供了集群容错机制,如失败重试、失败切换、失败快速返回等。根据业务场景和需求,用户可以选择合适的容错策略,确保服务的高可用性。
6.流量控制
Dubbo 支持服务限流,可以限制某个服务的最大并发调用次数,防止服务被过载请求拖垮,保证系统在高并发场景下的稳定运行。
7.协议和传输方式扩展
Dubbo 默认支持多种传输协议和序列化方式,开发者可以根据业务需求选择合适的协议(如 Dubbo 协议、HTTP、REST 等)和序列化方式(如 Hessian、Protobuf 等)。
8 接口监控和治理
Dubbo 提供了丰富的监控功能,可以统计每个接口的调用次数、响应时间、失败率等,帮助开发者监控系统的运行状态。还支持服务的动态治理功能,运维人员可以在线调整服务的权重、限流策略等。
总的来说,Dubbo 主要解决了微服务架构中各个服务之间的通信问题,提供了高效的服务调用、注册发现、负载均衡、容错处理等功能,帮助开发者构建可扩展的分布式系统。
Dubbo入门示例
1.准备工作
确保你已经安装了以下工具:
1.JDK:Java Development Kit
2.Maven:用于构建和管理项目的工具
3.IDE:如 IntelliJ IDEA 或 Eclipse
4.ZooKeeper:作为服务注册中心的服务器(可以从 ZooKeeper 官网 下载并启动)
2.创建Maven项目
创建两个 Maven 项目:一个用于服务提供者(Provider),一个用于服务消费者(Consumer)。
3.添加依赖
3.1提供者服务
服务提供者在 pom.xml 中添加以下依赖:
<dependencies>
<!-- Spring Boot Starter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- Dubbo Spring Boot Starter -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>3.0.12</version> <!-- 使用最新稳定版本 -->
</dependency>
<!-- ZooKeeper Client -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>5.3.0</version> <!-- 使用最新稳定版本 -->
</dependency>
<!-- Spring Boot Starter Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
3.2消费者服务
服务消费者在 pom.xml 中添加以下依赖:
<dependencies>
<!-- Spring Boot Starter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- Dubbo Spring Boot Starter -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>3.0.12</version> <!-- 使用最新稳定版本 -->
</dependency>
<!-- ZooKeeper Client -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>5.3.0</version> <!-- 使用最新稳定版本 -->
</dependency>
<!-- Spring Boot Starter Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
4.创建服务接口
定义一个简单的服务接口 MyService。
MyService.java
package com.example;
public interface MyService {
String sayHello(String name);
}
5.实现服务接口
实现第4步创建的服务接口,并暴露服务。
MyServiceImpl.java
package com.example;
import org.apache.dubbo.config.annotation.DubboService;
@DubboService // Dubbo 的注解,用于暴露服务
public class MyServiceImpl implements MyService {
@Override
public String sayHello(String name) {
return "Hello, " + name;
}
}
6.配置服务提供者
配置服务提供者的 Spring Boot 应用。
ProviderApplication.java
package com.example;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
@SpringBootApplication
@EnableDubbo // 启用 Dubbo 功能
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
}
application.yml
spring:
application:
name: provider-app
zookeeper:
connect-string: localhost:2181 # ZooKeeper 地址
dubbo:
application:
name: provider-app
registry:
address: zookeeper://localhost:2181 # 注册中心地址
protocol:
name: dubbo
port: 20880 # 服务提供端口
scan:
base-packages: com.example # 扫描服务接口和实现
logging:
level:
root: INFO
com.example: DEBUG
org.apache.dubbo: DEBUG
7.配置服务消费者
配置服务消费者的 Spring Boot 应用。
ConsumerApplication.java
package com.example;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
@SpringBootApplication
@EnableDubbo // 启用 Dubbo 功能
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}
application.yml
spring:
application:
name: consumer-app
zookeeper:
connect-string: localhost:2181 # ZooKeeper 地址
dubbo:
application:
name: consumer-app
registry:
address: zookeeper://localhost:2181 # 注册中心地址
scan:
base-packages: com.example # 扫描服务接口
logging:
level:
root: INFO
com.example: DEBUG
org.apache.dubbo: DEBUG
ConsumerService.java
package com.example;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ConsumerService {
@DubboReference // 注入 Dubbo 服务
private MyService myService;
@GetMapping("/hello")
public String sayHello(@RequestParam String name) {
return myService.sayHello(name); // 调用远程服务
}
}
8.启动 ZooKeeper
下载 ZooKeeper 并启动它。确保 ZooKeeper 在默认的端口(2181)上运行。你可以使用以下命令启动 ZooKeeper(假设你已经下载并解压了 ZooKeeper):
# 启动 ZooKeeper 服务器
bin/zkServer.sh start
9.运行服务提供者
运行 ProviderApplication 类。它会将服务 MyService 注册到 ZooKeeper。你应该看到类似以下的日志信息:
2024-09-11 INFO 12345 --- [main] c.e.ProviderApplication: Starting ProviderApplication using Java 11.0.11 with PID 12345 (path/to/provider.jar started by user in /path/to/project)
2024-09-11 INFO 12345 --- [main] c.e.ProviderApplication: No active profile set, falling back to default profiles: default
2024-09-11 INFO 12345 --- [main] o.a.d.c.c.AbstractConfig: Dubbo application name: provider-app
2024-09-11 INFO 12345 --- [main] o.a.d.c.c.AbstractConfig: Dubbo registry address: zookeeper://localhost:2181
2024-09-11 INFO 12345 --- [main] o.a.d.c.c.AbstractConfig: Dubbo protocol name: dubbo, port: 20880
2024-09-11 INFO 12345 --- [main] o.a.d.c.c.AbstractConfig: Dubbo service: com.example.MyService
2024-09-11 INFO 12345 --- [main] o.a.d.c.c.AbstractConfig: Dubbo service implemented by: com.example.MyServiceImpl
2024-09-11 INFO 12345 --- [main] o.s.b.w.e.t.TomcatWebServer: Tomcat started on port(s): 8080 (http)
2024-09-11 INFO 12345 --- [main] c.e.ProviderApplication: Started ProviderApplication in 1.500 seconds (JVM running for 2.000)
2024-09-11 INFO 12345 --- [main] o.a.d.c.z.ZookeeperRegistry: Register service [com.example.MyService] to registry [zookeeper://localhost:2181]
2024-09-11 INFO 12345 --- [main] o.a.d.c.z.ZookeeperRegistry: Service [com.example.MyService] has been registered
日志详解
1.Dubbo application name:显示 Dubbo 应用名称。
2.Dubbo registry address:显示服务注册中心的地址。
3.Dubbo service:显示暴露的服务信息。
4.Register service to registry:服务已注册到 ZooKeeper。
5.Service has been registered:服务注册成功的确认信息。
10.运行服务消费者
运行 ConsumerApplication 类。它会从 ZooKeeper 获取 MyService 的地址,并通过 HTTP 请求调用服务。你应该看到类似以下的日志信息:
使用curl命令访问服务消费者的 HTTP 端点来测试服务调用。例如:
curl "http://localhost:8081/hello?name=Dubbo"
2024-09-11 INFO 12346 --- [nio-8081-exec-1] c.e.ConsumerService: Handling request: /hello?name=Dubbo
2024-09-11 INFO 12346 --- [nio-8081-exec-1] o.a.d.c.c.AbstractConfig: Invoking remote service [com.example.MyService] method [sayHello] with parameters [Dubbo]
2024-09-11 INFO 12346 --- [nio-8081-exec-1] o.a.d.c.c.AbstractConfig: Remote service invocation completed. Result: Hello, Dubbo
日志详解
1.Handling request:显示请求的处理信息。
2.Invoking remote service:显示远程服务调用的信息。
3.Remote service invocation completed:显示远程服务调用完成的结果。
总结
1.服务提供者:
启动时将服务注册到 ZooKeeper。
输出包含注册中心地址、服务信息和注册成功的日志。
2.服务消费者:
启动时从 ZooKeeper 获取服务信息。
输出包含服务订阅信息、服务找到的日志。
3.访问服务:
使用 HTTP 请求访问消费者端点,并在日志中查看服务调用的详细信息。