目前处于实习期间,白天工作,网上自主学习。最近没事逛了一下当前招聘网上的招聘要求,其中dubbo这个关键字出现的比较多,因此花了点时间学习了一番,在这写写自己的理解。

 说起Dubbo,得先聊聊RPC,如果说互联网架构师互联网行业标配,那么RPC技术是分布式架构的基石

一、什么是RPC

  RPC是指RPC协议:定义了rpc实现的规范,核心过程包括了客户端和服务端的通讯协议,寻址,数据序列化/反序列化,http,dubbo-rpc都属于rpc的一种协议

  RPC框架:对上述核心过程进行了封装,不需要开发人员自己去定义协议,实现序列化的细节工作,这样的组件成为RPC框架。

  常见RPC框架有thrift、GRpc、dubbo、motan

  其中:客户端如果想调用服务端

  通讯协议:TCP/UDP

  寻址:程序需要通过异性方式,才能知道服务端的IP+PORT号

  序列化:数据在网络中传输需要一定的格式

二、架构历史
      随着网络时代更新换代,其中所涉及的技术也是随着时间日益变化,当然这也包含我们做项目时所利用到的框架。

1、单一架构。刚开始时,我们采用的是单一架构,这也是刚入门的小伙伴所钟爱的架构,其项目中所涉及到的内容都统一部署在一起,无需要分层的思想。当然此仅仅局限于简单的增删改查 。

    2、垂直架构。当数据访问比较大时,简单的单一架构已经远远无法满足需求,垂直架构将应用拆分成互不相干的应用,以此来提高效率,这大大的增加前端页面开发的效率,减少机器的负担。

3、MVC架构。当项目数据较多时,维护成本也就增大,MVC模式就尤其显得格外重要。MVC即model、view、controller,其将功能的各部分划分出来,同种功能放在同一包下。

4、分布式架构。垂直应用越来越多时,各个应用之间的交互不可避免。此时将核心业务抽取出来,形成独立的服务,利用分布式缓存技术调用控制层来调用这些业务逻辑,以达到代码重构。这就是所谓的SOA(面向服务架构)思想。如下订单可以将其抽取出来,以达到服务共享。

三、什么是Dubbo

按我的理解,Dubbo是一个分布式框架,他出现的目的是为了提高性能和透明化的RPC远程服务调用方案,SOA服务治理方案。其本质是一个服务调用,一个远程调用的分布式框架。其核心部分包含为:

1、远程通讯:提供多种基于长连接的NIO框架抽象封装。

2、集群容错:提供基于接口方法的透明远程调用,包含软负载均衡、失败容错、地址路由、动态配置等集群支持。

3、自动发现:基于注册中心目录服务,使服务消费方能动态查找服务提供方。

 Dubbo局限

 dubbo适合小数据量大并发的服务调用,以及消费者机器远大于生产者机器数的情况,不适合传输大数据量的服务比如文件、视频等,除非请求量很低。

四、dubbo框架流程图

  dubbo流程图分为四大角色,依次为生产者,消费者,注册中心以及监控中心。

  生成者:提供服务,即提供方法接口。

  注册中心:生产者将每个服务的功能的注册到注册中心,每次有新服务的更新都会注册到注册中心,往其添加一个节点。其用Zk:(zookeeper,像树)作为注册中心,除此之外还可以用redis做,但是不推荐。

  消费者:消费者与注册中心相连接,称之为订阅。一旦有新的服务,注册中心就会将结果返回通知消费者(zookeeper当中有一个事件通知,一旦节点有变化,就会通知客户端),消费者一旦收到,就notify可以进行调用消费者中的服务(即调用接口)。

监控中心:做消费记录,如监控消费者有没有订阅成功,以及有没有记录日志等。至于为什么redis也能作为注册中心,是因为他里面也有一个watch监控。

五、就负载均衡而言,关于nginx和dubbo的区别

  dubbo的负载均衡已经是服务层面的了,和nginx的负载均衡还在http请求层面完全不同。至于二者哪个优秀,当然没办法直接比较。
涉及到负载均衡就涉及到你的业务,根据业务来选择才是最适合的。
dubbo具备了server注册,发现、路由、负载均衡的功能,在所有实现了这些功能的服务治理组件中,个人觉得dubbo还是略微笨重了,因为它本身是按照j2EE范畴所制定的中规中矩的服务治理框架。
  dubbo在服务发现这个地方做的更像一个dns,一个消费者需要知道哪里有这么一个服务,dubbo告诉他,然后他自己去调用。
而nginx在具备了以上功能,还有两个最主要的功能是,1,维持尽可能多的连接。2,把每个连接的具体服务需求pass到真正的worker上。
但是这两个功能,dubbo做不到第一个。
所以,结合你自己的业务来选择用什么,nginx和dubbo在使用上说白了就是一个先后的关系而已。

总结:

nginx是横在用户的浏览器和自家的服务器之间。

dubbo是横在自家的服务器和自家的服务器之间啊,是利用zookeeper的持久节点来保存信息。

六、快速入门

  需要建立三个maven工程,分别为接口、消费者和生产者

  1、先构建接口和生产者项目,并将接口的依赖注入到生产者pom文件(打开interface接口pom文件,将其依赖信息写进provider的pom文件)

  

  相关依赖代码

 <!--要使用会员接口,必须先引入其依赖 -->
<dependency>
<groupId>com.itmayie.du</groupId>
<artifactId>Member-interface</artifactId>
<version>0.0.-SNAPSHOT</version>
</dependency>
<!--生产者要引用到接口的方法,需要引入dubbo和zookeeper依赖-->
<!-- 引入dubbo依赖 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.5.</version>
</dependency>
<!-- 添加zookeeper客户端依赖 -->
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>

  2、会员接口提供定义接口方法

  

//会员服务 提供接口
public interface UserService {
//使用用户UserID查询用户信息
public String getUser(int id);
}

  3、生产者提供实现类

public class UserServiceImpl implements UserService{

    public String getUser(int id) {
System.out.println("会员服务接受订单服务ID"+id);
if(id==){
return "yiling";
}
if(id==){
return "jiaxianseng";
}
return "未找到...";
} }

  4、生产者编写spring配置文件,用于注入dubbo和zookeeper和实现类,暴露自己服务

<?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="provider"/>
<!-- 使用zookeeper注册中心暴露服务地址 -->
<dubbo:registry address="zookeeper://192.168.174.133:2181"/>
<!-- 使用dubbo协议在29014端口暴露服务 -->
<dubbo:protocol name="dubbo" port="29014"/>
<!-- 申明需要暴露的服务接口 -->
<dubbo:service interface="com.dubbo.service.UserService" ref="userService"/>
<!-- 具体实现bean -->
<bean id="userService" class="com.dubbo.serviceImpl.UserServiceImpl">
</bean>
</beans>

  5、启动zookeeper

[oracle@bogon bin]$ pwd
/usr/java/zookeeper-3.4.12/bin
[oracle@bogon bin]$ ./zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /usr/java/zookeeper-3.4.12/bin/../conf/zoo.cfg
Starting zookeeper ... already running as process 3579.
[oracle@bogon bin]$ ./zkCli.sh
[zk: localhost:2181(CONNECTED) 7] ls /
[zookeeper]

  6、测试连接zookeeper

//加载配置文件
ClassPathXmlApplicationContext applicationContext=new ClassPathXmlApplicationContext("provider.xml");
applicationContext.start();
System.out.println("会员服务启动成功");
//保证服务一直启动,按任意键可以停止
System.in.read();

  如果此时在开启的zookeeper客户端根节点看到新生成的节点说明连接成功

  控制台:

log4j:WARN No appenders could be found for logger (org.springframework.core.env.StandardEnvironment).
log4j:WARN Please initialize the log4j system properly.
会员服务启动成功

  zookeeper:

[zk: localhost:2181(CONNECTED) 8] ls /
[dubbo, zookeeper]
[zk: localhost:2181(CONNECTED) 9] ls2 /dubbo
[com.dubbo.service.UserService]

  7、编写消费者

  1) pom文件引入接口、dubbo、zookeepre依赖

 <dependency>
<groupId>Member-Interface</groupId>
<artifactId>Member-Interface</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<!-- 引入dubbo依赖 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.5.6</version>
</dependency>
<!-- 添加zookeeper客户端依赖 -->
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>

  2) 编写消费者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="consumer"/>
<!-- 使用multicast广播注册中心暴露发现服务地址 -->
<dubbo:registry protocol="zookeeper" address="zookeeper://192.168.174.133:2181"/>
<!-- 生成远程服务代理,可以和本地bean一样使用demoService -->
<dubbo:reference id="userService" interface="com.dubbo.service.UserService"/>
</beans>

  3) 编写调用测试类

public class OrderService {
public static void main(String[] args) {
ClassPathXmlApplicationContext applicationContext=new ClassPathXmlApplicationContext("consumer.xml");
applicationContext.start();
System.out.println("订单服务启动成功..");
UserService userService=(UserService) applicationContext.getBean("userService");
System.out.println("订单服务调用会员服务开始");
String result=userService.getUser(1);
System.out.println("订单服务调用会员服务结束..result"+result);
System.in.read(); }
}

  注意:测试时要开启zookeeper,先启动生产者,再开启消费者,顺序不能错

  显示结果:

  消费者控制台:

log4j:WARN No appenders could be found for logger (org.springframework.core.env.StandardEnvironment).
log4j:WARN Please initialize the log4j system properly.
会员服务启动成功
会员接受订单,ID号为1

  消费者控制台:

log4j:WARN No appenders could be found for logger (org.springframework.core.env.StandardEnvironment).
log4j:WARN Please initialize the log4j system properly.
订单服务启动
结果是yiling

七、关于dubbo所支持的协议

  Dubbo协议、rmi协议、hession协议、http协议

八、关于dubbo-admin平台

  dubbo-admin平台是用来管理duddo的客户端,是一个可视化的dubbo平台界面,在其平台下,你可以调制各种参数。以下为dubbo-admin使用。

  1、下载dubbo-admin

  官网:dubbo-admin

  2、将dubbo-admin.war进行解压,将解压的内容放在tomcat下的webapp目录中的ROOT目录(先清空原ROOT下的文件),这里我是放在的linux环境下的tomcat下

[root@bogon ROOT]# pwd
/usr/java/tomcat/tomcat/webapps/ROOT
[root@bogon ROOT]# ll
总用量 20
-rw-r--r--. 1 root root 101 3月 31 2015 crossdomain.xml
drwxr-xr-x. 2 root root 54 6月 4 18:42 css
-rw-r--r--. 1 root root 1406 3月 31 2015 favicon.ico
drwxr-xr-x. 2 root root 4096 6月 4 18:42 images
drwxr-xr-x. 2 root root 4096 6月 4 18:42 js
drwxr-xr-x. 4 root root 51 6月 4 18:42 META-INF
drwxr-xr-x. 2 root root 65 6月 4 18:41 SpryAssets
drwxr-xr-x. 8 root root 4096 6月 4 18:41 WEB-INF

  3、启动tomcat

[root@bogon bin]# ./startup.sh

  4、输入域名(平常访问tomcat)即可进入dubbo-admin界面

  

  注意用户名和密码是根据dubbo.properties

[root@bogon ROOT]# cd WEB-INF/
[root@bogon WEB-INF]# tail -n 5 dubbo.properties
dubbo.registry.address=zookeeper://127.0.0.1:2181
dubbo.admin.root.password=root
dubbo.admin.guest.password=guest

  官方界面如下:

  

九、关于Dubbo集群

模拟两台提供相同服务的接口(集群),可以解决高并发的问题

步骤:

  1. 先更改生产者dubbo的端口号为29014,然后启动生产者
  2. 再更改生产者dubbo的端口号为29015,然后启动生产者
  3. 此时集群环境已经搭建好了,在dubbo控制平台中的服务治理中的提供者中可以看到两个ip地址

十、关于dubbo的负载均衡 

1、什么是负载均衡:
  负载平衡也称负载共享,是指对系统中的负载情况进行动态调整,以尽量消除或减少系统中各节点负载不均衡的现象。具体实现方法是将过载节点上的任务转移到其他轻载节点上,尽可能实现系统各节点的负载平衡,从而提高系统的吞吐量。负载共享有利于统筹管理分布式系统中的各种资源,便于利用共享信息及其服务机制扩大系统的处理能力。

2、当出现集群的情况下,消费者是怎样实现那台主机的选择呢?
如同nginx一样,dubbo也有负载均衡的策略

  在集群负载均衡时,Dubbo提供了多种均衡策略,缺省为random随机调用。
存在慢的提供者累积请求问题,比如:第二台机器很慢,但没挂,当请求调到第二台时就卡在那,久而久之,所有请求都卡在调到第二台上。

解决办法 :结合权重,把第二台机(性能低的)的权重设置低一点
做法
1) 为接口创建负载均衡策略
在服务治理中选择负载均衡

2) 这里我们选择的是随机,也就是消费者会随机选择服务端口,当然可以控制生产者的权重问题来更改获取几率。

十一、关于dubbo容错

当一个节点发生错误时,消费者会采取什么办法?

Dubbo中自带负载均衡容错,即当一个节点发生错误(如20914节点关闭),由原来连接到20914节点的消费者会自动更改别的节点。

十二、当所有集群节点的dubbo服务都挂了,即发生了错误,消费者会怎么办?

duboo通过keeopalived脚本监听服务器,如果服务停止掉,自动帮你重启,如果一直重启失败了,发送报警邮箱。

 

  

简述Dubbo的更多相关文章

  1. java面试宝典2019(好东西先留着)

    java面试宝典2019 1.meta标签的作用是什么 2.ReenTrantLock可重入锁(和synchronized的区别)总结 3.Spring中的自动装配有哪些限制? 4.什么是可变参数? ...

  2. dubbo简述

    转http://blog.csdn.net/hzzhoushaoyu/article/details/4327309 一.前言 部门去年年中开始各种改造,第一步是模块服务化,这边初选dubbo试用在一 ...

  3. 分布式个人理解概述和dubbo实现简述

    什么是分布式?为什么使用分布式? 个人有一些浅薄的理解希望可以批评指正,从概念和应用 两个方面概述:      一.概念:分布式也叫分布式服务,也就是说 他是 一种面向服务思想的程序设计和架构风格,典 ...

  4. Dubbo基础三之配置方式简述

    Dubbo基础一之实战初体验 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中,体验了两种配置方式一种注解一种xml.其中xml是在注解配置失败没有找到解决方法后选择xml替代体验的.那 ...

  5. 基于SOA分布式架构的dubbo框架基础学习篇

    以需求用例为基,抽象接口,Case&Coding两条线并行,服务(M)&消费(VC)分离,单元.接口.功能.集成四层质量管理,自动化集成.测试.交付全程支持. 3个大阶段(需求分析阶段 ...

  6. dubbo(转载)

    1. Dubbo是什么? Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案.简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需 ...

  7. 基于ZooKeeper的Dubbo注册中心

    SOA服务治理 dubbo_zk 服务总线 感兴趣的M我微信:wonter 微信扫描,人人 CTO 大本营 基于SOA架构的TDD测试驱动开发模式 服务治理要先于SOA 简述我的SOA服务治理 从页面 ...

  8. 最近项目用到Dubbo框架,临时抱佛脚分享一下共探讨。

    1. Dubbo是什么? Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案.简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需 ...

  9. 最近项目用到Dubbo框架,分享一下~

    1. Dubbo是什么? Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案.简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需 ...

随机推荐

  1. 如何将.crt的ssl证书文件转换成.pem格式

    如何将.crt的ssl证书文件转换成.pem格式 摘自:https://www.landui.com/help/show-8127 2018-07-04 14:55:41 2158次 准备:有一台安装 ...

  2. tomcat端口作用

    <Server port="8005" shutdown="SHUTDOWN">   <Connector port="8080&q ...

  3. Python - excel 详解

    安装 pip install xlrd        # 读xlspip install xlwt     # 写xlspip install xlutils     # 改写xls 读取 Excel ...

  4. CBV加装饰器解决登录注册问题和 <<中间件>>

    文本目录 CBV加装饰器解决登录注册问题 一:什么是中间件 二:中间件有什么用 三:自定义中间件 四:中间件应用场景 五:SCRF TOKEN跨站请求伪造 六: 其他操作 CBV加装饰器解决登录注册问 ...

  5. [GO]gomaxprocs的使用

    package main import ( "runtime" "fmt" ) func main() { n := runtime.GOMAXPROCS()/ ...

  6. [GO]结构体指针变量初始化

    package main import "fmt" func main() { type student struct { id int name string sex byte ...

  7. Spring框架总结(三)

    SpringIOC容器 一.创建对象 SpringIOC容器,是spring核心内容. 作用: 创建对象 & 处理对象的依赖关系 IOC容器创建对象: 创建对象, 有几种方式: 1) 调用无参 ...

  8. Hadoop-2.4.0分布式安装手册

    目录 目录 1 1. 前言 2 2. 部署 2 2.1. 机器列表 2 2.2. 主机名 2 2.2.1. 临时修改主机名 3 2.2.2. 永久修改主机名 3 2.3. 免密码登录范围 4 3. 约 ...

  9. 编写高质量代码改善C#程序的157个建议——建议127:用形容词组给接口命名

    建议127:用形容词组给接口命名 接口规范的是“Can do”,也就是说,它规范的是类型可以具有哪些行为.所以,接口的命名应该是一个形容词,如: IDisposable表示可以被释放 IEnumera ...

  10. ERROR: from PIL import Image ImportError: No module named PIL

    ERROR: from PIL import Image ImportError: No module named PIL 到 http://www.pythonware.com/products/p ...