Java 网络编程最佳实践(转载)
http://yihongwei.com/2015/09/remoting-practice/
Java 网络编程最佳实践
1. 通信层
- 直接使用最成熟的网络框架,如 Netty
- 单连接 & 连接复用 & 长连接
- 建议提前设计心跳机制
- 集群较小,长连接无需开启心跳
- 如果网络情况比较复杂,建议开启心跳。如有防火墙,会将连接清掉且不会向客户端发送 RST 信令,导致长连接变成一个脏连接
2. 线程模型
如果采用了 Netty 这样的框架,线程模型基本已经决定了,但是 Netty 只需负责 IO 处理,需要提供额外的业务线程池负责处理业务请求。
- 序列化过程在业务线程中处理
- 请求/响应包多个批量从 IO 线程交给业务线程处理
- 服务端线程池需要有保护策略
- 框架层面的 RejectExcetpion
- 业务层面的限流策略
- 需要定时打印线程池大小,方便性能分析
3. 序列化
- 全站都是 Java 系
为了以后能让其它语言更好的交互,协议设计越扁平越好,切忌将整个协议类对象序列化,仅整个序列化方法参数对象列表及返回值对象。
- 全站各种语言百花齐放
可以考虑直接使用 Protobuf 或者 msgpack 这样的跨语言的序列化协议,但我个人没使用经验。
4. 容灾
- 必须要有超时时间,分布式环境下无超时机制对整体环境影响非常大
- 需要有连接隔离机制(根据请求量、错误率等)
- 可参考 Netflix 的 ribbon
5. 故障定位
- 客户端发送、服务端接收均需要打印日志,日志必须要有的几个字段:
- 时间戳
- 唯一ID: 由于客户端和服务端的请求量较大,所以需要有唯一 ID 能够将客户端日志和服务端请求串起来
- IP 信息
- 如下:
- client:time,unique-id,server-ip
- server:time,unique-id,client-ip
- 提供较好的方式打印网络层日志
- 经常会发生客户端有请求日志,但是服务端没有接收日志的情况
- 这个时候无法判断是客户端出错还是服务端出错,可以提供 debug 日志打印网络层的请求日志
Java 网络编程最佳实践(转载)的更多相关文章
- 【转载】Java 网络编程
本文主要是自己在网络编程方面的学习总结,先主要介绍计算机网络方面的相关内容,包括计算机网络基础,OSI参考模型,TCP/IP协议簇,常见的网络协议等等,在此基础上,介绍Java中的网络编程. 一. ...
- java网络编程serversocket
转载:http://www.blogjava.net/landon/archive/2013/07/24/401911.html Java网络编程精解笔记3:ServerSocket详解ServerS ...
- Java - 网络编程完全总结
本文主要是自己在网络编程方面的学习总结,先主要介绍计算机网络方面的相关内容,包括计算机网络基础,OSI参考模型,TCP/IP协议簇,常见的网络协议等等,在此基础上,介绍Java中的网络编程. 一.概述 ...
- 这份书单会告诉你,Java网络编程其实很重要
- 20145206《Java程序设计》实验五Java网络编程及安全
20145206<Java程序设计>实验五 Java网络编程及安全 实验内容 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.设计安全传输系统. 实验步骤 我和201451 ...
- 20145211 《Java程序设计》实验报告五————Java网络编程及安全实验报告
实验内容 1.掌握Socket程序的编写: 掌握密码技术的使用: 设计安全传输系统. 实验步骤 这一部分是与我的partner合作的,详见他的博客- [20145326 <Java程序设计> ...
- java网络编程socket解析
转载:http://www.blogjava.net/landon/archive/2013/07/02/401137.html Java网络编程精解笔记2:Socket详解 Socket用法详解 在 ...
- JAVA网络编程【转】出处不详
网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在 学习网络编程以前,很多初学者可能觉得网络编 ...
- 实验五 Java网络编程及安全
北京电子科技学院 实 验 报 告 课程:移动平台应用开发实践 班级:201592 姓名:曾俊宏 学号:20159210 成绩:___________ 指导老师: ...
随机推荐
- Python属性、方法和类管理系列之----描述符类
什么是描述符类? 根据鸭子模型理论,只要具有__get__方法的类就是描述符类. 如果一个类中具有__get__和__set__两个方法,那么就是数据描述符,. 如果一个类中只有__get__方法,那 ...
- Citect:How do I translate Citect error messages?
http://www.opcsupport.com/link/portal/4164/4590/ArticleFolder/51/Citect To decode the error messag ...
- bzoj 3672: [Noi2014]购票 树链剖分+维护凸包
3672: [Noi2014]购票 Time Limit: 30 Sec Memory Limit: 512 MBSubmit: 480 Solved: 212[Submit][Status][D ...
- Xplico
http://zhulinu.blog.51cto.com/539189/850909
- 如何解决eclipse中的中文乱码问题:
方法一:代码里面进行改变编码 1. 编码方式的gbk和utf不同,不可以互相转换,只有byte和utf或者byte和gbk之间的转换,之间的转码如下:
- 执行gem install dryrun错误
ERROR: While executing gem ... (Gem::FilePermissionError) You don't have write permissions for ...
- php stdClass Object 问题
Array ( [0] => stdClass Object ( [term_id] => 3 [name] => apache [slug] => apache [term_ ...
- 2013年最受欢迎的16个HTML5 WordPress主题
本文中,我整理了16个最新.最受欢迎的WordPress主题,它们一致的特征是支持HTML5, 它们秉承最佳设计理念以及最新的流行趋势,将它们归纳与此,希望对喜欢HTML5,准备用WordPress做 ...
- 【HDOJ】3505 Writing Robot
挺好的一道题目,我的做法是kmp+Dinic网络流.kmp求子串在P中出现的次数,从而计算love值.网络流主要用来处理最优解.case2中p1的love值是8,p2的love值是7,最终T包含p1和 ...
- 如何使用eclipse进行嵌入式Linux的开发
如何使用eclipse进行嵌入式Linux的开发 作者:曾宏安,华清远见嵌入式学院高级讲师. 如何使用eclipse进行嵌入式Linux的开发 习惯了在windows环境下开发的程序员在转到Linux ...