Dubbo是什么?能做什么?架构图?
Dubbo是什么?
Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需要用的,只有在分布式的时候,才有dubbo这样的分布式服务框架的需求,并且本质上是个服务调用的东东,说白了就是个远程服务调用的分布式框架(告别Web Service模式中的WSdl,以服务者与消费者的方式在dubbo上注册)
其核心部分包含:
- 远程通讯: 提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及“请求-响应”模式的信息交换方式。
- 集群容错: 提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。
- 自动发现: 基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。
Dubbo能做什么?
- 透明化的远程方法调用,就像调用本地方法一样调用远程方法,只需简单配置,没有任何API侵入。
- 软负载均衡及容错机制,可在内网替代F5等硬件负载均衡器,降低成本,减少单点。
- 服务自动注册与发现,不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的IP地址,并且能够平滑添加或删除服务提供者。
- Dubbo采用全spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用Spring加载Dubbo的配置即可,Dubbo基于Spring的Schema扩展进行加载。
Dubbo的架构
Dubbo架构图如下所示:
节点角色说明:
节点 | 角色说明 |
---|---|
Provider
|
暴露服务的服务提供方 |
Consumer
|
调用远程服务的服务消费方 |
Registry
|
服务注册与发现的注册中心 |
Monitor
|
统计服务的调用次数和调用时间的监控中心 |
Container
|
服务运行容器 |
Dubbo执行流程:
- 服务容器负责启动,加载,运行服务提供者。
- 服务提供者在启动时,向注册中心注册自己提供的服务。
- 服务消费者在启动时,向注册中心订阅自己所需的服务。
- 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
- 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
- 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
Dubbo集成
1、Dubbo+Zookeeper+Spring
Dubbo采用全Spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用Spring加载Dubbo的配置即可,Dubbo基于Spring的Schema扩展进行加载。如果不想使用Spring配置,而希望通过API的方式进行调用(不推荐)
下面我们就来看看spring配置方式的写法:
服务提供者:
1. 下载zookeeper注册中心,下载地址:http://www.apache.org/dyn/closer.cgi/zookeeper/ 下载后解压即可,进入D:\apach-zookeeper-3.4.5\bin,
双击zkServer.cmd启动注册中心服务。
2. 定义服务接口: (该接口需单独打包,在服务提供方和消费方共享)
下面这个例子不错,写的很详细可以做个model.
package com.unj.dubbotest.provider; import java.util.List; public interface DemoService { String sayHello(String name); public List getUsers(); }
在服务提供方实现接口:(对服务消费方隐藏实现)
package com.unj.dubbotest.provider; import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List; public class DemoServiceImpl implements DemoService{ public String sayHello(String name) { return "Hello " + name; } public List getUsers() { List list = new ArrayList(); User u1 = new User(); u1.setName("jack"); u1.setAge(20); u1.setSex("男"); User u2 = new User(); u2.setName("tom"); u2.setAge(21); u2.setSex("女"); User u3 = new User(); u3.setName("rose"); u3.setAge(19); u3.setSex("女"); list.add(u1); list.add(u2); list.add(u3); return list; }
}
用Spring配置声明暴露服务:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd "> <!-- 具体的实现bean --> <bean id="demoService" class="com.unj.dubbotest.provider.DemoServiceImpl" /> <!-- 提供方应用信息,用于计算依赖关系 --> <dubbo:application name="xixi_provider" /> <!-- 使用multicast广播注册中心暴露服务地址 <dubbo:registry address="multicast://224.5.6.7:1234" />--> <!-- 使用zookeeper注册中心暴露服务地址 --> <dubbo:registry address="zookeeper://127.0.0.1:2181" /> <!-- 用dubbo协议在20880端口暴露服务 --> <dubbo:protocol name="dubbo" port="20880" /> <!-- 声明需要暴露的服务接口 --> <dubbo:service interface="com.unj.dubbotest.provider.DemoService" ref="demoService" /> </beans>
加载Spring配置,启动服务:
package com.unj.dubbotest.provider; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Provider { public static void main(String[] args) throws Exception { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"applicationContext.xml"}); context.start(); System.in.read(); // 为保证服务一直开着,利用输入流的阻塞来模拟 } }
服务消费者:
applicationContext-dubbo.xml 中注册自己需要调用的接口,我刚开始测试的时候需要的接口很多,所以把这个文件写的满满的,后来熟悉了把接口按业务类型分开,写了N多个 applicationContext-dubbo-***.xml 简练多了 》。
1.通过Spring配置引用远程服务:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd "> <!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 --> <dubbo:application name="hehe_consumer" /> <!-- 使用zookeeper注册中心暴露服务地址 --> <!-- <dubbo:registry address="multicast://224.5.6.7:1234" /> --> <dubbo:registry address="zookeeper://127.0.0.1:2181" /> <!-- 生成远程服务代理,可以像使用本地bean一样使用demoService --> <dubbo:reference id="demoService" interface="com.unj.dubbotest.provider.DemoService" /> </beans> 2.加载Spring配置,并调用远程服务:package com.alibaba.dubbo.demo.pp; import java.util.List; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.unj.dubbotest.provider.DemoService; public class Consumer { public static void main(String[] args) throws Exception { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext( new String[] { "applicationContext.xml" }); context.start(); DemoService demoService = (DemoService) context.getBean("demoService"); // String hello = demoService.sayHello("tom"); // ִ System.out.println(hello); // // List list = demoService.getUsers(); if (list != null && list.size() > 0) { for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); } } // System.out.println(demoService.hehe()); System.in.read(); } }
调用结果为:
dubbo管理页面:
这个管理页面还需要部署一个环境的,一开始我还以为是dubbo自带的,找了半天没有找到....
应用页面:
提供者页面:
消费者页面:
服务页面:
测试是否成功,我觉得只要看看状态是否正常,就ok了 ....
备注:以上博文来自 Romantic_321 地址:https://blog.csdn.net/Romantic_321/article/details/81231225
以上dubbo是
采用全 Spring 配置方式,透明化接入应用,对应用没有任何 API 侵入,只需用 Spring 加载 Dubbo 的配置即可,Dubbo 基于 Spring 的 Schema 扩展 进行加载。
如果不想使用 Spring 配置,可以通过 API 的方式 进行调用(dubbo.io dubbo官网有)。
DUBBO schema配置手册:(只展示部分参数,其余可选参照dubbo官网 dubbo.io)
1.dubbo:service 服务提供者暴露服务配置。
属性 | 对应URL参数 | 类型 | 是否必填 | 缺省值 | 作用 | 描述 | 兼容性 |
---|---|---|---|---|---|---|---|
interface | class | 必填 | 服务发现 | 服务接口名 | 1.0.0以上版本 | ||
ref | object | 必填 | 服务发现 | 服务对象实现引用 | 1.0.0以上版本 |
2.dubbo:reference 服务消费者引用服务配置。
属性 | 对应URL参数 | 类型 | 是否必填 | 缺省值 | 作用 | 描述 | 兼容性 |
---|---|---|---|---|---|---|---|
id | string | 必填 | 配置关联 | 服务引用BeanId | 1.0.0以上版本 | ||
interface | class | 必填 | 服务发现 | 服务接口名 | 1.0.0以上版本 |
3.dubbo:protocol 服务提供者协议配置。
如果需要支持多协议,可以声明多个 <dubbo:protocol>
标签,并在 <dubbo:service>
中通过 protocol
属性指定使用的协议。
属性 | 对应URL参数 | 类型 | 是否必填 | 缺省值 | 作用 | 描述 | 兼容性 |
---|---|---|---|---|---|---|---|
id | string | 可选 | dubbo | 配置关联 | 协议BeanId,可以在<dubbo:service protocol="">中引用此ID,如果ID不填,缺省和name属性值一样,重复则在name后加序号。 | 2.0.5以上版本 | |
name | <protocol> | string | 必填 | dubbo | 性能调优 | 协议名称 | 2.0.5以上版本 |
port | <port> | int | 可选 | dubbo协议缺省端口为20880,rmi协议缺省端口为1099,http和hessian协议缺省端口为80;如果没有配置port,则自动采用默认端口,如果配置为-1,则会分配一个没有被占用的端口。Dubbo 2.4.0+,分配的端口在协议缺省端口的基础上增长,确保端口段可控。 | 服务发现 | 服务端口 | 2.0.5以上版本 |
4.dubbo:registry 注册中心配置
同时如果有多个不同的注册中心,可以声明多个 <dubbo:registry>
标签,并在 <dubbo:service>
或 <dubbo:reference>
的 registry
属性指定使用的注册中心。
属性 | 对应URL参数 | 类型 | 是否必填 | 缺省值 | 作用 | 描述 | 兼容性 |
---|---|---|---|---|---|---|---|
id | string | 可选 | 配置关联 | 注册中心引用BeanId,可以在<dubbo:service registry="">或<dubbo:reference registry="">中引用此ID | 1.0.16以上版本 | ||
address | <host:port> | string | 必填 | 服务发现 | 注册中心服务器地址,如果地址没有端口缺省为9090,同一集群内的多个地址用逗号分隔,如:ip:port,ip:port,不同集群的注册中心,请配置多个<dubbo:registry>标签 | 1.0.16以上版本 |
5.dubbo:monitor 监控中心配置。
属性 | 对应URL参数 | 类型 | 是否必填 | 缺省值 | 作用 | 描述 | 兼容性 |
---|---|---|---|---|---|---|---|
protocol | protocol | string | 可选 | dubbo | 服务治理 | 监控中心协议,如果为protocol="registry",表示从注册中心发现监控中心地址,否则直连监控中心。 | 2.0.9以上版本 |
address | <url> | string | 可选 | N/A | 服务治理 | 直连监控中心服务器地址,address="10.20.130.230:12080" | 1.0.16以上版本 |
6.dubbo:application 应用信息配置。
属性 | 对应URL参数 | 类型 | 是否必填 | 缺省值 | 作用 | 描述 | 兼容性 |
---|---|---|---|---|---|---|---|
name | application | string | 必填 | 服务治理 | 当前应用名称,用于注册中心计算应用间依赖关系,注意:消费者和提供者应用名不要一样,此参数不是匹配条件,你当前项目叫什么名字就填什么,和提供者消费者角色无关,比如:kylin应用调用了morgan应用的服务,则kylin项目配成kylin,morgan项目配成morgan,可能kylin也提供其它服务给别人使用,但kylin项目永远配成kylin,这样注册中心将显示kylin依赖于morgan | 1.0.16以上版本 |
7.dubbo:module 模块信息配置。
属性 | 对应URL参数 | 类型 | 是否必填 | 缺省值 | 作用 | 描述 | 兼容性 |
---|---|---|---|---|---|---|---|
name | module | string | 必填 | 服务治理 | 当前模块名称,用于注册中心计算模块间依赖关系 | 2.2.0以上版本 |
8.dubbo:provider 服务提供者缺省值配置。
同时该标签为 <dubbo:service>
和 <dubbo:protocol>
标签的缺省值设置。
9.dubbo:consume 服务消费者缺省值配置
同时该标签为 <dubbo:reference>
标签的缺省值设置。
10.dubbo:method 方法级配置。
同时该标签为 <dubbo:service>
或 <dubbo:reference>
的子标签,用于控制到方法级。
dubbo 协议: 具体看dubbo官网
dubbo 注册中心:具体参照官网手册
Dubbo是什么?能做什么?架构图?相关推荐
- Word小技巧:秒做组织架构图,让你一目了然各部门相互关系
今天我们来分享一下word怎么做组织架构图,那么,什么是组织架构图呢?它是表现雇员.职称和群体关系的一种图表,形象的反映了组织内各机构.岗位和上下左右相互之间的关系.一个架构图就能一目了然各个部门之间 ...
- vue-orgchart做组织架构图
Vue-orgchart链接地址 <!DOCTYPE html> <html lang="en"><head><meta charset= ...
- 使用jOrgChart插件, 异步加载生成组织架构图
项目要做组织架构图,要把它做成自上而下的树形结构,于是决定 (1)通过后台查询数据库,生成树形数组结构,返回到前台. (2)使用jOrgChart插件,根据返回的数据将其子节点加入到相应的<li ...
- 智能工厂系统架构图_一些智能化弱电系统架构图,做方案可以用
前言: 大家好,我是薛哥.很多人对于每个行业的系统架构不太了解,今天汇总了一些主要方案的系统架构图,希望对新人有所帮助. 正文: 1.智慧社区智能化弱电系统解决方案,主要包含可视对讲系统.周界防范系统 ...
- 面试官:你给我画一下秒杀系统的架构图!
泪目,不堪回首! 博主毕业4年了,最近秋招开始了,每次回想起自己的秋招,都感觉到当时自己特别的可惜(菜是原罪),自己当时简历上面的项目,只有一个 农资电商平台,当时的秒杀系统还没有那么普及(简历人均秒 ...
- 如何画出优秀的软件架构图?
点击上方"芋道源码",选择"设为星标" 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 8:55 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | J ...
- 程序员必备技能:如何画好架构图?
目录 先厘清一些基础概念 1.什么是架构 2.什么是架构图 3.架构图的作用 4.架构图分类 怎样的架构图是好的架构图 画架构图遇到的常见问题 1.方框代表什么? 2.虚线.实线什么意思?箭头什么意思 ...
- mysql 按月和年累加_MySQL架构图
在学习一项新东西时,先从宏观上有个整体的把握,然后循序渐进,逐渐掌握各个细节.按照这个方法论,先记录一下mysql数据库整体架构图. 一.整体架构图 相对完整的逻辑体系架构: 抽象出重要组件,更简易化 ...
- 如何画出优秀的架构图?
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者 | 三画 来源 | 公众号「阿里巴巴云原生」 导读:技术传播 ...
- 阿里巴巴的技术专家,是如何画好架构图的?
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 来源:阿里巴巴中间件 技术传播的价值,不仅仅体现在通过商业化产品和 ...
最新文章
- Microbiome:宏蛋白质组揭示健康人肠道菌群的功能,离真相更近了一步
- 微信公众平台OAuth2.0授权
- Oracle 分析及动态采样
- 数据恢复西藏之旅--硬盘也有高原反应
- php run js,PHP switch 语句
- [Spring5]IOC容器_Bean管理XML方式_p名称空间注入
- Tcpdump个人实战总结
- 我想做产品,实现一个非常优秀的电脑桌面记事本加闹钟
- js手机端图片弹出方法
- 阿里云混合云新一代运维平台的演进与实践
- 合成器基础(三) - 减法合成器的工作原理
- 谷歌浏览器无法调用java_怎么才能正常使用谷歌浏览器
- 人艰不拆~找实习之路。
- 迅雷软件一直出现崩溃问题的常见解决方法
- 在kaggle的论坛上上传图片
- stm32中常见的通信协议之SPI
- 9.Vue中mounted的简单理解
- /var空间满了,简单处理一下
- TextView(文本框)详解
- 3COM SS3 4400系列交换机VLAN功能设置
热门文章
- autojs之大柒侧滑栏详解
- 分析:公众号运营+引流,怎么从0到1运营
- android 开机设置向导
- ubuntu下rsync两个服务器同步文件
- NANK南卡降噪耳机和OPPO蓝牙耳机哪个更好呢?哪款更能打?
- 在线CRM特点?优势?简信软件在线CRM优势?
- 一个新手的评价---人机交互方面(有些不搭题
- python定时开关机的代码_python实现Windows电脑定时关机
- 中石油大学22春季《大学英语(四)#》第一阶段在线作业
- springboot整合H+,基于summernote的富文本编辑器图片上传