sohu,Dubbo入门---建立一个最简略的Demo结构,关秀媚

频道:我们的头条 日期: 浏览:277

Dubbo布景和简介

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的MAVEN项目(有独立的pom.xml,用来打包供供给者顾客运用)。

在项目中界说服务接口:该接口需独自打包,在服务供给方和消费方同享。

package com.alibaba.dubbo.demo;

import java.util.List;

public interface DemoService {

List getPermissions(Long id);

}

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 getPermissions(Long id) {

List demo = new ArrayList();

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;

}

}

需参加公共接口地点的依靠

用Spring装备声明露出服务

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">

发动长途服务:

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();

}

}

4)dubbo-consumer的MAVEN项目(能够有多个consumer,可是需求装备好)。

调用所需求的长途服务:

经过Spring装备引证长途服务:

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">

发动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));

}

}

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