Dubbo框架基本使用
一:软件架构的演练过程【了解】
单体应用架构--->垂直应用架构--->分布式架构(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. 服务容器负责启动,加载,运行服务提供者。
服务提供者在启动时,向注册中心注册自己提供的服务。
服务消费者在启动时,向注册中心订阅自己所需的服务。
注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推 送变更数据给消费者。
服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用, 如果调用失败,再选另一台调用。
服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计 数据到监控中心。
特别重要
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 {@Overridepublic 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-provider1registry:address: zookeeper://127.0.0.1:2181protocol:name: dubboport: 20080scan:base-packages: com.itheima.service
消费者:
@RestController
public class HelloController {@Referenceprivate 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-consumer1registry: # 连接注册中心address: zookeeper://127.0.0.1:2181scan:base-packages: com.itheima.serviceconsumer: timeout: 5000retries: 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: dubboport: 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" />
Dubbo框架基本使用相关推荐
- 如何开启Dubbo框架内部的日志?
为什么80%的码农都做不了架构师?>>> 欢迎加入DUBBO交流群:259566260 这里将对如何在自己的项目里面开启dubbo框架自己的日志,并对输出的日志进行控制.在讲这 ...
- SpringCloud微服务:基于Nacos组件,整合Dubbo框架
源码地址:GitHub·点这里 || GitEE·点这里 一.基础组件简介 1.Dubbo框架 Dubbo服务化治理的核心框架,之前几年在国内被广泛使用,后续由于微服务的架构的崛起,更多的公司转向微服 ...
- SpringBoot2.0 整合 Dubbo框架 ,实现RPC服务远程调用
一.Dubbo框架简介 1.框架依赖 图例说明: 1)图中小方块 Protocol, Cluster, Proxy, Service, Container, Registry, Monitor 代表层 ...
- 【华为云技术分享】云图说 | Dubbo框架应用也可以使用Istio服务网格
Dubbo作为一款RPC 框架,在国内有一定的存量用户.如何让企业级微服务应用使用原生的能力,通过Kubernetes和Istio进行部署运行和监控,是很多企业开发和运维团队非常关心的问题. 应用服务 ...
- Java手写dubbo框架
前言 在对dubbo有了较为深入的使用和理解后,来尝试从dubbo框架的角度重新认识下它,对照着dubbo官方的这张图进行反复的理解后,我们可以从已有掌握的技术出发,来尝试编写一个简单的dubbo实现 ...
- Dubbo框架的使用
如今很多项目规模逐步增加,同时也需要减轻服务器的压力,提高性能,很多项目都使用了分布式架构,实现分布式架构的方式有很多,这里就简要介绍一下使用Dubbo框架实现分布式,该框架是由阿里开发的,目前应用在 ...
- Springboot 最简单的整合Dubbo框架实战案例
分布式框架,目前比较热门的是springcloud和dubbo,虽然本人也是用cloud比较多,但是避免不了,有的项目就是需要用dubbo. 那么现在就给大家整一篇,简单清晰的spirngboot从零 ...
- SpringBoot集成Dubbo框架
1. Dubbo框架 Dubbo框架是一个高性能.重量轻.基于java的RPC框架.Dubbo提供了三个关键功能,包括基于接口的远程调用.容错和负载平衡,以及自动服务注册和发现.Dubbo可以和Spr ...
- Dubbo框架整体认知
Dubbo是什么? Dubbo是Apache开源基金会顶级项目,最开始是由阿里巴巴开源并贡献给Apache.他的本质是一个高性能分布式Rpc服务调用框架.最新版本已经到了3.0,具备应用级服务注册和发 ...
- 浅谈对Dubbo框架的认识
目录 Dubbo是什么 Dubb服务注册和上下线感知 工作前两年一直在使用的基本都是Cloud体系里的组件,都是基于cloud体系内提供的 Feign 组件来进行内部服务通信.最近这半年接触了新的技术 ...
最新文章
- 现在的教育:感慨之一
- HTTP Status 405 – Method Not Allowed HTTP method GET is not supported by this URL
- 修改linux下全局数据库名,linux/unix下修改oracle数据库实例名的方法
- maven中properties标签定义变量
- Quartz框架中的Listener
- 策略模式应用场景和uml_策略模式
- ModalPopupExtender控件主要有两种使用方式:客户端使用方式和服务器端使用方式
- 高并发中计数器的实现方式有哪些?
- Facebook 推出查找SSRF 漏洞的新工具
- 86 arduino 电机yl_Arduino 直流电机
- 制作的LINUX安装软件,竟然导致系统无法启动
- oracle grant的用法,oracle grant总结
- android imagebutton的点击事件,Android 点击ImageButton时有“按下”的效果的实现
- Django中文文档-The Django Book
- 王建国——2020年最受人民喜爱的艺术家
- 浏览器的三个精度Bug
- excel读取 hutool_Mr · 范
- 离散数学 课时四 谓词逻辑基本概念
- [Unity3D]添加音效说明
- css引入第三方字体(等宽非衬线)
热门文章
- 【论文阅读】【基于方面的情感分析】Deep Context- and Relation-Aware Learning for Aspect-based Sentiment Analysis
- 2011年5月23日
- 交换代数 -- 诺特环
- vml与svg技术初学
- Qt软件发布(版本信息,Release版程序,代码打包,制作安装包)
- python管理系统web版_基于Python Flask的web日程管理系统
- 企业都应该使用开源的 POS 系统的必要性
- Service概述 生命周期 IBinder
- 【北京航空航天大学】考研初试复试资料分享
- 【sfu】开启 rtp头扩展的extmap-allow-mixed模式