Dubbo框架基本使用

news2025/7/27 12:07:55

一:软件架构的演练过程【了解】

单体应用架构--->垂直应用架构--->分布式架构(SOA架构/微服务架构)`

 1.单体应用架构

单体应用架构,就是将一个系统的多个模块做成一个项目,然后部署到tomcat服务器上

优点:

        项目架构简单,开发,测试,部署成本低;

        项目部署在一个节点上,后期维护方便

缺点:

        项目模块之间紧密耦合,容错率低

        无法针对不同模块进行针对的扩容

2.垂直应用架构 

垂直应用架构,就是将原来的一个系统拆成成多个工程,然后每个工程部署在tomcat服务器上

* 优点:
    - 可以针对不同模块进行针对性的扩容
    - 一个系统的问题不会影响到其他系统,提高容错率
    
* 缺点:
    - 系统之间相互独立,会有重复的开发任务(造成了代码冗余)

 3.分布式架构(思想)

分布式架构就是指将服务层(service)单独启动,并部署在tomcat上对外提供服务,在controller中可以通过远程调用访问服务层中的方法

* 优点:
    - 抽取公共的功能为服务层,提高代码复用性

* 缺点:    
    - 调用关系错综复杂,难以维护,宕机以后不能及时更换

1.SOA架构

SOA结构,在分布式架构的基础上,增加一个调度中心对系统进行实时管理。

* 集群:
    多台服务器重复完成同一个任务,即同一个任务部署在多台服务器上

* 分布式:
    多台服务器协同完成同一个任务,即同一个任务拆分为多个子任务,多个子任务部署在多台服务器上协同完成同一个任务

 2.微服务架构(SpringCloud)

在这里SpringCloud先有一个概念,后边有挺多东西要学

架构体系先了解到这里

二:dubbo使用 

 首先我们看soa架构,里边要有调用中心,(不用担心,就相当于一个软件),最重要的就是rpc远程调用,dubbo就是rpc远程调用的一种框架

注意rpc 并不是一个新的技术,而是指整个网络远程调用过程

 1.Dubbo简介

Apache Dubbo是一款高性能的Java RPC框架。其前身是阿里巴巴公司开源的一个高性能、轻量级的开源Java RPC框架,可以和Spring框架无缝集成。

官网地址:Apache Dubbo

发展历程

  • Dubbo是阿里巴巴内部使用的分布式业务框架,2012年由阿里巴巴开源

  • 在很短时间内,Dubbo就被许多互联网公司所采用,并产生了许多衍生版本,如网易,京东,新浪,当当等等

  • 由于阿里策略变化,2014年10月Dubbo停止维护。随后部分互联网公司公开了自行维护的Dubbo版本,比较著名的如当当DubboX

  • 经过三年的沉寂,在2017年9月,阿里宣布重启Dubbo项目,并决策在未来对开源进行长期持续的投入

  • 随后Dubbo开始了密集的更新,并将停摆三年以来大量分支上的特性及缺陷修正快速整合

  • 2018.2月,阿里将Dubbo捐献给Apache基金会,Dubbo成为Apache孵化器项目

RPC介绍

  • RPC全称为remote procedure call,即远程过程调用

  • 简单的讲,RPC可以让我们像调用本地方法一样来调用远程方法

  • 需要注意的是RPC并不是一个具体的技术,而是指整个网络远程调用过程

  • Java中的RPC框架比较多,广泛使用的有RMI、Hessian、Dubbo等

RMI、Hessian等一些远程调用 可以去了解

 2.Dubbo实现RPC调用的原理【面试】

节点角色名称
Provider暴露服务的服务提供方
Consumer调用远程服务的服务消费方
Registry服务注册与发现的注册中心
Monitor统计服务的调用次数和调用时间的监控中心(查看服务状态)
Container服务运行容器

 

     0. 服务容器负责启动,加载,运行服务提供者

  1. 服务提供者在启动时,向注册中心注册自己提供的服务

  2. 服务消费者在启动时,向注册中心订阅自己所需的服务

  3. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推 送变更数据给消费者。

  4. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用, 如果调用失败,再选另一台调用。

  5. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计 数据到监控中心。

特别重要

 3.SpringBoot整合Dubbo【重要】

这里应该还有Spring整合Dubbo 不过SpringBoot整合更简单写,企业开发用的更多一些

1.首先,先要有注册中心,这里用的是zookeeper

 

 

 然后启动,就ok了,这里只是当一个注册中心

 整体项目结构

 2.父项目导入依赖

<parent>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-parent</artifactId>
	<version>2.2.2.RELEASE</version>
</parent>

<properties>
	<java.version>1.8</java.version>
</properties>

<dependencies>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter</artifactId>
	</dependency>
	<!--dubbo的起步依赖-->
	<dependency>
		<groupId>org.apache.dubbo</groupId>
		<artifactId>dubbo-spring-boot-starter</artifactId>
		<version>2.7.5</version>
	</dependency>

	<!-- zookeeper的api管理依赖 -->
	<dependency>
		<groupId>org.apache.curator</groupId>
		<artifactId>curator-recipes</artifactId>
		<version>4.2.0</version>
	</dependency>
	<!-- zookeeper依赖 -->
	<dependency>
		<groupId>org.apache.zookeeper</groupId>
		<artifactId>zookeeper</artifactId>
		<version>3.4.12</version>
	</dependency>
</dependencies>

接口:

public interface HelloService {
    String hello(String name);
}

Impl:


@Service//  dubbo的Service
public class HelloServiceImpl implements HelloService {
    @Override
    public String hello(String name) {
        System.out.println(222);
        return "hello:" + name;

    }
}

提供者的启动类

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

配置文件:(application.yml)

dubbo:
  application:
    name: springboot-provider1
  registry:
    address: zookeeper://127.0.0.1:2181
  protocol:
    name: dubbo
    port: 20080
  scan:
    base-packages: com.itheima.service

消费者:

@RestController
public class HelloController {
    @Reference
    private HelloService helloService;

    @GetMapping(value = "/name")
    public ResponseEntity hello(@RequestParam String name){
        String hello = helloService.hello(name);
        return ResponseEntity.ok(hello);
    }

}

消费者的启动类:


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

 配置文件:(application.yml)

dubbo:
  application: # 应用名称
    name: springboot-consumer1
  registry: # 连接注册中心
    address: zookeeper://127.0.0.1:2181
  scan:
    base-packages: com.itheima.service
  consumer: 
    timeout: 5000
    retries: 0

4.dubbo使用的一些小细节【重点】

1.扫描包:

<!--服务提供者和服务消费者都需要配置包扫描,
作用是扫描指定包(包括子包)下的类中的注解: @Service  @Refrences ...-->
<dubbo:annotation package="com.itheima.dubbo" />

scan:
  base-packages: com.itheima.service

2.协议:

 <!--
    在服务提供者一方配置,可以指定使用的协议名称和端口号。
    其中RPC支持的协议有:dubbo、rmi、hessian、http、webservice、rest、redis等。
    port:20880默认端口 可以省略
    后期如果服务比较多:我们可以选择:20881 20882 20883....
-->
<dubbo:protocol name="dubbo" port="20880"/>

yml配置文件:

dubbo:

protocol:
  name: dubbo
  port: 20080

3.启动时检查:

Dubbo在启动时会检查服务提供者所提供的服务是否可用,默认为true

通过配置服务消费者的统一规则来关闭服务检查

<dubbo:consumer check="false"/>    开发屏蔽(false)  上线开启(true)

consumer:
  check: false

 4.dubbo的超时和重试【面试】

Dubbo在通信时,由于网络或服务端不可靠,会导致调用过程中出现不确定的阻塞状态(超时)

为了避免超时导致客户端线程挂起处于一致等待状态,必须设置超时时间和请求重试,默认为1S超时和重试2次数

<!--配置在消费者端一方: 默认的超时时间是1s ,默认的重试次数是2次--> 
<dubbo:consumer timeout="5000" retries="0" />

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

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

相关文章

第01章+Java概述

课程链接&#xff1a;韩顺平Java_程序举例_哔哩哔哩_bilibili 什么叫程序 程序&#xff1a;计算机执行某些操作或解决某个问题而编写的一系列有序指令的集合。 Java版本迭代 官网介绍&#xff1a; Oracle Java SE Support Roadmap LTS为长期支持版本&#xff1a;推荐使用…

IQM的Unimon:一种新的量子比特,可促进量子计算机的实用化

​ 量子处理器中unimon 量子比特的艺术效果图。&#xff08;图片来源&#xff1a;网络&#xff09; 来自芬兰IQM量子计算机公司、阿尔托大学和芬兰VTT技术研究中心的一组科学家发现了一种新的超导量子比特——unimon&#xff0c;可提高量子计算的准确性。该团队已经实现了第一…

解读阿里Q2财报:阿里云的跨周期引擎

昨天&#xff0c;阿里巴巴公布今年6月到9月财务业绩&#xff0c;显示云业务总收入为267.6亿元&#xff0c;在除去阿里内部使用的额度后&#xff0c;抵销跨分部交易后营收为207.57亿元&#xff0c;比上一个季度增长超17%。 具体看&#xff0c;值得关注的有三点&#xff1a; 1、…

Python爬取公交线路信息及站点shp数据 文末附数据下载地址

本篇主要记录爬取公交网整个过程,由于这次所用方法虽比较常规,但由于该网站页面内容转码原因以及遍历链接较多,所以小坑还是比较多的,特在此进行记录。 以前爬过百度地图,当时用的是API平台,加上网站比较规范,所以标签节点什么的都比较清晰,但这次由于特殊原因所选择的…

对JavaScript中的Math.random随机函数破解

什么是随机 在通常的说法中&#xff0c;随机性是指事件中明显实际缺乏可预测性&#xff0c;事件、符号或步骤的随机序列通常没有顺序 举个例子&#xff0c;比如我们在抛硬币&#xff0c;硬币的结果取决于很多因素&#xff0c;比如说我们施加的力&#xff0c;空气阻力&#xff…

Linus shell 在一个脚本中调用另外一个脚本变量

1.新建public.sh文件&#xff0c;并添加以下内容&#xff1a; 2.新建ceshi.sh文件&#xff0c;并添加以下内容&#xff1a; 3.在终端赋予ceshi.sh文件执行权限&#xff0c;并运行该文件。

角度回归(复数与欧拉公式,L1,L2)

文章目录1 BEV下&#xff0c;Eula 损失函数2 BEV下&#xff0c;PointPillars使用sin联合SmoothL13 透视图下&#xff0c; MultiBin 全局方向损失4 L1/L2-norm 的周期损失函数1 BEV下&#xff0c;Eula 损失函数 Yolo-complex的论文中&#xff0c;对于BEV视角下&#xff0c;目标…

SDN和NFV的区别?

前言 网络功能虚拟化&#xff08;Network Functions Virtualization&#xff0c;NFV&#xff09;是一种关于网络架构的概念。我们平时使用的x86服务器由硬件厂商生产&#xff0c;在安装了不同的操作系统以及软件后实现了各种各样的功能。而传统的网络设备并没有采用这种模式&am…

2000-2019年各省产业结构合理化指数(干春晖泰尔指数)

2000-2019年省级产业结构合理化指数&#xff08;干春晖泰尔指数&#xff09; 1、来源&#xff1a;统计NJ及各省统计NJ 2、时间2000-2019年 3、数据说明&#xff1a;含原始数据和计算过程 4、范围包括全国31省 5、指标包括&#xff1a;各省总产值、第一产业增加值、第二产业…

C++基础知识要点--表达式 (Primer C++ 第五版 · 阅读笔记)

目录表达式基础算术运算符逻辑和关系运算符赋值运算符递增和递减运算符成员访问运算符条件运算符位运算符sizeof运算符逗号运算符类运算符运算符优先级表表达式 基础 当一个对象被用作右值的时候&#xff0c;用的是对象的 值&#xff08;内容);当对象被用作左值的时候&#x…

Linux 信号

概念&#xff1a;信号不是信号量&#xff0c;信号量是进程间的一种通信方式&#xff0c;信号是系统中的软件中断&#xff0c;指一种事件通知机制&#xff0c;通知进程发生了某个事件&#xff0c;打断当前的操作&#xff0c;去处理这个事件。 种类&#xff1a;一共有62种信号&a…

Linux之用户管理、权限管理、程序安装卸载

一. 用户管理 1. 查看账户 (1). 查看当前账号&#xff1a;whoami ​​(2). 查看系统当前登录的账号&#xff1a;who ​​补充常用选项&#xff1a; ​​(3). 查看系统所有的账号&#xff1a; cat /etc/passwd ​​2. exit&#xff1a;退出登录账户 如果是图形界面&#xff0c…

curl命令的常用操作

curl是非常实用的命令行工具&#xff0c;用来与服务器之间传输数据。它的命令行参数多达几十种。 在Linux环境中使用curl命令可以进行接口测试。利用curl对http协议发送Get/Post/Delete/Put请求,同时还可以携带header来满足接口的特定需求。 curl命令的语法 curl[options] [U…

Linux03-网络设置

一、说明 在上一节&#xff0c;咱使用VMware安装了虚拟机&#xff0c;网络设置选择了 “桥接模式” &#xff0c;本节咱们来具体讨论一下网络连接方式和网络设置。 实验环境&#xff1a;CentOS7 VMware 二、桥接模式 当我们设置桥接模式时&#xff0c;虚拟机是直接使用物理…

eNSP出现错误,错误代码40暴力解决方案

如果你和我一样&#xff0c;在eNSP中启动一个设备时发生了错误&#xff0c;错误代码为40&#xff0c;那么这篇文件可能会帮助你。 首先你可以仔细地按照这篇说明中的做法进行操作&#xff0c;如果你电脑也是win10&#xff0c;并且之前没有安装过wireshark&#xff0c;virtualb…

后端总说他啥也没动,我从线上调了一下测试接口,你再说一句动没动

◇ 不知道广大前端同学有没有过这样的经历&#xff0c;在做新需求联调的时候&#xff0c;原本上一个版本已经做的好好的功能&#xff0c;前后端已经联调好的。这次做需求的时候&#xff0c;测试发现好多地方都不对了。 ◇ 开发人员经常说的一句话就是&#xff1a;我啥也没动啊…

Java -- 每日一问:你了解Java应用开发中的注入攻击吗?

典型回答 注入式&#xff08;Inject&#xff09;攻击是一类非常常见的攻击方式&#xff0c;其基本特征是程序允许攻击者将不可信的动态内容注入到程序中&#xff0c;并将其执行&#xff0c;这就可能完全改变最初预计的执行过程&#xff0c;产生恶意效果。 下面是几种主要的注…

Web前端:2022年Web开发者的五大CSS工具

据相关数据统计&#xff0c;2018年至2028年&#xff0c;网络开发人员的就业预计将增长13%&#xff0c;这意味着网站开发者的需求量很大&#xff0c;而企业需要专业人员来构建网站&#xff0c;而高效制作优秀网站的最佳方法是拥有最好的web开发工具。 对优秀web开发工具的需求使…

设信号x(t)=cos(2π×50t)+2×cos(2π×400t),试将它的两个频率分量分离,并绘制它们的时域波形及频谱图

以下程序无需赋值&#xff0c;直接运行即可&#xff1a; &#xff08;已验证可以运行&#xff09; function [yl,yh]shiyan49 fs1600; %采样频率 Tt0.02; %信号周期 T04*Tt; %记录长度 [xn,wk,N]shiyan40(fs,T0); Mlength(wk); if M2 rp1;rs80; f1wk(1)*fs/N; f2wk(2…

升余弦滤波器的FPGA实现

目录 升余弦滤波器与无码间串扰&#xff08;一&#xff09; 升余弦滤波器与无码间串扰&#xff08;二&#xff09; 升余弦滤波器的FPGA实现 一、FIR ip核 成形滤波器采用vivado中的FIR ip核实现。滤波器的系数用matlab产生并转成coe文件。 wire m_axis_data_tvalid; rcos_f…