Java进阶之分布式学习指南

Wesley13
• 阅读 620

作者:盲目的拾荒者

博客:https://blog.csdn.net/niugang0920

网络通信

协议

  • TCP/IP

扩展: 由网络层的IP协议和传输层的TCP协议组成,TCP负责发现传输的问题,一有问题就发出信号,要求重新传输,直到所有数据安全正确地传输到目的地。而IP是给因特网的每一台联网设备规定一个地址。

  • UDP/IP

  • Multicast

IO

  • BIO

  • NIO

  • AIO

基于消息方式的系统间通信

a.当系统之间要通信时,就向外发送消息,消息可以使字节流、字节数组,甚至是java对象,其他系统收到消息后则进行相应的业务处理。消息方式的通信,通常是基于网络协议来实现的,常用的系统间通信的协议有:TCP/IP和UDP/IP

b.TCP/IP 是一种可靠的网络数据传输的协议。TCP/IP要求通信双方首先建立连接,之后再进行数据的传输TCP/IP负责保证数据传输的可靠性,包括数据的可到达、数据到达的顺序等。但由于TCP/IP需要保证连接及数据传输的可靠,因此可能会牺牲一些性能。

c.UDP/IP是一种不保证数据一定到达的网络数据传输协议。UDP/IP并不直接给通信双方建立连接,而是发送发到网络上进行传递。由于UDP/IP不建立连接,并且不能保证数据传输的可靠,因此性能上表现相对较好,但是可能会出现数据丢失以及数据乱序的现象。

d.TCP/IP和UDP/IP可用于完成数据的传输,但是要完成系统间通信,还需要对数据进行处理。列如读取和写入数据,按照标准分为同步IO和异步IO两种。其中同步IO中最常用的是BIO(Blocking IO)和NIO(Non-Blocking IO)

e.从程序角度而言,BIO就是当发起IO的读取或写操作时,均为阻塞方式,只有当程序读到了流或将流写入操作系统后才释放资源。 f.NIO是基于事件驱动思想的,实现上通常采用Reactor模式,从程序角度而言,当发起IO的读或写操作时,是非租塞的。

基于java包

  • TCP/IP

(BIO)Socket ServerSocket 一连接一线程.一个socket需要一个线程处理。建立连接、读数据,写数据的操作都可能阻塞。 为了支持并发连接需要线程池

(NIO)SocketChannel ServerSocketChannel 服务端一个线程监听连接的事件,一个或多个线程来监听网络读写事件。当有实际的网络流读写事件发生后,再放入线程池中处理。一请求一线程.NIO的明显好处就是不需要为每一个socket分配一个线程,而可以在一个线程中处理多个scoket。

  • UDP/IP

  • Multicast

组播(Multicast)传输:在发送者和每一接收者之间实现点对多点网络连接。如果一台发送者同时给多个的接收者传输相同的数据,也只需复制一份的相同数据包。它提高了数据传送效率。减少了骨干网络出现拥塞的可能性。

开源框架

  • Netty

  • Mina(apache,基于java NIO,对外屏蔽了JavaNIO的复杂性)

性能角度

连接管理

连接池 连接复用 短连接、长连接

基于远程调用方式的系统间通信

远程调用方式应该可能的是系统间的通信和系统内部一样,让使用者感觉调用远程同调用本地一样,但其实并没有办法做到完全透明。由于远程调用带来的网络问题、超时问题,序列化反序列化问题、复杂调试问

基于java包

  • RMI(Remote Method Invocation)

原理:client----[proxy]----->封装对象、序列化为流<----[TCP/IP BIO]---->反序列化、调用----->反射调用实例对象

  • webservice

开源框架

  • Spring RMI(简单就实现RMI方式的java远程调用)

  • Apache CXF

性能角度

  • 反射

  • 序列化、反序列化

消息通信

  • rabbitmq

  • kafka

大型分布式应用架构基础

单体架构

在java领域可以理解为一个javaweb应用。

分布式架构

什么是传统的分布式架构?简单来说,按照业务垂直切分,每个应用都是单体架构,通过API相互调用。

面向服务的SOA架构

  • 背景:

在构建了共用业务逻辑系统和拆分系统后,最明显的问题就是系统之间如何交互。如果不控制会出现系统之间存在多种交互方式:http、TCP/IP+NIO、Hessian、RMI、WebService等;同步异步都可能出现,这会导致开发人员每访问一个共用业务逻辑系统或拆分出来的系统,都有可能需要学习不同交互方式;同时也会造成各开发团队重复造轮子,提供不同交互方式用的框架,这对于应用的性能 可用性而言带来了极大的挑战。

  • 关于SOA

面向服务的家否是一种软件体系结构,其应用程序的不同组件通过网络上的协议向其他提供服务和消费服务。简单来说,soa是不同业务建立不同的服务,服务之间的数据交互可以通过服务接口分级,这样松散耦合提高服务的可重用 性,也让业务逻辑变得可组合,并且每个服务根据适应情况作出合理的分布式部署,从而让服务变得规范、高性能、高可用。soa架构中两个主要角色:服务提供者(provider)和服务消费者(consumer).阿里开源的Dubbo是soa的典型实现。

微服务架构

将单一程序开发成一个微服务,每个微服务运行在自己的进程中,并使用轻量级机制通信,通常采用HTTP RestFul API.这些服务围绕业务能力来划分构建的,并通过全完自动化部署机制来独立部署。这些服务可以使用不同的编程需要,以及不同数据存储技术,以保证最低限度的集中式管理。

SOA和微服务架构的区别

SOA往往与企业服务总线(ESB)联系在一起,主要原因在于SOA的实施思路是根据ESB模式来整合集成大量单一庞大的系统,这是soa主要的落地方式。微服务相对于和ESB联系在一起的SOA显示轻便敏捷得多,微服务将复杂的业务组件化,实际也是一种面向服务思想的体现。对于微服务来说,它是SOA的一种体现,但是它比ESB实现的SOA更加轻便、敏捷和简单。

Docker虚拟容器化技术

高性能反向代理服务器Ngnix

分布式服务治理

  • Dubbo

  • 分布式协调技术Zookeeper

持久化存储技术

mysql

  • 业务拆分

  • 表拆分

拆分策略 水平/垂直拆分

  • mycat的使用

  • 读写分离

nosql

  • redis 安装集群、数据类型深入分析、哨兵机制、java整合redis

  • mongoDB

由于内容话题比较大,不可能面面俱到,只是把要熟悉和掌握的点提到了,大家对号入座就行了,那方面欠缺及时了解和学习。

微信公众号

                           Java进阶之分布式学习指南

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Stella981 Stella981
3年前
Docker 部署SpringBoot项目不香吗?
  公众号改版后文章乱序推荐,希望你可以点击上方“Java进阶架构师”,点击右上角,将我们设为★“星标”!这样才不会错过每日进阶架构文章呀。  !(http://dingyue.ws.126.net/2020/0920/b00fbfc7j00qgy5xy002kd200qo00hsg00it00cj.jpg)  2
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这