Dubbo快速实践

文章目录

  • 架构相关概念
    • 集群和分布式
    • 架构演进
  • Dubbo概述
  • Dubbo快速入门
    • 前置准备
    • 配置服务接口
    • 配置Provider
    • 配置Consumer
  • Dubbo基本使用总结

本文参考https://www.bilibili.com/video/BV1VE411q7dX

架构相关概念

集群和分布式

  • 集群:很多“人”一起 ,干一样的事。
    • 一个业务模块,部署在多台服务器上。
      在这里插入图片描述
  • 分布式:很多“人”一起,干不一样的事。这些不一样的事,合起来是一件大事。
    • 一个大的业务系统,拆分为小的业务模块,分别部署在不同的机器上。
      在这里插入图片描述
  • 集群和分布式两者一般结合使用

架构演进

在这里插入图片描述

单体架构

在这里插入图片描述
优点:

  • 简单:开发部署都很方便,小型项目首选

缺点:

  • 项目启动慢
  • 可靠性差
  • 可伸缩性差
  • 扩展性和可维护性差
  • 性能低

垂直结构

垂直架构是指将单体架构中的多个模块拆分为多个独立的项目。形成多个独立的单体架构。

注意:

  • 这多个独立的项目之间是不会进行通信的,这也就会出现重复功能的问题。比如app1和app2中都需要用户信息,那么就可能都要写用户模块(E),这就会非常的冗余

在这里插入图片描述
垂直架构存在的问题:

  • 重复功能太多

分布式架构

在这里插入图片描述

分布式架构是指在垂直架构的基础上,将公共业务模块抽取出来,作为独立的服务,供其他调用者消费,以实现服务的共享和重用。

那么如何去调用这个服务的提供者呢?就要通过RPC

RPC: Remote Procedure Call 远程过程调用。有非常多的协议和技术来都实现了RPC的过程。比如:HTTP REST风格,Java RMI规范、WebService SOAP协议、Hession等等。

分布式架构存在的问题:

  • 服务提供方一旦产生变更,所有消费方都需要变更。
  • 例如:
    在这里插入图片描述

SOA架构

在分布式架构中我们是在不同项目之间直接进行调用,所以造成一方变更,多方也要跟着变的情况,所以在SOA架构中,服务之间就不直接进行调用,而是加一个中介,把调用的需求给他,让它去给我们进行调用。我们只需要在中介中去维护调用关系即可,而不必像原来一样。

SOA:(Service-Oriented Architecture,面向服务的架构)是一个组件模型,它将应用程序的不同功能单元(称为服务)进行拆分,并通过这些服务之间定义良好的接口和契约联系起来。

ESB:(Enterparise Servce Bus) 企业服务总线,服务中介。主要是提供了一个服务于服务之间的交互。ESB 包含的功能如:负载均衡,流量控制,加密处理,服务的监控,异常处理,监控告急等等。

在这里插入图片描述

微服务架构

微服务架构是在 SOA 上做的升华,微服务架构强调的一个重点是“业务需要彻底的组件化和服务化”,原有的单个业务系统会拆分为多个可以独立开发、设计、运行的小应用。这些小应用之间通过服务完成交互和集成。

微服务架构 = 80%的SOA服务架构思想 + 100%的组件化架构思想 + 80%的领域建模思想

在这里插入图片描述

特点:

  • 服务实现组件化:开发者可以自由选择开发技术。也不需要协调其他团队
  • 服务之间交互一般使用REST API
  • 去中心化:每个微服务有自己私有的数据库持久化业务数据
  • 自动化部署:把应用拆分成为一个一个独立的单个服务,方便自动化部署、测试、运维

注意:Dubbo 是 SOA时代的产物,SpringCloud 是微服务时代的产物

Dubbo概述

  • Dubbo是阿里巴巴公司开源的一个高性能、轻量级的 Java RPC 框架。
  • 致力于提供高性能和透明化的 RPC 远程服务调用方案,以及 SOA 服务治理方案
  • 官网:http://dubbo.apache.org

架构:
在这里插入图片描述

Dubbo官方推荐使用Zookeeper作为注册中心
zookeeper的安装可以参考这篇文章:
windows安装Zookeeper

Dubbo快速入门

使用Dubbo的方式有如下三种:

  • 基于 Dubbo API
  • 基于Spring Boot Starter
  • 基于Spring XML

这里我们使用Starter的方式进行快速入门:

参考文档:Dubbo 基于 Spring Boot Starter 开发微服务应用

前置准备

  • 安装Zookeeper,并启动
  • 构建一个Dubbo的小demo
    • 这一步骤可以参考上后面的文档

配置服务接口

也就是配置interface子项目

服务接口是 Dubbo 中沟通消费端和服务端的桥梁。我们一般把他单独放在一个项目中。

我们在这个项目中随意定义一个接口:

public interface DemoService {

    String sayHello(String name);
}

在 DemoService 中,定义了 sayHello 这个方法。后续服务端发布的服务,消费端订阅的服务都是围绕着 DemoService 接口展开的

配置Provider

配置文件:

dubbo:
  application:
    name: dubbo-demo-provider
  protocol:
    name: dubbo
    port: -1
  registry:
    address: zookeeper://localhost:2181  # 替换成自己的注册中心地址

在这个配置文件中,定义了 Dubbo 的应用名、Dubbo 协议信息、Dubbo 使用的注册中心地址。

定义了服务接口之后,可以在服务端这一侧定义对应的实现,这部分的实现相对于消费端来说是远端的实现,本地没有相关的信息。

@DubboService
public class DemoServiceImpl implements DemoService {

    @Override
    public String sayHello(String name) {
        return "Hello " + name;
    }
}

在 DemoServiceImpl 中,实现了 DemoService 接口,对于 sayHello 方法返回 Hello name。

注:在DemoServiceImpl 类中添加了 @DubboService 注解,通过这个配置可以基于 Spring Boot 去发布 Dubbo 服务

然后我们写一个启动类:

@SpringBootApplication
@EnableDubbo
public class ProviderApplication {
    public static void main(String[] args) {
        SpringApplication.run(ProviderApplication.class, args);
    }
}

最后我们启动Provider。

配置Consumer

配置文件和前面一样:

dubbo:
  application:
    name: dubbo-demo-provider
  protocol:
    name: dubbo
    port: -1
  registry:
    address: zookeeper://localhost:2181   # 替换成自己的注册中心地址

接下来我们在消费端去远程调用这个接口:

@Component
public class Task implements CommandLineRunner {
    @DubboReference
    private DemoService demoService;

    @Override
    public void run(String... args) throws Exception {
        String result = demoService.sayHello("world");
        System.out.println("Receive result ======> " + result);

        new Thread(()-> {
            while (true) {
                try {
                    Thread.sleep(1000);
                    System.out.println(new Date() + " Receive result ======> " + demoService.sayHello("十八岁讨厌编程"));
                } catch (InterruptedException e) {
                    e.printStackTrace();
                    Thread.currentThread().interrupt();
                }
            }
        }).start();
    }
}

在 Task 类中,通过@DubboReference 从 Dubbo 获取了一个 RPC 订阅,这个 demoService 可以像本地调用一样直接调用。在 run方法中创建了一个线程进行调用。

最后我们写一个启动类,然后启动:

@SpringBootApplication
@EnableDubbo
public class ConsumerApplication {

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

通过命令行我们可以看到远程调用是成功了的:
在这里插入图片描述

Dubbo基本使用总结

配置文件

消费者、服务者都要配置:

dubbo:
  application:
    name: dubbo-demo-provider #服务名,随便取
  protocol:
    name: dubbo
    port: -1
  registry:
    address: zookeeper://localhost:2181 #注册中心的地址

注意:

dubbo的protocol下面的name和port是用来配置通信协议和端口的。name是指定通信协议的名称,例如dubbo, rmi, http, hessian等。port是指定通信协议的端口号,例如dubbo的默认端口是20880,rmi的默认端口是1099,http和hessian的默认端口是80。如果port不填或者等于-1,那么会自动分配一个未使用的端口。为了保证端口的范围可控,从Dubbo 2.4.0+开始,端口会根据对应协议的默认端口递增。

三个注解

  • @DubboService:定义好 Dubbo 服务接口后,提供服务接口的实现逻辑,并用 @DubboService 注解标记,就可以实现 Dubbo 的服务暴露
  • @DubboReference:自动注入为 Dubbo 服务代理实例
  • @EnableDubbo:必须配置,否则将无法加载 Dubbo 注解定义的服务,@EnableDubbo 一般定义在启动类上

可以使用 Java Config 代替注解
在这里插入图片描述

注意,Java Config 是 DubboService 或 DubboReference 的替代方式,对于有复杂配置需求的服务建议使用这种方式。

@Configuration
public class ProviderConfiguration {
    @Bean
    public ServiceConfig demoService() {
        ServiceConfig service = new ServiceConfig();
        service.setInterface(DemoService.class);
        service.setRef(new DemoServiceImpl());
        service.setGroup("dev");
        service.setVersion("1.0.0");
        Map<String, String> parameters = new HashMap<>();
        service.setParameters(parameters);
        return service;
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

有哪些相见恨晚的stm32学习的方法?

有哪些相见恨晚的stm32学习的方法&#xff1f; 单片机用处这么广&#xff0c;尤其是STM32生态这么火&#xff01;如何快速上手学习呢&#xff1f; 你要考虑的是&#xff0c;要用STM32实现什么&#xff1f;为什么使用STM32而不是用8051&#xff1f;是因为51的频率太低&#xff…

requests库出现AttributeError问题的修复与替代方法

在使用App Engine时&#xff0c;开发者们通常会面临需要发送爬虫ip请求的情况&#xff0c;而Python中的requests库是一个常用的工具&#xff0c;用于处理爬虫ip请求。然而&#xff0c;在某些情况下&#xff0c;开发者可能会遇到一个名为AttributeError的问题&#xff0c;特别是…

软件数字签名是什么?软件数字签名有什么作用?

在当今互联网时代&#xff0c;网络安全威胁日益增加&#xff0c;恶意软件层出不穷&#xff0c;为了防止下载到恶意软件&#xff0c;用户在下载软件时都会确认其是安全可信的。由此&#xff0c;企业需要证明其发布的软件真实可信且未被篡改&#xff0c;如何证明这一点呢&#xf…

MATLAB常用绘图函数的使用

文章目录 绘制一图一线绘制一图多线用法一&#xff1a;plot用法二&#xff1a;hold on 绘制一图多图其他形式的坐标图分段函数绘制方法一&#xff1a;分段写函数的定义域值域方法二&#xff1a;判断定义域方法三&#xff1a;if else 判断 横纵坐标范围设置标题、轴标签、图例、…

JVM基础- 垃圾回收器

基本介绍 Java虚拟机&#xff08;JVM&#xff09;中的垃圾回收器是用来自动管理内存的关键组件。它负责识别并回收不再使用的内存&#xff0c;从而防止内存泄漏。不同的JVM实现提供了多种垃圾回收器&#xff0c;每种回收器都有其特定的使用场景和性能特点。以下是一些常见的JV…

16路模拟信号转RS-485/232,Modbus RTU 通讯协议数据采集24位A/D转换模块 YL29

特点&#xff1a; ● 16路模拟信号采集&#xff0c;隔离转换 RS-485/232输出 ● 采用24位AD转换器&#xff0c;测量精度优于0.05% ● 通过RS-485/232接口可以程控校准模块精度 ● 信号输入 / 输出之间隔离耐压3000VDC ● 宽电源供电范围&#xff1a;8 ~ 32VDC ● 可靠性高…

【从入门到起飞】JavaSE—带你了解Map,HashMap,TreeMap的使用方法

&#x1f38a;专栏【Java基础】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【The truth that you leave】 &#x1f970;欢迎并且感谢大家指出我的问题 文章目录 &#x1f33a;双列集合的特点&#x1f384;Map&#x1f354;Ma…

[Kettle] 单变量统计

单变量统计是对数据进行单个变量的数据统计&#xff0c;以字段为单变量&#xff0c;可以分别对多个字段进行数据统计&#xff0c;统计类型有N(统计数量)、最小值、最大值、平均值、样本标准差、中位数和任意百分位数等 数据源 2018年上学期期末考试成绩(Kettle数据集9).xlsht…

客户管理系统大盘点!推荐这五款

客户管理系统大盘点&#xff01;推荐这五款。 客户管理系统也就是CRM&#xff0c;可以说是企业刚需&#xff0c;国内外的客户管理系统也是数不胜数&#xff0c;到底有哪些是真正好用&#xff0c;值得推荐的呢&#xff1f;本文将为大家推荐这5款好用的客户管理系统&#xff1a;…

Cannot read property ‘pickAlgorithm‘ of null

Cannot read property pickAlgorithm of null 报错显示 node 和 npm的版本号不对应 查看版本号 node -v npm -v node的版本对应 Previous Releases | Node.js (nodejs.org) 我们需要改成对应的mpm版本号 npm install npm6.14.12 -g nodejs与npm版本对应关系以及使用nvm管理n…

论文阅读:“基于快速特征点提取和描述算法与色调、饱和度和明度的图像特征点匹配算法”

文章目录 摘要引言方法实验结果图像预处理结果对比图像配准结果对比 参考文献 摘要 提出了一种基于快速点特征提取和描述&#xff08;ORB&#xff09;算法与色调、饱和度和明度&#xff08;HSV&#xff09;的图像特征点匹配算法。首先利用双边滤波和均值滤波结合对图像进行预处…

vue 如何实现粘贴复制功能

实现粘贴复制功能 vue 实现粘贴复制功能&#xff0c;也可用于app中h5插件&#xff0c;共四种方法&#xff0c;特别推荐第四种方法&#xff0c;具体还需了解根据需求使用 1. 安装第三方插件方法&#xff08;不推荐&#xff09; 这种方法兼容性很好&#xff0c;如果项目只使用了…

OA流程是什么意思啊

阅读本文你将通过以下几点了解OA流程是什么意思&#xff1a;1、OA流程是什么&#xff1b;1、传统纸质化办公痛点&#xff1b;2、简道云OA流程介绍。 一、OA流程是什么 OA是Office Automation的缩写&#xff0c;意为办公自动化&#xff0c;它是一种基于现代技术的办公方式变革…

js-WebApi笔记之BOM

目录 window对象 定时器-延迟函数 location对象 navigator对象 histroy对象 本地存储 localStorage sessionStorage localStorage 存储复杂数据类型 window对象 BOM (Browser Object Model ) 是浏览器对象模型 window对象是一个全局对象&#xff0c;也可以说是JavaScr…

2023最全的性能测试种类介绍,这6个种类特别重要!

系统的性能是一个很大的概念&#xff0c;覆盖面非常广泛&#xff0c;包括执行效率、资源占用、系统稳定性、安全性、兼容性、可靠性、可扩展性等&#xff0c;性能测试就是描述测试对象与性能相关的特征并对其进行评价而实施的一类测试。 性能测试是一个统称&#xff0c;它其实包…

C语言--每日五道选择题--Day19

第一题 1. 为了避免在嵌套的条件语句if-else中产生二义性&#xff0c;C语言规定else子句总是与&#xff08; &#xff09;配对。 A&#xff1a;缩排位置相同的if B&#xff1a;之前最近的未匹配的if配对 C&#xff1a;其之后最近的if D&#xff1a;同一行上的if 答案及解析 B e…

终端仿真软件 SecureCRT v9.4.2

SecureCRT是一款终端仿真软件&#xff0c;它提供了类似于Telnet和SSH等协议的远程访问功能。SecureCRT专门为网络管理员、系统管理员和其他需要保密访问网络设备的用户设计。 SecureCRT具有以下特点&#xff1a; 安全性&#xff1a;SecureCRT支持SSH1、SSH2、SSL和TLS等加密和…

PPT基础:编辑顶点

目录 编辑顶点对顶点的编辑对线段的编辑编辑顶点用法 编辑顶点 所在位置&#xff1a; 实质&#xff1a;是一种改变图像性质的操作 如何把一个圆形变成三角形&#xff1a;选中其中一个顶点&#xff0c;右键删除一个顶点&#xff1b;靠近某一条边&#xff0c;右键“拉伸弓形”即…

【机器学习基础】K-Means聚类算法

&#x1f680;个人主页&#xff1a;为梦而生~ 关注我一起学习吧&#xff01; &#x1f4a1;专栏&#xff1a;机器学习 欢迎订阅&#xff01;相对完整的机器学习基础教学&#xff01; ⭐特别提醒&#xff1a;针对机器学习&#xff0c;特别开始专栏&#xff1a;机器学习python实战…