SherryLang / javalearning

while(Java){ learn !! }
3 stars 1 forks source link

Java工程和框架理念:io/nio,mq,cache,orm,jpa,webservice,wsdl,restful,cxf #6

Open SherryLang opened 7 years ago

SherryLang commented 7 years ago

1. io

io包括bio、nio和aio,bio为阻塞式(blocked)io;nio为非阻塞式(nonblocked);aio为异步(asychronous)io。 比如两台PC机都需要使用打印机(资源),bio是指小明先使用了打印机,小红要在边上等着小明用完打印机才能继续使用打印机。 nio是指小明在用打印机的时候小红可以干点别的事情,等小明用完打印机了再来打印,此时资源依然是阻塞式(单线程),但是请求方的io句柄可以释放,并且在内部的io buffer中映射,由于io句柄是有限的,nio的方式能够扩大并发。nio实际用得最多,netty和mina都是其具体实现的框架。 aio用的不多,小明使用完打印机后,打印机边上的MM会发消息通知小红可以用打印机了,此时小红再来打印。当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。 具体的理解一下,cmd在终端输入netstat,看看与IP、TCP、UDP和ICMP协议相关的统计数据。 io机制中有分包、粘包的过程。

2. mq消息队列

消息包括topic和queue,topic类似小广告,1对0~N,可以送给nobody,也可以广而告之;而queue类似快递,1对1,如果没有送到,这个快递也一直会在等待接收的状态。 mq屏蔽了消息的生产者和消费者,消费者需要主动订阅(subscribe)某个消息,生产者生产出来后会通知mq去分发消息给订阅者,但是生产者是不知道订阅者是谁的。 生产者和消费者都是在特定场景下界定的,不是固定的角色。

3. cache

和物理内存缓存不一样,这是程序内部的调度机制。之前提到的io buffer也是其中的一块。 为了提高访问速度而设立,一般是数据库中部分聚合数据会放到cache中供程序频繁访问。

4.ORM(Object Relation Mapping)对象关系映射

orm是基于JDBC的封装和技术实现,Hibernate就是最典型的一个,另外还有eclipselink、openJPA等。 2大特点:

  1. 通过xml文件,执行对象到表的映射,以及实例到数据的映射,映射需遵循JPA规范;
  2. 屏蔽不同数据库(mysql、sqlserver、oracle等)之间的差异。

ORM可以理解成一种规范,它概述了这类框架的基本特征:完成面向对象的编程语言到关系数据库的映射。 ORM框架提供了面向对象语言设计与关系数据库发展不同步的中间解决方案。

5. WebService & RESTful

WebService的含义

WebService是一种跨语言协议,不止用于前后端通信,也可以用于客户端和服务端通信等。XML+XSD、SOAP和WSDL就是构成WebService平台的三大技术。

  1. XML是编解码数据的协议,数据格式层面。

    XML是WebService平台中表示数据的格式。除了易于建立和易于分析外,XML主要的优点在于它既是平台无关的,又是厂商无关的。XML Schema(XSD)用于定义扩展这套数据类型,当你用某种语言(如VB.NET或C#)来构造一个Web service时,为了符合WebService标准,所有你使用的数据类型都必须被转换为XSD类型。

  2. SOAP是基于HTTP的数据通信协议

    WebService通过HTTP协议发送请求和接收结果时,发送的请求内容和结果内容都采用XML格式封装,并增加了一些特定的HTTP消息头,以说明HTTP消息的内容格式,这些特定的HTTP消息头和XML内容格式就是SOAP协议。 SOAP协议 = HTTP协议 + XML数据格式

  3. WSDL:WebService Description Language(发布标准中间协议)

    WebService客户端要调用一个WebService服务,首先要有知道这个服务的地址在哪,以及这个服务里有什么方法可以调用,所以,WebService务器端首先要通过一个WSDL文件来说明自己家里有啥服务可以对外调用,服务是什么(服务中有哪些方法,方法接受的参数是什么,返回值是什么),服务的网络地址用哪个url地址表示,服务通过什么方式来调用。 WSDL示例

实操层面:Webservice工作原理及实例

WebService特性:

  1. 由于XML文件本身标签多,解析慢,适用于小数据量,如果数据量太大则容易丢包导致传输失败;
  2. wsdl是强文件,必须有这个文件并且不出错。

RESTful架构,比WebService晚多了

参考:#3 前后端交互和RESTful风格 RESTful的优点:轻量、兼容性和扩展性好 简单来说就是http协议+json数据,json也是所有语言都能解析的。

CXF

对WebService和RESTful都进行了封装,既可作服务端,又可作客户端

RPC框架:Remote Procedure Call Protocol

这是一个设计理念,是符合一系列特性事务的集合。

RPC是指远程过程调用,也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。

6. IOC/DI

IOC:Inversion of Control(控制反转)和DI:Dependency Injection(依赖注入)

这两者是同一个概念不同角度的描述,IOC是一种思想,就是把实例的生命周期交给spring(实现了IOC)去管理。在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。 noioc 木有IOC的传统管理 模式: 应用程序主动控制 withioc 有了IOC容器后,客户端类不再主动创建这些对象了。

IoC(Inversion of Control,控制反转)。这是spring的核心,贯穿始终。所谓IoC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系

Spring所倡导的开发方式就是如此,所有的类都会在spring容器中登记,告诉spring你是个什么东西,你需要什么东西,然后spring会在系统运行到适当的时候,把你要的东西主动给你,同时也把你交给其他需要你的东西。所有的类的创建、销毁都由 spring来控制,也就是说控制对象生存周期的不再是引用它的对象,而是spring。对于某个具体的对象而言,以前是它控制其他对象,现在是所有对象都被spring控制,所以这叫控制反转。

IOC的优势:传统应用程序都是由我们在类内部主动创建依赖对象,从而导致类与类之间高耦合,难于测试;有了IoC容器后,把创建和查找依赖对象的控制权交给了容器,由容器进行注入组合对象,所以对象与对象之间是 松散耦合,这样也方便测试,利于功能复用,更重要的是使得程序的整个体系结构变得非常灵活。

DI—Dependency Injection,即“依赖注入”,从运用的角度来描述IoC。其含义是:

组件之间依赖关系由容器在运行期决定。`即由容器动态的将某个依赖关系注入到组件之中。

依赖注入的目的并非为软件系统带来更多功能,而是为了提升组件重用的频率,并为系统搭建一个灵活、可扩展的平台。通过依赖注入机制,我们只需要通过简单的配置,而无需任何代码就可指定目标需要的资源,完成自身的业务逻辑,而不需要关心具体的资源来自何处,由谁实现。

理解DI的关键是:“谁依赖谁,为什么需要依赖,谁注入谁,注入了什么”,那我们来深入分析一下:

参考:IOC的理解

7.AOP:Aspect Oriented Programming(面向切面编程)

AOP是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果。

通过正则匹配方法名称,在某(些)个已有方法前后都可以统一加入新的处理方法,前面一个切面,后面一个切面,一层还能再套一层。

应用

打日志、设权限、异常处理、扩展方法、重构等。

作用

减少个人代码量,统一管理方法,便于工程化开发和使用。

AOP的代码实现小demo以及与继承的对比