Dubbo--高性能RPC框架

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 请求访问消费者端点,并在日志中查看服务调用的详细信息。
  • 19
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值