热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

分布式Dubbo分布式服务

分布式,du

1. Dubbo官网

Dubbo下载地址

1). 发展历史

随着互联网的不断发展,网站的应用规模越来越大,常规的垂直架构已经无法应对,尤其是类似电商的项目,所以分布式架构和流动计算架构已经势在必行。Dubbo就是资源调度和服务治理中心的管理工具。
① 单一应用架构(ORM)
当网站流量很小时,只需一个应用,将所有功能如下单支付等都部署在一起,以减少部署节点和成本。 缺点:单一的系统架构,使得在开发过程中,占用的资源越来越多,而且随着流量的增加越来越难以维护


img_77bc51ee102a87ac1fa63800b74c200e.png
图1.png

② 垂直应用架构(MVC)
垂直应用架构解决了单一应用架构所面临的扩容问题,流量能够分散到各个子系统当中,且系统的体积可控,一定程度上降低了开发人员之间协同以及维护的成本,提升了开发效率。 缺点:但是在垂直架构中相同逻辑代码需要不断的复制,不能复用。


img_b26336eb43b88206f6e275938bc5ce2e.png
图2.png

③ 分布式服务架构(RPC)
当垂直应用越来越多,有很多相同的业务逻辑,这样应用直接的交互不可避免,此时将核心业务抽取出来,作为独立的服务,逐 渐形成稳定的服务中心,以应对快速变化的外部市场环境。


img_8ed50e3888183019517a445fe32aec9d.png
图3.png

④ 流动计算架构(SOA)
当服务越来越多,容量的评估,小服务资源浪费等问题逐渐暴露,此时需要一个服务治理工具来管理集群容量,提高利用率。


img_1d74547bdc4682e4fa6fecf7a4be0cab.png
图4.png
2). 为什么使用dubbo?

1.webservice:效率不高基于soap协议,项目中不建议使用,但它的优点在于跨语言通信,适用于不同公司相互调用接口。
2.使用restful形式服务:http+json。很多项目中的应用,如果服务太多,系统之间调用关系混乱,需要治疗服务。
3.使用dubbo。使用rpc协议进行远程调用,之间使用socket通信,传输效率高,并且可以统计出系统之间的调用关系、调用次数。
说白了dubbo就是一个服务治理工具,是一个服务的中间件,由于dubbo是通过java编写的,dubbo最大的缺点就出现了,它只适用于java系统间的通信。

3). Dubbo架构

角色说明:

  • Provider:暴露服务的服务提供方
  • Container:服务运行容器
  • Consumer:调用服务的消费方
  • Registry:注册服务与发现服务中心
  • Monitor:统计服务调用的监控中心(可有可无)


    img_95345b2981ac8d51e5322c8713891cfb.png
    图5.png

调用关系说明:
0:服务运行容器启动,加载服务提供者
1:在启动时告诉注册中心服务方有什么服务
2:消费者调用服务时,先到注册中心订阅所需要服务
3:注册中心返回结果即该服务的地址
4:消费者通过地址调用服务(此时注册中心没用了)
5:服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次到监控中心

4). RPC(Remote Procedure Call Protocol)

远程过程调用: 两台服务器A、B,分别部署不同的应用a,b。当A服务器想要调用B服务器上应用b提供的函数或方法的时候,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义传达调用的数据。


img_debc93292f7c2564b80f4b1e6d1aa0cb.png
图6.png

RPC是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。 RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。

5). Dubbo的注册中心
  • Multicast注册中心
  • Zookeeper注册中心
  • Redis注册中心
  • Simple注册中心
6). Dubbo优缺点
  • 优点:
  1. 透明化的远程方法调用:像调用本地方法一样调用远程方法;只需简单配置,没有任何API侵入。
  2. 软负载均衡及容错机制:可在内网替代nginx lvs等硬件负载均衡器。
  3. 服务注册中心自动注册 & 配置管理:不需要写死服务提供者地址,注册中心基于接口名自动查询提供者ip。使用类似zookeeper等分布式协调服务作为服务注册中心,可以将绝大部分项目配置移入zookeeper集群。
  4. 服务接口监控与治理 :Dubbo-admin与Dubbo-monitor提供了完善的服务接口管理与监控功能,针对不同应用的不同接口,可以进行 多版本,多协议,多注册中心管理。
  • 缺点:只支持JAVA语言

2. Spring+Dubbo+ZooKeeper实例

1). 准备jar包(共16个)
  • **Spring: ** commons-logging-1.2.jar、spring-aop-5.0.5.RELEASE.jar、spring-beans-5.0.5.RELEASE.jar、spring-context-5.0.5.RELEASE.jar、spring-core-5.0.5.RELEASE.jar、spring-expression-5.0.5.RELEASE.jar
  • **Dubbo: ** dubbo-2.6.1.jar
  • **ZooKeeper: ** log4j-1.2.16.jar、slf4j-api-1.6.1.jar、slf4j-log4j12-1.6.1.jar、netty-3.10.5.Final.jar、zookeeper-3.4.10.jar
  • **Other: **curator-client-4.0.1.jar、curator-framework-4.0.1.jar、javassist-3.22.0-GA.jar、selenium-server-standalone-3.11.0.jar
    img_ff524b252c3b71113eb78a1323b29759.png
    图7.png
2). 创建Dubbo-api Java项目

I. 引入jar包
右键项目 -> Build Path -> Configure Build Path... -> Libraries -> Add External JARs... 找到自己刚刚存放jar包的文件夹,我的是在E:\eclipse\libs\文件夹中,全选(Ctrl+A)jar包,点击打开—> OK. 导包成功.

img_0ed82937daaf01843d86a9e8aa435315.png
图8.png

II. 将解压ZooKeeper后的文件夹中/conf/文件夹下的log4j.properties拷贝到工程的src目录下


img_fba547f7ec3cb0c7f98feae4b5a28b95.png
图9.png

III. 在src下创建ItemService接口

public interface ItemService { List getList(Long id); } 

IV. Dubbo-api 工程目录结构


img_b9b877d03ea80d566574cf982aecf2a5.png
图10.png
3). 创建Dubbo-provider Java工程

I. 导包--方法同上
II. 依赖上一步完成的Dubbo-api Java工程
工程上右键 -> Build Path -> Configure Build Path... -> Project -> Add... ->选择Dubbo-api 点击OK -> OK
III. 创建ItemService的实现类ItemServiceImpl

public class ItemServiceImpl implements ItemService{ @Override public List getList(Long id) { List list = new ArrayList<>(); for (int i = 0; i <20; i++) { list.add("item" + i); } return list; } } 

IV. 在src目录下创建provider.xml文件

             

如果遇到无法快捷提示dubbo标签的情况, 请参考此文--Dubbo 无法加载dubbo.xsd
V. 创建Provider类,此类中启动此工程

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

VI. Dubbo-provider 工程目录结构


img_66371999f10d5ade167512b8df827847.png
图11.png
4). 创建Dubbo-consumer Java工程

I. 导包 -- 方法同上
II. 在src下创建consumer.xml配置文件

         

III. 创建Consumer类来启动当前工程

public class Consumer { public static void main(String[] args) { ClassPathXmlApplicationContext cOntext= new ClassPathXmlApplicationContext("consumer.xml"); context.start(); System.out.println("consumer start"); ItemService demoService = context.getBean(ItemService.class); System.out.println("consumer"); List list = demoService.getList(1L); for (String string : list) { System.out.println(string); } } } 

IV. Dubbo-consumer 工程目录结构


img_a1bc69872ddd5691106b61d18c475a67.png
图12.png
5). 测试

I. 开启ZooKeeper -- ZooKeeper安装及使用
II. 执行Dubbo-provider工程中的Provider类

img_86abdb806d758b071c4e7488e6bf9df9.png
图13.png

III. 再启动Dubbo-consumer工程中的Consumer类
img_c1c1a4aedb0b5330d34c3ad98b17086e.png
图15.png

3. Dubbo 控制台安装

1). Dubbo-admin下载
2). 编译项目

编译项目需要使用到Maven命令, Linux 安装Maven 和Windows 安装Maven
下载之后解压,并进入incubator-dubbo-ops-master文件夹,在命令提示符窗口中输入

mvn clean package 

编译成功如下图:


img_79bb17c68d97ffa1e9fd62e9b46691e6.png
图16.png
3). 安装Tomcat容器

img_fefa48a33f5d119d2d1da3cdb268edcb.png
图17.png

这里我下载的是zip包,下载后并解压
img_809a93ece71a0c920ab307311156cc2c.png
图18.png

4). 复制文件

将incubator-dubbo-ops-master\dubbo-admin\target\下的dubbo-admin-2.0.0.war复制到apache-tomcat-8.5.31\webapps\目录下


img_b76a15608ff22f3a1c5ee070fc9f734d.png
图19.png
5). 解压

将dubbo-admin-2.0.0.war解压

img_7428b6f166f2a8359f5c98248e6c6c90.png
图20.png

在WEB-INF/dubbo.properties文件中可以配置ZooKeeper地址,管理员密码

4. 使用Dubbo-admin

1). 开启ZooKeeper
img_61e319ebeea484e8a730a1b5aba7109a.png
图21.png
2). 开启Tomcat
  • 双击startup.bat批处理开发


    img_451b8653bf8453941fa3a6213e1aa964.png
    图22.png
  • 浏览器打开http://localhost:8080/dubbo-admin-2.0.0页面
    img_426a32704f581a794e6ea8236aa2ee8b.png
    图23.png

    用户名和密码默认的均为root,此时登录后数据为空。
    img_54754cb6be96e0b31f3870bb2078c94b.png
    图24.png
3). 在Eclipse中运行Dubbo-provider项目

程序启动后刷新http://localhost:8080/dubbo-admin-2.0.0/governance/providers

img_1ef61d72f846f0b12c8151194d937413.png
图25.png

此时提供者已有数据,再进入消费者页面
img_66f758cc27f22e0b6674a1b547c4becf.png
图26.png

4). 在Eclipse中运行Dubbo-consumer项目

程序启动后,Eclipse控制台打印出数据,刷新http://localhost:8080/dubbo-admin-2.0.0/governance/consumers页面

img_f48d327521fbbb4cb8e81727da3fb31c.png
图27.png

此时消费者页面也有数据了。

代码下载


推荐阅读
  • 一面自我介绍对象相等的判断,equals方法实现。可以简单描述挫折,并说明自己如何克服,最终有哪些收获。职业规划表明自己决心,首先自己不准备继续求学了,必须招工作了。希望去哪 ... [详细]
  • Java开发面试问题,2021网易Java高级面试题及答案,实战案例
    前言大厂面试真题向来都是各大求职者的最佳练兵场,而今天小编带来的便是“HUAWEI”面经!这是一次真实的面试经历,虽然不是我自己亲身经历 ... [详细]
  • 分布式大型互联网企业架构!
    2019独角兽企业重金招聘Python工程师标准摘要:开发工具1.EclipseIDE:采用Maven项目管理,模块化。2.代码生成: ... [详细]
  • 阿里首席架构师科普RPC框架
    RPC概念及分类RPC全称为RemoteProcedureCall,翻译过来为“远程过程调用”。目前,主流的平台中都支持各种远程调用技术,以满足分布式系统架构中不同的系统之间的远程 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 单点登录原理及实现方案详解
    本文详细介绍了单点登录的原理及实现方案,其中包括共享Session的方式,以及基于Redis的Session共享方案。同时,还分享了作者在应用环境中所遇到的问题和经验,希望对读者有所帮助。 ... [详细]
  • 一次上线事故,30岁+的程序员踩坑经验之谈
    本文主要介绍了一位30岁+的程序员在一次上线事故中踩坑的经验之谈。文章提到了在双十一活动期间,作为一个在线医疗项目,他们进行了优惠折扣活动的升级改造。然而,在上线前的最后一天,由于大量数据请求,导致部分接口出现问题。作者通过部署两台opentsdb来解决问题,但读数据的opentsdb仍然经常假死。作者只能查询最近24小时的数据。这次事故给他带来了很多教训和经验。 ... [详细]
  • 基于分布式锁的防止重复请求解决方案
    一、前言关于重复请求,指的是我们服务端接收到很短的时间内的多个相同内容的重复请求。而这样的重复请求如果是幂等的(每次请求的结果都相同,如查 ... [详细]
  • 玩转直播系列之消息模块演进(3)
    一、背景即时消息(IM)系统是直播系统重要的组成部分,一个稳定的,有容错的,灵活的,支持高并发的消息模块是影响直播系统用户体验的重要因素。IM长连接服务在直播系统有发挥着举足轻重的 ... [详细]
  • ZooKeeper 学习
    前言相信大家对ZooKeeper应该不算陌生。但是你真的了解ZooKeeper是个什么东西吗?如果别人面试官让你给他讲讲ZooKeeper是个什么东西, ... [详细]
  • java布尔字段用is前缀_POJO类中布尔类型的变量都不要加is前缀详解
    前言对应阿里巴巴开发手册第一章的命名风格的第八条。【强制】POJO类中布尔类型的变量都不要加is前缀,否则部分框架解析会引起序列化错误。反例:定义为基本 ... [详细]
  • 腾讯T3大牛亲自教你!2021大厂Android面试经验,经典好文
    本篇将由环境搭建、实现原理、编程开发、插件开发、编译运行、性能稳定、发展未来等七个方面,对当前的ReactNative和Flutter进行全面的分析对比, ... [详细]
  • SOA架构理解理解SOA架构,了解ESB概念,明白SOA与微服务的区别和联系,了解SOA与热门技术的结合与应用。1、面向服务的架构SOASOA(ServiceOrien ... [详细]
  • Java开发实战讲解!字节跳动三场技术面+HR面
    二、回顾整理阿里面试题基本就这样了,还有一些零星的问题想不起来了,答案也整理出来了。自我介绍JVM如何加载一个类的过程,双亲委派模型中有 ... [详细]
  • 包含utf8字符的 pickle  转 json的大坑处理过程
    背景:希望将pickle转换为json,由于pickle里有utf8的字符,因此转换失败。转换代码如下:Convertap ... [详细]
author-avatar
梦之舞的微薄极_922
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有