摘自:https://blog.csdn.net/noaman_wgs/article/details/70214612
Dubbo背景和简介 Dubbo从电子商务系统开始,所以从电子商务系统的演变开始。
单应用框架(ORM) 当网站流量非常小时时,只需要一个应用程序就可以部署以下所有功能,以降低部署节点和成本。 缺点:单一的系统架构使得开发过程中占用的资源越来越多,随着流量的增加越来越难以维护
垂直应用框架(MVC) 垂直应用架构解决了单个应用架构面临的扩展问题,流量可分散到各子系统,系统体积可控,在一定程度上降低了开发人员之间的协调和维护成本,提高了开发效率。 缺点:但同一逻辑代码在垂直架构中需要不断复制,不能重用。
分布式应用架构(RPC) 当垂直应用程序越来越多时,应用程序之间的互动是不可避免的。提取核心业务作为独立服务,逐步形成稳定的服务中心
流动计算架构(SOA) 随着服务的进一步发展,服务越来越多,服务之间的呼叫和依赖越来越复杂,面向服务的架构体系诞生了(SOA),因此,一系列相应的技术应运而生,如服务提供、服务呼叫、连接处理、通信协议、序列化、服务发现、服务路由、日志输出等。
从电子商务系统的演变可以看出架构演变的过程:
单一应用架构
当网站流量非常小时时只需要一个应用程序来部署所有功能,以降低部署节点和成本。 此时,用于简化增删改查工作量的 数据访问框架(ORM) 是关键。 垂直应用架构
当访问量逐渐增加时,单个应用程序会增加机器带来的加速度,并将应用程序几个不相关的应用程序,以提高效率。 此时,用于加快前端页面的开发 Web框架(MVC) 是关键。 分布式服务架构 当垂直应用程序越来越多时,应用程序之间的互动是不可避免的。核心业务作为独立服务,逐步形成稳定的服务中心,使前端应用程序能够更快地响应多变的市场需求。 此时,用于改善业务再利用和整合 分布式服务框架(RPC) 是关键。 流动计算架构 当服务越来越多、容量评估、小型服务资源浪费等问题逐渐出现时,需要根据访问压力增加调度中心,实时管理集群容量,提高集群利用率。 此时,用于提高机器利用率 资源调度与治理中心(SOA) 是关键。 在这里插播一条关于RPC的简介: RPC(Remote Procedure Call Protocol):远程过程调用: 两台服务器A、B,分别部署不同的应用程序a,b。当A服务器想要调用B服务器上应用b提供的函数或方法的时候,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义传达调用的数据。 说白了,你在你的机器上写了一个程序,我不能直接在这里调用。这时,远程服务调用的概念出现了。
RPC在不了解底层网络技术的情况下,通过网络从远程计算机程序要求服务。RPC假设某些传输协议存在,如协议TCP或UDP,将信息数据带到通信程序之间。OSI在网络通信模型中,RPC跨越传输层和应用层。RPC更容易开发包括网络分布式多程序在内的应用程序。 RPC采用客户机/服务器模式。请求程序是客户机,服务提供程序是服务器。首先,客户机调用过程向服务过程发送具有过程参数的调用信息,然后等待响应信息。在服务器端,过程保持睡眠,直到信息到达。当一个呼叫信息到达时,服务器获程参数,计算结果,发送回复信息,然后等待下一个呼叫信息。最后,客户端呼叫流程接收回复信息,获取流程结果,然后呼叫执行继续进行。
RPC需要解决的问题: (可以稍作了解,详情请查看其他博文)
通讯问题 : 主要是在客户端和服务器之间建立TCP连接,远程过程调用的所有交换数据都在此连接中传输。连接可按需连接,调用后断开,或长连接,多个远程过程调用共享同一连接。 寻址问题 : A服务器上的应用怎么告诉底层的RPC如何连接到B服务器(如主机或IP地址)和特定的端口,方法的名称是什么,以便完成调用。比如基于Web服务协议栈RPC,提供一个endpoint URI,或者是从UDDI搜索服务。如果是RMI如果调用,还需要一个RMI Registry注册服务地址。 序列化 与 反序列化 : 当A服务器上的应用启动远程调用时,方法的参数需要通过底层网络协议,如TCP传递到B服务器,由于网络协议是基于二进制的,内存中的参数的值要序列化成二进制的形式,也就是序列化(Serialize)或编组(marshal),将序列化二进制发送到B服务器,通过搜索和传输。 同理,B服务器接收参数应反序列化参数。B服务器应用调用自己的方法后返回的结果也应该序列化为A服务器,A服务器接收也需要反序列化。 Dubbo是什么 Dubbo是:
分布式服务框架 高性能和透明度RPC远程服务调用方案 SOA服务治理方案 每天为2千多个服务提供大于30亿次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点以及别的公司的业务中。
Dubbo架构
Provider: 服务提供提供商。 Consumer: 服务消费者调用远程服务。 Registry: 注册中心的服务注册和发现。 Monitor: 监控中心统计服务的调用次数和调用时间。
调用流程 0.服务容器负责启动、加载和运行服务提供商。 1.服务提供商在启动时向注册中心注册自己提供的服务。 2.服务消费者在注册中心订阅所需服务。 3.注册中心向消费者返回服务提供商的地址列表。如有变更,注册中心将根据长连接向消费者推送变更数据。 4.服务消费者,根据软负载平衡算法,从提供者地址列表中选择一个提供者进行呼叫。如果呼叫失败,则选择另一个呼叫。 5.服务消费者和提供服务,每分钟定期向监控中心发送一次内存中累计调用次数和调用时间的统计数据
Dubbo注册中心 由于应用系统的复杂性,服务提供商需要发布服务,服务的数量和类型也在扩大; 对于服务消费者来说,他们最关心的是如何获得所需的服务,而面对复杂的应用系统,他们需要管理大量的服务调用。 而且,对于服务提供商和服务消费者来说,他们也可能有两个角色,即提供服务和消费服务。
通过统一管理服务,可以有效优化服务发布/使用的内部应用流程和管理。服务注册中心可以通过具体协议完成外部服务的统一。
Dubbo有以下类型可供选择:
Multicast注册中心 Zookeeper注册中心 Redis注册中心 Simple注册中心 Dubbo优缺点 优点:
透明的远程方法调用 - 调用远程方法就像调用本地方法一样;配置简单,没有API侵入。 软负载平衡和容错机制 可替代内网nginx lvs等待硬件负载平衡器。 自动注册服务注册中心 & 配置管理 -注册中心根据接口名自动查询提供者,无需写下服务提供者的地址ip。 使用类似zookeeper作为服务注册中心,等分布式协调服务可以移动大部分项目配置zookeeper集群。 监控和治理服务界面 -Dubbo-admin与Dubbo-monitor为不同的应用程序提供完善的服务接口管理和监控功能 多版本、多协议、多注册中心管理。 缺点:
只支持JAVA语言 Dubbo入门Demo 了解了Dubbo以后自然要建一个简单的。Demo实现。本文采用Dubbo与Zookeeper、Spring整合框架。
主要有以下步骤: 1. 安装Zookeeper,启动; 2. 创建MAVEN项目,构建Dubbo Zookeeper Spring实现的简单Demo; 3. 安装Dubbo-admin,实现监控。
1 Zookeeper介绍与安装 本Demo中的Dubbo使用注册中心Zookeeper。为什么采用Zookeeper呢?
Zookeeper它是一个分布式的服务框架,是树形目录服务的数据存储,可以实现集群管理数据 ,这里可以做得很好Dubbo服务注册中心。
Dubbo能与Zookeeper实现集群部署,当供应商停电等异常停机时,Zookeeper注册中心可以自动删除提供者信息,当提供者重启时,注册数据和订阅请求可以自动恢复
这里不一一描述具体的安装方法,请参考博文: http://blog.csdn.net/tlk20071/article/details/52028945
安装完成后,进入bin并启动目录zkServer.cmd,这个脚本将启动一个脚本java进程: (注:需先启动zookeeper后,后续dubbo demo只能使用代码操作zookeeper注册中心的功能)
2 创建MAVEN项目 项目结构: 主要分为三个模块: dubbo-api : 储存公共接口; dubbo-consumer : 调用远程服务; dubbo-provider : 远程服务。
下面将详细描述代码构建过程。 1) 首先构建MAVEN导入所需的项目jar包依赖。 需要进口的有spring, dubbo, zookeeper等jar包。 (详见后面提供的项目代码)
2)创建dubbo-api的MAEN项目(有独立的pom.xml,用来打包供提供者消费者使用)。 在项目中定义服务接口:该接口需单独打包,在服务提供方和消费方共享。
package com.alibaba.dubbo.demo; import java.util.List;
public interface DemoService { List<String> getPermissions(Long id); } 1 2 3 4 5 6 3)创建dubbo-provider的MAVEN项目(有独立的pom.xml,用来打包供消费者使用)。 实现公共接口,此实现对消费者隐藏:
package com.alibaba.dubbo.demo.impl;
import com.alibaba.dubbo.demo.DemoService;
import java.util.ArrayList; import java.util.List; public class DemoServiceImpl implements DemoService { public List<String> getPermissions(Long id) { List<String> demo = new ArrayList<String>(); demo.add(String.format("Permission_%d", id - 1)); demo.add(String.format("Permission_%d", id)); demo.add(String.format("Permission_%d", id + 1)); return demo; } } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 需加入公共接口所在的依赖
用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-admin 或 dubbo-monitor 会显示这个名字,方便辨识--> <dubbo:application name="demotest-provider" owner="programmer" organization="dubbox"/> <!--使用 zookeeper 注册中心暴露服务,注意要先开启 zookeeper--> <dubbo:registry address="zookeeper://localhost:2181"/> <!-- 用dubbo协议在20880端口暴露服务 --> <dubbo:protocol name="dubbo" port="20880" /> <!--使用 dubbo 协议实现定义好的 api.PermissionService 接口--> <dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoService" protocol="dubbo" /> <!--具体实现该接口的 bean--> <bean id="demoService" class="com.alibaba.dubbo.demo.impl.DemoServiceImpl"/> </beans> 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 启动远程服务:
package com.alibaba.dubbo.demo.impl;
import org.springframework.context.support.ClassPathXmlApplicationContext; import java.io.IOException; public class Provider { public static void main(String[] args) throws IOException { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("provider.xml"); System.out.println(context.getDisplayName() + ": here"); context.start(); System.out.println("服务已经启动..."); System.in.read(); } } 1 2 3 4 5 6 7 8 9 10 11 12 13 4)创建dubbo-consumer的MAVEN项目(可以有多个consumer,但是需要配置好)。 调用所需要的远程服务:
通过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="demotest-consumer" owner="programmer" organization="dubbox"/> <!--向 zookeeper 订阅 provider 的地址,由 zookeeper 定时推送--> <dubbo:registry address="zookeeper://localhost:2181"/> <!--使用 dubbo 协议调用定义好的 api.PermissionService 接口--> <dubbo:reference id="permissionService" interface="com.alibaba.dubbo.demo.DemoService"/> </beans> 1 2 3 4 5 6 7 8 9 10 11 12 启动Consumer,调用远程服务:
package com.alibaba.dubbo.consumer; import com.alibaba.dubbo.demo.DemoService; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Consumer { public static void main(String[] args) { //测试常规服务 ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("consumer.xml"); context.start(); System.out.println("consumer start"); DemoService demoService = context.getBean(DemoService.class); System.out.println("consumer"); System.out.println(demoService.getPermissions(1L)); } } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 5)运行项目,先确保provider已被运行后再启动consumer模块: 运行提供者: 消费者成功调用提供者所提供的远程服务:
当然,这只是一个模拟的项目,实际中有多提供者多消费者情况,比这要复杂的多,当然只有这样才能体现dubbo的特性。
Dubbo管理控制台介绍 管理控制台功能
路由规则,动态配置,服务降级 访问控制,权重调整 负载均衡
下载dubbo-admin,可自行根据网上介绍安装。大致做法就是将dubbo-admin中 的某个文件夹内容替换到tomcat的conf中,再运行tomcat即可。但我在实际操作中发现JDK8无法运行,后来找到一个JDK8可以实现的dubbo-admin版本,下载地址:http://www.itmayun.com/it/files/226631678709806/resource/901920001882583/1.html。
成功开启输入用户名密码root后,即可进入控制台首页查看消费者提供者情况: 查看提供者: 查看消费者:
目前,阿里又开始更新,有兴趣可以查看: https://github.com/apache/incubator-dubbo
整个项目的代码已经上传到我的github上https://github.com/nomico271/DatatablesDemo.git,欢迎查看。 (github上项目中的图片为博客中内容,可全部删除)。
参考:https://www.zhihu.com/question/25536695
--------------------- 作者:是Guava不是瓜娃 来源:CSDN 原文:https://blog.csdn.net/noaman_wgs/article/details/70214612 版权声明:本文为博主原创文章,转载请附上博文链接!