Dubbo--高性能RPC框架

news2024/11/13 8:14:15

文章目录

  • Dubbo介绍
    • Dubbo基本架构
    • Dubbo是什么,它能做什么
  • Dubbo入门示例
    • 1.准备工作
    • 2.创建Maven项目
    • 3.添加依赖
      • 3.1提供者服务
      • 3.2消费者服务
    • 4.创建服务接口
    • 5.实现服务接口
    • 6.配置服务提供者
    • 7.配置服务消费者
    • 8.启动 ZooKeeper
    • 9.运行服务提供者
    • 10.运行服务消费者

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 请求访问消费者端点,并在日志中查看服务调用的详细信息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2128224.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

信号发生器在扫描模式下输出正弦波信号,示波器呈现的波形显示异常与不理想,这是为什么

如下图所示&#xff0c;在信号发生器扫描模式下输出正弦波信号&#xff0c;示波器呈现出的波形显示“异常”“不理想”情况&#xff0c;其原因可能与以下因素有关&#xff1a; 1、扫描速度与示波器刷新率不匹配 如果信号发生器的扫描速率&#xff08;频率变化速度&#xff09;…

Leetcode题解精讲之二叉树的基本理论(分类、四种遍历方式、存储方式)

目录 0 专栏介绍1 二叉树的基本概念2 二叉树的分类3 二叉树的遍历3.1 前序遍历3.1.1 递归实现3.1.2 迭代实现 3.2 中序遍历3.2.1 递归实现3.2.2 迭代实现 3.3 后序遍历3.3.1 递归实现3.3.2 迭代实现 3.4 层序遍历3.4.1 递归实现3.4.2 迭代实现 4 二叉树存储模式5 其他技巧 0 专…

直觉微调——简化语言模型对齐过程

人工智能咨询培训老师叶梓 转载标明出处 预训练语言模型在遵循指令和信任度方面仍有待提高。为了解决这一问题&#xff0c;研究者们提出了监督式微调&#xff08;Supervised Fine-Tuning, SFT&#xff09;和偏好优化&#xff08;Preference Optimization, PO&#xff09;两种方…

算法提高模板强连通分量tarjan算法

AC代码&#xff1a; #include<bits/stdc.h>using namespace std;typedef long long ll; const int MOD 998244353; const int N 2e5 10;//强联通分量模板 //tarjan算法 vector<int>e[N]; int n, m, cnt; int dfn[N], low[N], ins[N], idx; int bel[N];//记录每…

STL容器真的好用吗

大家都在用的c STL就一定是完美无缺的吗&#xff1f; 本文一针见血的指出常见STL顺序容器vector的致命bug。 在Scott Meyers的《Effective C》中&#xff0c;第一个条款明确指出&#xff0c;C是一个语言联邦。 这体现在&#xff1a; ● C&#xff1a;C继承了C语言的基础特性&a…

零基础学习Python(八)—— time模块、request模块、数据分析和自动化办公相关模块、jieba模块、文件操作和os相关模块的简单介绍

1. time模块 time()&#xff1a;获取当前时间戳&#xff0c;是一个数字 localtime()&#xff1a;返回一个time.struct_time对象&#xff0c;里面有年月日时分秒&#xff0c;还有星期几&#xff08;0表示星期一&#xff09;和今年的第几天 import timeprint(time.time()) pri…

我又被Spring的事务坑了,用户兑奖之后,什么东西都没收到!!

没错&#xff0c;我又被事务坑了&#xff01; 即上次的mq发送消息之后&#xff0c;业务代码回滚&#xff0c;导致发了一条中奖消息给用户&#xff01;&#xff01;&#xff0c;这次又被spring的事务坑了 这次是这样的&#xff0c;一个兑奖接口进来&#xff0c;我们先改变了这…

输入一段文字,瞬间生成应用。Furion低代码平台与AI协同工作,展现出非凡的效率与精准。

引言&#xff1a;展示问题背景 在当今快速变化的商业环境中&#xff0c;企业面临着前所未有的挑战。随着数字化转型的加速&#xff0c;企业对应用开发的需求日益增加。然而&#xff0c;传统的应用开发流程通常需要耗费大量时间和资源&#xff0c;从需求分析、设计、编码、测试到…

概念科普|ChatGPT是什么

一、引言 在人工智能的迅猛发展中&#xff0c;ChatGPT作为前沿技术的代表&#xff0c;其原理和运作方式成为了研究和讨论的热点。 常有观点将ChatGPT比喻为一种高级词语接龙&#xff0c;通过海量数据的学习与训练&#xff0c;机器能够根据给定的文本内容续写出下文&#xff0…

小米商业营销陈高铭:品牌应该多方整合,关注高质量营销 | SMARTIES CHINA 2024终审报道②

小米互联网业务部商业营销品牌总经理 陈高铭 近日&#xff0c;SMARTIES CHINA 2024终审活动在苏州音昱水中天落下帷幕。来自各行业的40位品牌广告主代表&#xff0c;历时两天时间&#xff0c;通过紧张的评审和精彩的讨论&#xff0c;从178个优秀入围案例中评选出了每个类别的金…

数据分析-螺旋环状气泡图

1 原理 采用阿基米德螺线原理&#xff0c;即以一个点匀速离开一个固定点的同时又以固定的角速度绕该固定点转动而产生的轨迹。具体原理见&#xff1a;阿基米德螺线。坐标轴公式为&#xff1a; 其中x为横坐标&#xff0c;y为纵坐标&#xff0c;r为离中心点的半径&#xff0c;为坐…

茶叶商家开店拓客线上发展增长生意

部分地区的人群酷爱喝茶&#xff0c;其他地区也有大量购茶者&#xff0c;其爱好者对茶叶的种类、年份季节口感度、价格等有着较高要求&#xff0c;花茶、绿茶、红茶、白茶、龙井、碧螺春、乌龙茶等&#xff0c;国内国外庞大市场&#xff0c;不能仅局限于本地附近客户&#xff0…

【ArcGIS】栅格计算器原理及案例介绍

ArcGIS&#xff1a;栅格计算器原理及案例介绍 栅格计算器&#xff08;Raster Calculator&#xff09;原理介绍案例案例1&#xff1a;计算栅格数据平均值 参考 栅格计算器&#xff08;Raster Calculator&#xff09;原理介绍 描述&#xff1a;在类似计算器的界面中&#xff0c;…

跨境独立站支付收款常见问题排雷篇1.0丨出海笔记

最近小伙伴们在社群讨论挺多关于独立站支付问题的&#xff0c;鉴于不少朋友刚接触独立站&#xff0c;我整理了一些独立站支付相关的问题和解决方案&#xff0c;供大家参考&#xff0c;百度网上一堆媒体的那些软文大家就别看了&#xff0c;都是软广或者抄来抄去&#xff0c;让大…

华为 昇腾 310P 系列 AI 处理器支持 140Tops 的 AI 算力。

1、产品简介 模组是基于昇腾 310P 系列 AI 处理器设计而成&#xff0c;可实现图像、视频等多种数据分析 与推理计算。超强的视频编解码能力以及支持 140Tops 的 AI 算力。在边缘侧及端侧的嵌入式计算 领域&#xff0c;有着极高的性价比&#xff0c;具有超强算力、 超高能效、…

2024最新版mysql数据库表的查询操作-总结

序言 1、MySQL表操作(创建表&#xff0c;查询表结构&#xff0c;更改表字段等)&#xff0c; 2、MySQL的数据类型(CHAR、VARCHAR、BLOB,等)&#xff0c; 本节比较重要&#xff0c;对数据表数据进行查询操作&#xff0c;其中可能大家不熟悉的就对于INNER JOIN(内连接)、LEFT JOIN…

产业互联网新星闪耀,“太行云商”引领传统产业数字化革命

产业互联网新星升起 晋城&#xff0c;作为我国能源及相关产业的重要基地&#xff0c;一直面临着信息协同不畅、存货供需失衡、资金融通困难等诸多挑战。 2023年&#xff0c;为了应对这些难题&#xff0c;晋城市政府携手AMT企源&#xff0c;成立了太行云商科技有限公司&#x…

【生日视频制作】蓝色飞机机身AE模板修改文字软件生成器教程特效素材【AE模板】

生日视频制作教程蓝色飞机机身AE模板修改文字特效广告生成神器素材祝福玩法AE模板工程 AE模板套用改图文教程↓↓&#xff1a; 怎么如何做的【生日视频制作】蓝色飞机机身AE模板修改文字软件生成器教程特效素材【AE模板】 生日视频制作步骤&#xff1a; 下载AE模板 安装AE软件…

串口调试助手+串口打印配置

目录 一、使用CUBE_MX配置串口 二、KEIL5配置 1.打开usart.c文件 2.打开main.c文件 在main函数中&#xff1a; 一、使用CUBE_MX配置串口 二、KEIL5配置 1.打开usart.c文件 UART_HandleTypeDef huart1;void MX_USART1_UART_Init(void) {/* USER CODE BEGIN USART1_Init 0 …

【Proteus51单片机仿真】YL-69湿度检测和继电器电机自启动

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于AT89C51单片机&#xff0c;湿度检测模块通过ADC0832数模转换器&#xff0c;将模拟信号转换为数字信号给单片机&#xff0c;然后通过LCD1602显示屏显示出当前的湿度值&#xff0c;并判断当前湿度值是…