长连接方案及相关概念、技术

1. 概念

在探索长连接方案过程中,肯定会遇到很多的技术名词,下面就是一些,需要了解它是什么、什么时候可以用到、怎么使用等等。

1.1. socket

先来个总结:一切进程间通信都是socket通信。socket作为门面,包装了TCP/IP的复杂性。让我们仅仅需要指定服务端的ip、端口、协议要素,就可以实现服务端和client端的通信。
下面的内容,主要摘抄自:https://blog.csdn.net/pashanhu6402/article/details/96428887
socket的java demo代码在8-代码\8.5springboot-socket

说起socket,应该要从TCP/IP协议族开始说起。
TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,是一个工业标准的协议集,它是为广域网(WANs)设计的。
UDP(User Data Protocol,用户数据报协议)是与TCP相对应的协议。它是属于TCP/IP协议族中的一种。
这里有一张图,表明了这些协议的关系。

TCP/IP协议族包括运输层、网络层、链路层。现在你知道TCP/IP与UDP的关系了吧。
Socket在哪里呢?
在图1中,我们没有看到Socket的影子,那么它到底在哪里呢?还是用图来说话,一目了然。

Socket是什么呢?
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。

就目前而言,几乎所有的应用程序都是采用socket,而现在又是网络时代,网络中进程通信是无处不在,这就是我为什么说“一切皆socket”。

socket中TCP的三次握手建立连接详解

  • 客户端向服务器发送一个SYN J
  • 服务器向客户端响应一个SYN K,并对SYN J进行确认ACK J+1
  • 客户端再向服务器发一个确认ACK K+1

1.2. websocket

  • 定义:WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就可以建立持久性的连接,并进行双向数据传输。
  • 注意:WebSocket是H5新推出的协议,一般用于前端,但是在实际项目中可能需要用java代码来获取一些设备的实时运行数据,在后台处理后推送的前台界面,为了保证实时性,我们需要用到WebSocket协议,而刚好有一个叫java-websocket的开源项目,我们可以利用它来实现java版的websocket client。案例代码可以参考:https://www.cnblogs.com/hhhshct/p/9507446.html

学习了解websocket的一些博客

  • WebSocket其实没那么难:https://zhuanlan.zhihu.com/p/74326818
  • WebSocket 是什么原理?为什么可以实现持久连接?https://www.zhihu.com/question/20215561

OK,定义、概念over,开始搞事情~
首先,你需要问一下你自己:

  • 你需要的是web和server和长连接?
  • 还是java client和server的长连接?
  • 你的架构方案里,server是集群吗?
  • 要不要搞个springboot websocket来快速爽一把交差?
  • 移动端app h5、小程序、公众号是否支持websocket协议?

上菜~

  • SpringBoot整合WebSocket实现前后端互推消息 https://www.cnblogs.com/JohanChan/p/12522001.html
    然后,如果你想用在公司项目里,想想,集群下,websocket如何保证多实例websocket session共享?↓

1.2.1. websocket 集群方案

不同于httpsession,websocket session无法序列化到redis。目前没有比较好的集群方案,所以考虑引入mq,使每一个实例都可以收到待发送的消息,再通过springboot websocket,发送给浏览器。https://blog.csdn.net/xiaoxian8023/article/details/48729479

1.3. webservice

1.3.1. 概念

  • WebService是一种跨编程语言和跨操作系统平台的远程调用技术。(Asp.net开发的WebService用java代码调用完全没问题,和操作系统也没有关系。)
  • WebService服务的请求和响应各自表现为一组数据,数据具有某种表示形式(XML)和类型标准(XSD),数据通过某传输协议(HTTP)通过网络进行传输。
  • WSDL(Web Services Description Language)是一个基于XML的语言,用于描述Web Service及其函数、参数和返回值。它是WebService客户端和服务器端都能理解的标准格式。为用户提供详细的接口说明书。

在找资料的过程中,感觉,webservice相关的,都比较老一些,包括示例代码,很多是eclipse…

1.3.2. 首先,还是看各种文档资料,熟悉一下什么是webservice、为什么、怎么做

  • 我的第一次WebService接口开发 https://blog.csdn.net/qq_38584967/article/details/90040429

1.3.3. 然后就是动手搞事(代)情(码)~

  • 看这一篇就够了,有说明有代码,够入门 https://blog.csdn.net/hgx_suiyuesusu/article/details/88918192
  • webservice请求过程中,xml格式的数据可以认为是payload,而soap可以认为是一个信封,把xml数据封装起来,webservice服务端打开信封,取出信件(数据),执行对应的方法,并将结果再放回信封(soap)返回给客户端。
  • 看看概念、做做demo,整体感觉下来,有现成的工具可以生成client代码,调用起来类似RPC,也还不错。就是那个wsdl值得吐槽,虽说是xml格式可以给人看,那是人看的东西?!
  • 有一说一,如果是跨公司系统间服务调用,还是比较OK的。如果是公司内部,springcloud的feign,做的也很不错,虽不是rpc,但实现的效果大体相同~

1.4. RESTful

REST – REpresentational State Transfer URL定位资源,用HTTP动词(GET,POST,DELETE,DETC)描述操作。
直面灵魂的提问:你真的懂restful吗?是代码?是接口?是规范?用在哪儿?为什么要用?

  • REST(英文:Representational State Transfer,简称REST)。在目前主流的三种Web服务交互方案中,REST相比于SOAP(Simple Object Access protocol,简单对象访问协议)以及XML-RPC更加简单明了,无论是对URL的处理还是对Payload的编码,REST都倾向于用更加简单轻量的方法设计和实现。值得注意的是REST并没有一个明确的标准,而更像是一种设计的风格。
  • REST 指的是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是 RESTful。
  • REST本身并没有创造新的技术、组件或服务,而隐藏在RESTful背后的理念就是使用Web的现有特征和能力, 更好地使用现有Web标准中的一些准则和约束。虽然REST本身受Web技术的影响很深, 但是理论上REST架构风格并不是绑定在HTTP上,只不过目前HTTP是唯一与REST相关的实例。 所以我们这里描述的REST也是通过HTTP实现的REST。

1.4.1. 翻翻博客,看看大神们怎么解释

  • 理解RESTful架构 http://www.ruanyifeng.com/blog/2011/09/restful.html
  • RESTful API 设计指南 http://www.ruanyifeng.com/blog/2014/05/restful_api.html
  • 菜鸟教程 - RESTful 架构详解 https://www.runoob.com/w3cnote/restful-architecture.html
  • 知乎:怎样用通俗的语言解释REST,以及RESTful? https://www.zhihu.com/question/28557115
    一定要看哈,不然后面可能会晕车~

1.4.2. RESTful特点包括:

1、每一个URI代表1种资源;
2、客户端使用GET、POST、PUT、DELETE4个表示操作方式的动词对服务端资源进行操作:GET用来获取资源,POST用来新建资源(也可以用于更新资源),PUT用来更新资源,DELETE用来删除资源;
3、通过操作资源的表现形式来操作资源;
4、资源的表现形式是XML或者HTML;
5、客户端与服务端之间的交互在请求之间是无状态的,从客户端到服务端的每个请求都必须包含理解请求所必需的信息。

1.4.3. 再延伸看看RPC概念

使用 RPC 样式架构构建的基于 SOAP 的 Web 服务成为实现 SOA 最常用的方法。RPC 样式的 Web 服务客户端将一个装满数据的信封(包括方法和参数信息)通过 HTTP 发送到服务器。服务器打开信封并使用传入参数执行指定的方法方法的结果打包到一个信封并作为响应发回客户端。客户端收到响应并打开信封。每个对象都有自己独特的方法以及仅公开一个 URI 的 RPC 样式 Web 服务,URI 表示单个端点。它忽略 HTTP 的大部分特性且仅支持 POST 方法。
在 RPC 样式的架构中,关注点在于方法,而在 REST 样式的架构中,关注点在于资源 —— 将使用标准方法检索并操作信息片段(使用表示的形式)。资源表示形式在表示形式中使用超链接互联。


通过上面的一些概念表达,可能还只是一个模糊的概念,能区分RPC和REST:RPC侧重方法,REST侧重资源,通过GET\POST\DELETE\PUT来操作资源。那么,既然RESTful是一种架构约束条件和原则,那有什么比较好的现成方案可供借鉴呢?

  • Springboot官网教程:Building a RESTful Web Service https://spring.io/guides/gs/rest-service/
    这个貌似有点不对题,并不是标准的RESTful接口-_-||
  • (拆台)博客:SpringBoot RESTful API 架构风格实践 https://www.cnblogs.com/fishpro/p/spring-boot-study-restful.html

1.4.4. 拆台RESTful

为什么不推荐使用 RESTful API:
RESTful API 固然很好但大多数互联网公司都没有按照其规则来设计。因为 REST 本来就是一种风格,并没有什么固定的规则来约束,基于过于理想的 RESTful API 只会付出更多的人力成本和时间成本。

  • 操作方式繁琐,没有效率,且意义不大
    使用 HTTP 的 GET\POST\PUT\DELETE 来区分操作资源,HTTP Method 本身就对外部不友好,是隐藏的方法,把动词加入到 url 中,反而清晰可见,简单易懂,为什么一定要用 url 来表示资源而不能加动词呢。
    GET\POST\PUT\DELETE 的兼容性有待认证,首先是兼容老的系统,大部分 HTTP 应用是基于 GET/POST 来实现的。
  • 过分强调单一资源
    这可能是人的理解问题,就看我们对资源的定义,太多的场景,如果使用 Restful API 规则行事,势必要把一个 API 拆分多个 API,框架多个 API 之间的状态又成了问题。ps:抄来的,写作的人真的很不用心,完全不通顺。我理解,是一个资源就1个uri,具体的动作需要依靠GET\POST\DELETE等动作来判断,API不够友好。
  • 返回值问题
    使用 HTTP Status 状态码是没有问题的,但使用不常见的状态码表示操作层面的含义,对开发不是很友好。
    对返回集中定义 status、message 例如下面的 json 返回是很常见的返回,简单易懂。并没有什么不妥,但在 RESTful Api 拥护者眼里就是错误的格式,错误的返回。
{
    "status":1,
    "message":"",
    "data":[]
}
  • 更高的成本
    统一为 RESTful API 风格,强化要求做的完美,比如带来更多的时间成本、人力成本。沟通成本。

怪不得,平时工作中,遇到RESTful的接口很少,真的不好用,研发人员会比较累,遵守规范也不会有什么明显的好处~话说两面,如果遵循了RESTful风格,接口看起来会比较的规范,易于理解(即使在不同的公司,用这种规范来书写代码,可以达到接口自解释)

1.5. mina 长连接

长连接概念不用再多说,全双工通信,server和client可以互发消息。mina可以说更适用于java-java而非web-java的场景,如果是web-java,可以考虑websocket。

  • mina相关的demo,可以参考:https://blog.csdn.net/walle167/article/details/79014387?utm_source=blogxgwz7

1.6. netty

netty入门有些吃力,多了比较多的概念,所以,先从一些博客入手,对其有个大概的认知。
一些比较重要的观点:

  • netty系列博客:https://blog.csdn.net/qq_18603599/category_7748400.html

netty,还是先啃一遍书再说吧,没有底~准备下一篇netty相关文章

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值