基本常识、概念

数据对象在网络上传输,

需要序列化,需要实现 java. io.Serializable 接口。

PV操作

wait(s) 等价与P操作, signal(s)等价于V操作

  1. procuder
    1. semaphore mutex = 1, empty = n, full = 0;
    2. wait(empty);//表示空缓冲区-1
    3. wait(mutex);//数据缓冲区互斥访问,关闭访问
    4. signal(mutex);//打开访问
    5. signal(full);//满缓冲区加+1
  2. consumer

    1. wait(full);//判断是否有满缓冲区,满缓冲区-1
    2. wait(mutex);
    3. signal(mutex);
    4. siganl(empty);//空缓冲区+1

      线程的实现可以分两类:用户级线程,内核级线程。

  3. 用户级线程是指不需要内核支持而在用户程序中实现的线程,它的内核的切换是由用户态程序自己控制内核的切换,不需要内核的干涉。

    1. 优点:
      1. 线程的调度不需要内核直接参与,控制简单。
      2. 可以在不支持线程的操作系统中实现。
      3. 同一进程中只能同时有一个线程在运行,如果有一个线程使用了系统调用而阻塞,那么整个进程都会被挂起,可以节约更多的系统资源。
    2. 缺点:
      1. 一个用户级线程的阻塞将会引起整个进程的阻塞
      2. 用户级线程不能利用系统的多重处理,仅有一个用户级线程可以被执行。

  4. 内核级线程:切换由内核控制,当线程进行切换的时候,由用户态转化为内核态。切换完毕要从内核态返回用户态。可以很好的运用多核CPU,就像Windows电脑的四核八线程,双核四线程一样。
    1. 优点:
      1. 当有多个处理机时,一个进程的多个线程可以同时执行。
      2. 由于内核级线程只有很小的数据结构和堆栈,切换速度快,当然它本身也可以用多线程技术实现,提高系统的运行速率。
    2. 缺点:
      1. 线程在用户态的运行,而线程的调度和管理在内核实现,在控制权从一个线程传送到另一个线程需要用户态到内核态再到用户态的模式切换,比较占用系统资源。(就是必须要受到内核的监控)
  5. 关联性

    1. 它们之间的差别在于性能。
    2. 内核支持线程是OS内核可感知的,而用户级线程是OS内核不可感知的。
    3. 用户级线程的创建、撤消和调度不需要OS内核的支持。
    4. 用户级线程执行系统调用指令时将导致其所属进程被中断,而内核支持线程执行系统调用指令时,只导致该线程被中断。
    5. 在只有用户级线程的系统内,CPU调度还是以进程为单位,处于运行状态的进程中的多个线程,由用户程序控制线程的轮换运行;在有内核支持线程的系统内,CPU调度则以线程为单位,由OS的线程调度程序负责线程的调度。
    6. 用户级线程的程序实体是运行在用户态下的程序,而内核支持线程的程序实体则是可以运行在任何状态下的程序。

      IPC(Inter-Process Communication,进程间通信)

  6. IPC,至少两个进程或线程间传送数据或信号的一些技术或方法。

    1. 进程是计算机系统分配资源的最小单位。每个进程都有自己的一部分独立的系统资源,彼此是隔离的。
    2. 为了能使不同的进程互相访问资源并进行协调工作,才有了进程间通信。
    3. 这些进程可以运行在同一计算机上或网络连接的不同计算机上。
    4. 进程间通信技术包括消息传递、同步、共享内存和远程过程调用。
    5. IPC是一种标准的Unix通信机制。
  7. 两种类型

    1. 本地过程调用(LPC)LPC用在多任务操作系统中,使得同时运行的任务能互相会话。这些任务共享内存空间使任务同步和互相发送信息。
    2. 远程过程调用(RPC)RPC类似于LPC,只是在网上工作。RPC开始是出现在Sun微系统公司和HP公司的运行UNIX操作系统的计算机中。

      RPC(Remote Procedure Call,远程过程调用协议)

  8. 背景

    • RPC的核心并不在于使用什么协议。
    • RPC的目的是让你在本地调用远程的方法,而对你来说这个调用是透明的,你并不知道这个调用的方法是部署哪里。
    • 通过RPC能解耦服务,这才是使用RPC的真正目的。
    • RPC的原理主要用到了动态代理模式,至于http协议,只是传输协议而已。
    • 简单的实现可以参考spring remoting,复杂的实现可以参考dubbo。
  9. 简介:
    • 一种通过网络从远程计算机上请求服务,而不需要了解底层网络技术的协议。
    • RPC它假定某些协议的存在,例如TPC/UDP等,为通信程序之间携带信息数据。
    • 在OSI网络七层模型中,RPC跨越了传输层和应用层,RPC使得开发,包括网络分布式多程序在内的应用程序更加容易。
    • 过程就是业务处理、计算任务,更直白的说,就是程序,就是想调用本地方法一样调用远程的过程
    • 远程调用,就好像异地恋一样
    • 本地调用,就是女生就在你身边
    • 响应要慢几个数量级
  10. RPC模式
    基本概念(待整理) - 图2
    • RPC采用客户端/服务端的模式,通过request-response消息模式实现
  11. RPC的三个过程
    1. 通讯协议 比如:你需要找人在国外干活,那么你可以直接飞过去或者打电话或者通过互联网的形式,去找人,这个找人的过程就是通讯协议
    2. 寻址 既然要找人干活,肯定要知道地址在哪,飞过去需要找到详细地址,打电话需要知道电话号码,互联网需要知道IP是多少
    3. 数据序列化 就是说,语言需要互通,才能够让别人干活,之间需要一个大家都懂的语言去交流
  12. RPC核心概念术语
    1. client, 客户端
    2. server,服务端
    3. calls,请求
    4. replier,响应
    5. services,一个网络服务由一个或者多个远程程序集构成
    6. programs,一个远程程序实现一个或多个远程过程
    7. procedures,过程、过程的参数、结果在程序协议说明书中定义说明
    8. version,为兼容程序协议变更,一个服务端可能支持多个版本的远程程序
  13. RPC的流程 基本概念(待整理) - 图3
    • sub(存根) :分布式计算中的存根是一段代码,它转换在远程过程调用(RPC)期间client和server之间传递的参数
    1. 客户端处理过程中调用client sub,就像调用本地方法一样,传入参数
    2. client sub将参数编组为消息,然后通过系统调用向服务端发送消息
    3. 客户端本地的操作系统将消息从客户端发送到服务端
    4. 服务端将接收到的数据包传递给server sub
    5. server sub将接收到的数据解组为参数
    6. server sub再调用服务端的过程,过程执行的结果以反方向的相同步骤响应给客户端
    7. 客户端获取响应结果
    • 对于客户端来说,步骤2-6是完全透明的
  14. 需要处理的问题:
    1. client sub、server sub的开发
    2. 参数的编组和解组
    3. 消息如何发送
    4. 过程结果如何表示、异常情况如何处理
    5. 如何实现安全的访问控制
  15. RPC
    • 一种技术的思想,而不是规范
    • RPC调用过程中需要将消息进行编组然后发送,接收方需要解组消息为参数,过程处理结果也需要经过编组、解组;
    • 消息由哪些部分构成以及消息的表示形式就构成了消息协议。
    • RPC协议规定请求消息、响应消息的格式,在TCP之上我们可以选用或者自定义消息协议来实现RPC的交互
  16. 序列化

基本概念(待整理) - 图4

  • 传输方式和序列化会直接影响RPC的性能
  1. 通信

基本概念(待整理) - 图5

  • RPC的通信与具体的协议无关,RPC可基于HTTP或者TCP协议
  1. 服务暴露
  • 远程提供者需要以某种形式提供服务调用相关的信息,
  • 包括但不限于服务接口定义、数据结构或者中间态的服务定义文件,web service的WSDL文件;
  • 服务调用者需要通过一定的途径获取远程服务调用相关的信息

基本概念(待整理) - 图6

  1. 远程代理对象
    • 服务调用者使用的服务实际上是远程服务的本地代理,
    • 说白了就是通过动态代理实现
    • java中至少提供了两种动态代码的生成,一种是jdk动态代理,一种是字节码生成:
    • 动态代理比字节码生成使用起来更加方便,但是性能上没有字节码生成好,字节码生成在代码可读性上要差一些
  2. 为什么要使用RPC
    1. 服务化/微服务
    2. 分布式系统架构
    3. 服务可重用
    4. 系统间交互调用
  3. RPC使用场景

基本概念(待整理) - 图7

  • 和MQ做对比: MQ有一个中间节点queue,可以存储消息
  • RPC的特性: 同步调用,对于需要等待返回结果的场景,可以使用RPC
  • 消息MQ的特性: 异步单向的消息,不需要等待消息处理完成
  • 如果需要同步得到结果的场景,RPC比较适合,如果希望使用简单,RPC也适合,RPC操作基于接口,操作简单,使用的方式模拟本地方法的调用,异步的方式编程比较复杂
  1. RPC和其他协议的区别
    1. RMI远程方法调用是RPC的一种具体实现,
    2. webservice、restfull都是RPC,只是消息的组织形式、消息协议不同
  2. RPC框架

    • 封装好了参数编组、消息解组、底层网络通信的RPC程序开发框架
    • 可以直接在此基础上编写,只关注过程代码
    • java领域中常用的RPC框架有:
      • 传统的webservice框架:apache CXF、apache Axis2
      • 新兴的微服务框架:Dubbo、springcloud、apache Thrift、ICE、GRPC等

        RMI(Remote Method Invocation)远程方法调用

  3. 简介:能够让在某个java虚拟机上的对象像调用本地对象一样调用另一个java 虚拟机中的对象上的方法。

基本概念(待整理) - 图8

  1. RMI远程调用步骤:

    1. 客户对象调用客户端辅助对象上的方法
    2. 客户端辅助对象打包调用信息(变量,方法名),通过网络发送给服务端辅助对象
    3. 服务端辅助对象将客户端辅助对象发送来的信息解包,找出真正被调用的方法以及该方法所在对象
    4. 调用真正服务对象上的真正方法,并将结果返回给服务端辅助对象
    5. 服务端辅助对象将结果打包,发送给客户端辅助对象
    6. 客户端辅助对象将返回值解包,返回给客户对象
    7. 客户对象获得返回值

      WebService中的WSDL(Web Services Description Language,Web服务描述语言)

      ORM思想

  2. 简介

    • 对象关系映射(Object Relational Mapping)
  3. 使用
    • 通过 Java 语言连接并操作数据库的技术或方式已经有很多了,例如:JDBC, Hibernate,MyBatis,TopLink 等等。
    • 其中 JDBC 是 Java 原生的 API,支持连接并操作各种关系型数据库。
    • 相信每个程序员都是从 JDBC 开始学起的,然后才接触到各种持久层框架。
  4. JDBC
    • JDBC 作为 Java 原生 API,有优点,也有缺点,这里主要说一下缺点:
      1. 编码繁琐,效率低
      2. 数据库连接的创建和释放比较重复,也造成了系统资源的浪费
      3. 大量硬编码,缺乏灵活性,不利于后期维护
      4. 参数的赋值和数据的封装全是手动进行
    • 正是因为 JDBC 存在着各种问题,所以才导致很多持久层框架应运而生
    • Hibernate 和 MyBatis,这两个都是目前比较流行的持久层框架,都对 JDBC 进行了更高级的封装和优化,相信大家对这两个框架都比较熟悉。
  5. 对 JDBC 进行封装和优化,设计并编写过一些 API,两类

    1. 着重对 JDBC 进行 API 层的抽取和封装,以及功能的增强,典型代表是 Apache 的DbUtils。
      • 程序员在使用 DbUtils 时仍然需要编写sql 语句并手动进行数据封装,但是 API 的使用比JDBC ``` @Test public void testQuery(){ //创建 queryRunner 对象,用来操作 sql 语句 QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());

    //编写 sql 语句 String sql = “select * from user”;

    //执行 sql 语句 try { List list = qr.query(sql, new BeanListHandler(User.class)); System.out.println(list); } catch (SQLException e) { e.printStackTrace(); } } ```

    1. 借鉴面向对象的思想,让程序员以操作对象的方式操作数据库,无需编写 sql 语句, 典型代表是 ORM。
      基本概念(待整理) - 图9
      • ORM(Object Relational Mapping)吸收了面向对象的思想,把对 sql 的操作转换为对象的操作,从而让程序员使用起来更加方便和易于接受。这种转换是通过对象和表之间的元数据映射实现的,这是实现 ORM 的关键
      • 由于类和表之间以及属性和字段之间建立起了映射关系,所以,通过 sql 对表的操作就可以转换为对象的操作,程序员从此无需编写 sql 语句,由框架根据映射关系自动生成,这就是 ORM 思想。
      • 目前比较流行的 Hibernate 和 MyBatis 都采用了 ORM 思想,一般我们把 Hibernate 称之为全自动的 ORM 框架,把 MyBatis 称之为半自动的 ORM 框架。使用过这两个框架的程序员, 对于 ORM 一定不会陌生。同时,ORM 也是 JPA(SUN 推出的持久层规范)的核心内容
        基本概念(待整理) - 图10
  6. ORM 的经典应用:Hibernate
  7. ORM 的经典应用:MyBatis

面向服务架构(SOA,Service Oriented Architecture)

是一种思想,一种方法论,一种分布式的服务架构

用途

SOA解决多服务凌乱问题,SOA架构解决数据服务的复杂程度,同时SOA又有一个名字,叫做服务治理。

SOA示例

当我们的项目比较小时,我们只有一个系统,并且把他们写到一起,放在一个服务器上,
但是随着平台越来越大,数据量越来越大,我们不得不通过分库,把多个模块的数据库分别放在对应得服务器上,每个模块调用自己的子系统即可。

随着我们系统的进一步复杂度的提示,我们不得不进一步对系统的性能进行提升,我们将多个模块分成多个子系统,
多个子系统直接互相调用(因为SOA一般用于大型项目,比较复杂,所以一般总系统不会再集成,会拆分多个,分别做成服务,相互调用)。
当我们的电商UI进行一个下订单的任务时,多个服务直接互相调用,系统通过数据总线,分别调用对于的子系统即可。
● 企业数据总线:企业数据总线不是对多个子模块的集成,他在这里充当数据通道的作用,
● 数据总线不关心业务,数据总线根据给的地址和协议去调服务,
● 上端不关心服务在哪里是什么,只找数据总线。
我们不得不对系统进行调整,分别是对数据和业务的拆分,最后每个子系统对面提供服务。
IP库以及几个子系统是公共服务,分别向上提供功能,也是SOA方法论的一部分。

使用场景

  1. 多个子系统直接相互交互,相互调用非常凌乱,这样我们就很不爽,所以我们就用到了我们的SOA架构,SOA又叫服务治理,SOA就是帮助我们把服务之间调用的乱七八糟的关系给治理起来,然后提供一个统一的标准,把我们的服务治理成下图所示,以前我们的服务是互相交互,现在是只对数据总线进行交互,这样系统就变得统一起来。
  2. 统一标准:各系统的协议、地址、交互方式。
  3. 新的交互方式:各个系统分别根据统一标准向数据总线进行注册,各子系统调用其他子系统时,我们并不关心如果找到其他子系统,我们只找数据总线,数据总线再根据统一标准找其他子系统,所以数据总线在这里充当一个只路人的作用。
  4. aa

e. SOA优缺
优点
1. 降低用户成本,用户不需要关心各服务之间是什么语言的、不需要知道如果调用他们,只要通过统一标准找数据总线就可以了。
2. 程序之间关系服务简单
3. 识别哪些程序有问题(挂掉)
缺点:提示了系统的复杂程度,性能有相应影响。
f. 数据总线是什么?(注册中心????)

  1. 数据总线是起到调度服务的作用,数据总线不是集成服务,数据总线更像一个调度框架,每个服务需要根据约定向数据总线注册服务,那么如何注册那?其实数据总线就像一个字典结构,
  2. 数据总线里面一个key对于一个valuekey指的是服务名,value则是服务的调度方式,还有一点需要说明的是,数据总线只是指路人,服务是不经过数据总线的,如上图的黄色线的路径。
  3. 数据总线通过域名解析实现:一个域名绑定多台服务器,ajax也可以,dns也可以,解析域名嘛。
  4. 其实数据总线还有一些高级应用,比如心跳检测,实现负载均衡等等,就不细说了,目前应用数据总线的有阿里的dubbo,还有zookeeper

g. aaa

JMS(Java Message Service,Java消息服务应用程序接口)

是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行通信。
Java消息服务是一个与具体平台无关的API,绝大多数MOM提供商都对JMS提供支持

分布式基础理论

什么是分布式系统?

  • 《分布式系统原理与范型》定义:“分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像单个相关系统”
  • 分布式系统(distributed system)是建立在网络之上的软件系统。
  • 随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进。

    发展演变
    基本概念(待整理) - 图11

  1. 单一应用架构
    基本概念(待整理) - 图12
    • 当网站流量很小时,将所有功能都部署在一起,以减少部署节点和成本。此时,用于简化增删改查工作量的数据访问框架(ORM)是关键
    • 适用于小型网站,小型管理系统,将所有功能都部署到一个功能里,简单易用。
    • 缺点:
      1. 性能扩展比较难
      2. 协同开发问题
      3. 不利于升级维护
  2. 垂直应用架构
    基本概念(待整理) - 图13
    • 当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,将应用拆成互不相干的几个应用,以提升效率。此时,用于加速前端页面开发的Web框架(MVC)是关键。
    • 通过切分业务来实现各个模块独立部署,降低了维护和部署的难度,团队各司其职更易管理,性能扩展也更方便,更有针对性。
    • 缺点: 公用模块无法重复利用,开发性的浪费
  3. 分布式服务架构
    基本概念(待整理) - 图14
    • 当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。此时,用于提高业务复用及整合的分布式服务框架(RPC)是关键。
  4. 流动计算架构
    • 当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率。此时,用于提高机器利用率的资源调度和治理中心SOA是关键。

      POJO、JavaBean、DAO、PO、DTO、VO、BO

      POJO

      全称为:Plain Ordinary Java Object,即简单普通的java对象。
      是普通java类,有一些private的参数作为对象的属性,然后针对每一个参数定义get和set方法访问的接口。

      JavaBean

      是一种JAVA语言写成的可重用组件。它的方法命名,构造及行为必须符合特定的约定:
      1.这个类必须有一个公共的缺省构造函数。
      2.这个类的属性使用getter和setter来访问,其他方法遵从标准命名规范。
      3.这个类应是可序列化的。

POJO跟JavaBean的定义怎么就这么像?两者有什么区别?


POJO其实是比javabean更纯净的简单类或接口。POJO严格地遵守简单对象的概念,而一些JavaBean中往往会封装一些简单逻辑。
简而言之,当一个POJO可序列化,有一个无参的构造函数,使用getter和setter方法来访问属性时,它就是一个JavaBean。

DAO

全称为:Data Access Object,即数据访问对象。就是一般所说的DAO层,DAO是数据访问对象,DAO一般有接口和该接口的实现类(例如Mybatis-Mapper),接口用于规范实现类。实现类一般用于操作数据库,如对数据库进行修改、添加、删除等操作,一般直接调用公共类DAO。

PO

全称为:Persistant Object,即持久化对象。可以理解为数据库中的一条数据即一个BO对象,也可以理解为POJO经过持久化后的对象。

DTO

全称为:Data Transfer Object,即数据传输对象。一般用于向数据层外围提供仅需的数据,如查询一个表有50个字段,界面或服务只需要用到其中的某些字段,DTO就包装出去的对象。可用于隐藏数据层字段定义,也可以提高系统性能,减少不必要字段的传输损耗。

VO

全称为:Value Object,有的也称为View Object,即值对象或页面对象。一般用于web层向view层封装并提供需要展现的数据。

关系

我们通过DAO将POJO持久化为PO,用PO组装出来VO、DTO

BO

全称为:Business Object,即业务对象。一般用在业务层,当业务比较复杂,用到比较多的业务对象时,可用BO类组合封装所有的对象一并传递。