Dubbo基本原理和用法讲解

news2024/11/14 19:40:46

Dubbo基本原理和用法讲解

序言:学习一项新技术,一般从是什么、为什么、怎么用三个方面进行学习。本篇文章也不例外,笔者将从Dubbo是什么?、为什么会产生Dubbo技术?、如何在项目中使用Dubbo技术。最后,笔者将结合一个实际案例运用dubbo技术,给出一个Demo演示并贴出源码。
在这里插入图片描述

一、Dubbo是什么?

Dubbo是由阿里巴巴开源的RPC服务开发框架。RPC全称是Remote procedure call,即远程过程调用。使得调用远程的程序服务像在本地调用一样。rpc可以在提供强大的远程调能力时不损失本地调用的语义简洁性,使得构建分布式技术(应用)更加容易。它提供了三大核心能力:

  • 面向接口的远程方法调用
  • 可靠、智能的容错和负载均衡
  • 服务主动注册和发现能力

二、为什么为产生Dubbo技术?

1)单一应用框架(ORM)

当网站流量很小,只需要一个应用,将所有功能都部署在一起,以减少部署节点和成本。

2)垂直应用框架(MVC)

随着业务扩大,单一应用架构扩容较麻烦,于是把系统中独立大部分拆分出来,形成了垂直应用架构,每个应用独立开发、独立部署。

3)分布式应用架构(RPC)

当垂直应用越来越多,每个系统的相同逻辑代码无法复用,且难免需要不同应用交互,于是将核心业务抽离出来,形成分布式应用架构。

微服务落地过程中,还需要解决以下许多问题,如:

  • 服务之间如何高性能通信
  • 服务调用如何做到负载均衡、限流
  • 如何进行服务治理

于是,Dubbo作为分布式服务框架应运而生。

三、如何使用Dubbo技术?

在这里插入图片描述

为了学习如何使用Dubbo,首先我们要了解dubbo的架构是怎么样的,如上图所示,dubbo 的核心架构中,分了4个角色:注册中心、服务提供者、服务消费者、监控中心。它们的功能分别是:

  • Registry:注册中心,负责服务地址的注册和查找,服务的Provider和Consumer只在启动时与注册中心交互,注册中心通过长连接感知Provider的存在,在Provider出现宕机的时候,注册中心会立即推送相关事件通知consumer。

  • Provider:服务提供者。在它启动的时候,会向Registry进行注册操作,将自己的地址和相关配置信息封装成Url添加到Zookeeper中。

  • Consumer:服务消费者。在它启动时,会向Registry进行订阅操作。Comsumer和Provider建立的是长连接,且Comsumer会缓存Provider信息,所以一旦建立,即使注册中心宕机,也不会影响已运行的Provider和Consumer。

  • Monitor:监控中心。用于统计服务的调用次数和调用时间,监控中心宕机不会影响Provider和Consumer,只是丢失监控数据。


在这里插入图片描述

这里我们使用zookeeper作为注册中心。构建一个简单的Dubbo demo程序。

服务提供者

package com.example.dubbo.zk.providerzk.service;

import com.alibaba.dubbo.config.annotation.Service;
import com.demo.dubbo.api.Hello;
import org.springframework.beans.factory.annotation.Value;

@Service(timeout = 5000, version = "0.1.0")
public class HelloService implements Hello {
    @Value("${server.port}")
    String port;
    @Override
    public String hello(String name) {
        return "hello " + name + " (" + port + ")";
    }
}

appllication.properties

# 应用名
spring.application.name=service-provider-zk
server.port=9090
# 扫描 Dubbo 服务的位置
dubbo.scan.base-packages=com.example.dubbo.zk.providerzk.service

# Dubbo 协议
dubbo.protocol.name=dubbo
dubbo.protocol.port=-1

## Dubbo 注册中心
dubbo.registry.address=zookeeper://127.0.0.1:2181

服务消费者

package com.demo.dubbo.zk.consumerzk;

import com.alibaba.dubbo.config.annotation.Reference;
import com.demo.dubbo.api.Hello;
import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;


@SpringBootApplication
public class ConsumerZkApplication {

    public static void main(String[] args) {
        SpringApplication.run(ConsumerZkApplication.class, args);
    }

    @Reference(version = "0.1.0")
    private Hello helloService;

    @Bean
    public ApplicationRunner runner() {
        return args -> System.out.println(helloService.hello("dubbo-zk"));
    }

}

appllication.properties

# 服务名
spring.application.name=service-consumer-zk
# 端口
server.port=8081
# Dubbo 注册中心
dubbo.registry.address=zookeeper://127.0.0.1:2181
  • tips:消费者消费服务,需保证版本号version一致,进一步延伸,在本地测试中,可通过修改版本号和测试环境的服务隔离开。

源码链接:https://gitee.com/burceli/dubbo_demo.git

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

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

相关文章

基于springboot+vue的宠物商城系统(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

Fluent Python 笔记 第 6 章 使用一等函数实现设计模式

虽然设计模式与语言无关,但这并不意味着每一个模式都能在每一门语言中使用。1996 年,Peter Norvig 在题为“Design Patterns in Dynamic Languages”(http://norvig.com/design- patterns/)的演讲中指出,Gamma 等人合著的《设计模式:可复用面…

序列化和反序列化~如何实现自定义协议?jsoncpp的使用

目录 序列化反序列化的概念 为什么要进行序列化和反序列化? 自定义协议实现业务 jsoncpp实现序列化和反序列化 序列化: 反序列化: 自定义协议jsoncpp实现简易计算器服务整体逻辑 Server.cc Client.cc 运行结果 序列化反序列化的概念…

重建control遗漏数据文件,reseltogs报ORA-1555错误处理----惜分飞

又一客户,误删除oracle redo导致数据库无法正常启动,自己尝试重建ctl,结果遗漏部分oracle数据文件并且尝试过resetlogs,导致部分文件resetlogs scn不一致.导致重建ctl失败Fri Feb 10 12:41:20 2023CREATE CONTROLFILE REUSE DATABASE "orcl"RESETLOGS NOARCHIVELOG M…

GO 中的 init 函数

前言 go 语言中有一个非常神奇的函数 init ,它可以在所有程序执行开始前被执行,并且每个 package 下面可以存在多个 init 函数,我们一起来看看这个奇怪的 init 函数。 init 特性 init 函数在 main 函数之前执行,并且是自动执行&#xff1b…

Docker网络实现原理

目录 1 Docker网络实现原理 1.2 为容器创建端口映射 方法一:随机映射端口(从32768开始) 方法二:指定映射端口 1.3 查看容器的输出和日志信息 二 Docker的网络模式 2.1 Docker的网络模式(41) 2.2 查看…

【大数据趋势】2月12日 货币发动机牵着港股和A股走,历史不会简单重演,但是会用类似的方法让人再踏入同一条河流

行情核心源头之一 : 离岸人民币和美元趋势历史对比,预示着一个阶段底部正在形成中 历史总是很容易忘记,应该很少有人记得18年发生了什么。还是让大数据程序来对比一下。【红色标记1】RSI预示着價格強度的动能情况,同样是达到了一个高点&…

2021 WAIC 世界人工智能大会参会总结

前言 2021 年世界人工智能大会(WAIC)于2021年7月7日至10日在上海世博展览馆举办,本届大会继续秉持「智联世界」的理念,以「众智成城」为主题,促进全球人工智能创新思想、技术、应用、人才和资本的集聚和交流&#xff…

JS逆向案例分享----prototype的妙用

方向不对,努力白费。爬虫也是如此。今天分享的案例很能说明问题。目标:某集团公司采购信息aHR0cHM6Ly9lYy5taW5tZXRhbHMuY29tLmNuL29wZW4vaG9tZS9wdXJjaGFzZS1pbmZv浏览器抓包,请求载荷里就一个加密参数param全局搜索“param:”,有…

【计组】DMA、数据完整性--《深入浅出计算机组成原理》(十三)

目录 一、DMA (一)理解DMA,一个协处理器 (二) Kafka 的实现原理 二、数据的完整性 (一)单比特翻转:软件解决不了的硬件错误 (二)海明码 1、海明码的纠错…

《狂飙》壁纸大嫂如此惊艳,做成日历壁纸天天看(7)

小朋友们好,大朋友们好!我是猫妹!话说兔年春节期间,一部反黑反腐电视剧横空出世,收视率和口碑都有不错的成绩!这部电视剧叫《狂飙》!你看了吗?我没看!不过这丝毫不影响它…

C语言fread和fwrite的用法详解

fgets() 有局限性,每次最多只能从文件中读取一行内容,因为 fgets() 遇到换行符就结束读取。如果希望读取多行内容,需要使用 fread() 函数;相应地写入函数为 fwrite()。对于 Windows 系统,使用 fread() 和 fwrite() 时应…

Python+OpenCV 简单实现人脸检测多个和人脸识别 2(附代码)

如果dilb和face_recognition第三方包安装失败,请移步到Python 解决dilb和face_recognition第三方包安装失败_水w的博客-CSDN博客 上篇请移步到Pythondilb 简单实现人脸检测(附代码)_水w的博客-CSDN博客 本篇是在上篇的工作基础上进行的。 目…

k8s之apiserver

1、Kube-APIServer 启动APIServer 启动采用 Cobra 命令行,解析相关 flags 参数,经过 Complete(填充默认值)->Validate(校验) 逻辑后,通过 Run 启动服务。在 Run 函数中,按序分别初始化 APIServer 链(APIExtensionsServer、Kube…

【Java开发笔记】分库分表

【Java开发笔记】分库分表 1 分库分表基本概述 为什么要分库分表? 【性能角度】分库分表就是为了解决由于数据量多大而导致数据库性能下降的问题: 原来独立的数据库拆分成若干数据库组成将原来的大表(存储近千万数据)拆分为若干…

利用git reflog 命令来查看历史提交记录,并使用提交记录恢复已经被删除掉的分支

一.问题描述 当我们在操作中手误删除了某个分支,那该分支中提交的内容也没有了,我们可以利用git reflog这个命令来查看历史提交的记录从而恢复被删除的分支和提交的内容 二.模拟问题 1.创建git仓库,并提交一个文件 [rootcentos7-temp /da…

oracle10g安装教程

oracle 10g 安装 环境 操作系统:win 7 64位 内存:8G Oracle 10压缩包:10203_vista_w2k8_x86_production_db.zip 客户端:Oracle_client_win32.zip pl/sql:plsqldev1005.exe 背景 Oracle是众多中大型企业必选的数…

17万字数字化医院信息化建设大数据平台建设方案WORD

【版权声明】本资料来源网络,知识分享,仅供个人学习,请勿商用。【侵删致歉】如有侵权请联系小编,将在收到信息后第一时间删除!完整资料领取见文末,部分资料内容: 目录 第1章 医院信息化概述 1.…

MySQL-数据目录浅析

InnoDB 、 MyISAM 这样的存储引擎都是把表存储在磁盘上的,操作系统用文件系统来管理磁盘。 数据目录 MySQL服务器程序在启动时会到文件系统的某个目录下加载一些文件,之后在运行过程中产生的数据也都会存储到这个目录下的某些文件中,这个目…

JVM学习02:内存结构

JVM学习02:内存结构 1. 程序计数器 1.1、定义 Program Counter Register 程序计数器(寄存器) 作用:是记住下一条jvm指令的执行地址 特点: 是线程私有的不会存在内存溢出 1.2、作用 程序计数器物理上是由寄存器来实…