1 常用的微服务开发框架:
- Spring Cloud
-
2 Spring Cloud vs Apache Dubbo
Java 微服务框架选型(Dubbo 和 Spring Cloud?)
Spring Cloud组件选型3 微服务相关知识
3.1 IO
5中IO模型对比:
注意:在Java中,主要有三种IO模型,分别是阻塞IO(BIO)、非阻塞IO(NIO)和 异步IO(AIO),但上述三种IO模型是Java中提供的与IO有关的API,并不是操作系统层面的IO模型呢。
Socket是一个抽象概念,一个应用程序通过一个Socket来建立一个远程连接,而Socket内部通过TCP/IP协议把数据传输到网络:
┌───────────┐ ┌───────────┐
│Application│ │Application│
├───────────┤ ├───────────┤
│ Socket │ │ Socket │
├───────────┤ ├───────────┤
│ TCP │ │ TCP │
├───────────┤ ┌──────┐ ┌──────┐ ├───────────┤
│ IP │<────>│Router│<─────>│Router│<────>│ IP │
└───────────┘ └──────┘ └──────┘ └───────────┘
Socket、TCP和部分IP的功能都是由操作系统提供的,不同的编程语言只是提供了对操作系统调用的简单的封装。例如,Java提供的几个Socket相关的类就封装了操作系统提供的接口。
为什么需要Socket进行网络通信?因为仅仅通过IP地址进行通信是不够的,同一台计算机同一时间会运行多个网络应用程序。当操作系统接收到一个数据包的时候,如果只有IP地址,它没法判断应该发给哪个应用程序,所以,操作系统抽象出Socket接口,每个应用程序需要各自对应到不同的Socket,数据包才能根据Socket正确地发到对应的应用程序。
一个Socket就是由IP地址和端口号(范围是0~65535)组成,可以把Socket简单理解为IP地址加端口号。端口号总是由操作系统分配,它是一个0~65535之间的数字,其中,小于1024的端口属于特权端口,需要管理员权限,大于1024的端口可以由任意用户的应用程序打开。
注意:这里的TCP编程使用的是Java的BIO(Blocking IO)模式进行通信,即同步阻塞IO模式。
-
那么Netty到底是何方神圣?
用一句简单的话来说就是:Netty封装了JDK的NIO,让你用得更爽,你不用再写一大堆复杂的代码了。
用官方正式的话来说就是:Netty是一个异步事件驱动的网络应用框架,用于快速开发可维护的高性能服务器和
客户端。
下面是我总结的使用Netty不使用JDK原生NIO的原因:- 使用JDK自带的NIO需要了解太多的概念,编程复杂,一不小心bug横飞。
- Netty底层IO模型随意切换,而这一切只需要做微小的改动,改改参数,Netty可以直接从NIO模型变身为IO模型。
- Netty自带的拆包解包,异常检测等机制让你从NIO的繁重细节中脱离出来,让你只需要关心业务逻辑。
- Netty解决了JDK的很多包括空轮询在内的bug。
- Netty底层对线程,selector做了很多细小的优化,精心设计的reactor线程模型做到非常高效的并发处理。
- 自带各种协议栈让你处理任何一种通用协议都几乎不用亲自动手。
- Netty社区活跃,遇到问题随时邮件列表或者issue。
- Netty已经历各大rpc框架,消息中间件,分布式通信中间件线上的广泛验证,健壮性无比强大。
注意:Netty是使用Java中NIO模式实现的;如果Java开发过程中需要使用Java NIO接口编程建议使用Netty,Netty为我们封装了Java NIO接口使用,Netty更加易用。
注意:这里通信模型的实现可以理解为使用NIO模式实现一个简单的RPC通信协议。
注意:RPC常用的协议有thrift,probuf,avro,这些协议一般都是使用NIO(Non-Blocking IO)模式进行通信,即同步非阻塞IO模式。