- 浏览: 169607 次
- 性别:
- 来自: 杭州
最新评论
文章列表
IO 多路复用技术
在 Linux IO 编程中,如果需要同时处理多个客户端请求,可以利用 IO多路复用技术,把多个 IO阻塞 复用到同一个 select(系统调用)阻塞上。这样就能达到 单个线程同时处理多个客户端请求 的效果。 与传统的多线程方式相比,IO多路复用 可以减少系统开销。因为所需线程少,节省了很多系统资源。
IO 复用的关键系统调用
文件描述符 —— FD(file descriptor)
Linux 内核将所有外部设备都当作一个文件来操作; 而Linux中对一个文件的读写操作会调用系统命令,返回一个文件描述符 FD。 对一个 socket 的读写 ...
Reactor 模式
大部分网络框架的设计都基于 Reactor 模式。 这种模式基于事件驱动,特别适合处理大量的 IO 事件。
根据线程数量,我们可以将 Reactor 模式大致分为以下3种(以服务端实现为例):
单线程 Reactor
单个 Reactor 线程负责对TCP链路读写数据和编解码(包括执行业务逻辑)。 (很多人把该模式称为 “1 - 1”。其实这种称呼并不贴切。)
适用场景
适合 并发度低、请求处理快 的小应用。
缺陷
不适合 高并发、高负载的场景。因为:
单线程处理大量并发链路时性能不高,也无法发挥多核计算机的优势。无法 ...
Netty > java.nio + java.net
Netty 是一个 NIO 框架。 它的设计强调了“分离关注点”(Separation Of Concerns)。 它通过事件机制,将业务逻辑与无关的技术逻辑隔离,通过抽象层填补 基础平台 和 业务开发 之间的鸿沟。Netty 极大地简化了网络编程(如,TCP/UDP socket 服务器)。可以利用它更快速容易地开发网络应用。
Netty 如何实现高性能
Netty 没有 Java 核心类库那么强烈的通用性、跨平台等负担。 它针对性能等特定目标、及Linux等特定环境,采用了极致的优化手段。
...
序列化兼容技巧 之 指定序列化方式:CompatibleFieldSerializer
因为性能出色,Kryo 经常被选为Dubbo服务的序列化方案。 在序列化Java对象时,Kryo 默认使用 FieldSerializer 类进行序列化。 但为了增强兼容性,我们一般会显式指定使用 CompatibleFieldSerializer。
使用方式就是在 API jar 包中的类上,以添加注解的方式指定。 (只需对那些会在客户端和服务端之间进行传输的类进行改造) 如:
package demo.api.entity;
import com.esotericsoftware. ...
常见的 4 种作用域
Spring Bean 的默认作用域是 Singleton。一般通过注解 @Scope 自定义Bean的作用域。
Singleton 整个应用中,只创建一个实例。(默认)ConfigurableBeanFactory.SCOPE_SINGLETON
Prototype 每次注入或通过Spring Application Context 获取时,都会创建一个新的实例ConfigurableBeanFactory.SCOPE_PROTOTYPE
Session 在 Web 应用中,为每个会话创建一个实例WebApplicationCont ...
Bean 创建过程
自定义的初始化方法
通常通过 @Bean 注解的 initMethod 指定(不推荐XML形式的配置方式)。
Bean 销毁过程
自定义的销毁方法
类似自定义的初始化方法。 通常通过 @Bean 注解的 destoryMethod 指定(不推荐XML形式的配置方式)。
Bean循环依赖解决方法
通过构造方法注入依赖 —— 失败
@Service
public class FooServiceImpl implements FooService {
private BarServi ...
JDK提供了一些线程安全的集合。 有粗粒度 synchronized 的集合。如,Hashtable、Collections.synchronizedXxx 包装的集合。 有细粒度,基于分离锁实现的集合。如,ConcurrentHashMap。 通常,并发包中提供的容器性能远优于早期的简单同步实现。
为什么需要ConcurrentHashMap?
HashMap 不是线程安全的。在并发场景中,可能会出现类似CPU占用100%之类的问题(死循环)。
Hashtable 和 Collections.synchronizedMap() 包装的HashMap: 内部都是通过 syn ...
【Java核心-安全基础】编写安全的Java代码
- 博客分类:
- Java
实现安全的Java代码,需要从功能设计到实现细节,都充分考虑可能的安全影响。 以消耗系统资源为目的的攻击是很常见的方式。 CPU、线程、内存、文件描述符、数据库连接、再入锁等各种资源都可能成为攻击者消耗的目标。 ...
背景
在某些特殊的项目中虽然使用了HTTPS,但其证书管理又不是采用常规模式,如服务端用了个自签名的证书。 很多组织的内部项目因为各种原因采用了这种方式。(先不深挖这种模式的利弊) 这种情况下,大多数HTTP客户 ...
问题
有两台Linux机器:
date 命令查看时间相同
通过 date 命令查看时间,发现两台机器区域语言和时间都相同:
JVM获取系统时间相差12小时
通过最基本的java代码 new Date() 获得时间,发现两台机器的系统时间相差12小时。 其中一台输出的时区与上述date命令相同,都是东八区(CST,中国标准时间)。 另一台输出的时区与date命令不符,是西五区(EDT,美国东部白昼时间)。 根据理论经度,东八区 与 西五区 相差13小时。但因为时值美国夏令时,时刻的值被“人为”调整,所以两台机器相差12小时。
解决方法
...
Dubbo服务通常依赖一个jar包来表示服务签名,其中包含了服务的接口定义。 服务的提供者(服务端)需实现这些接口; 服务的调用者(客户端)可以通过这些接口调用服务。
问题
此文提到的异常 “com.esotericsoftware.kryo.KryoException: Buffer underflow” 通常是因为服务端和客户端持有的jar包版本号相同,但实际内容不同,导致序列化异常。
出现这种情况的原因往往是因为项目管理流程混乱,导致jar包被覆盖发布(版本号相同,但实际内容不同)。 对!你没有看错,是正式版jar包覆盖发布,不是SNAPSHOT。管理非常混乱。
...
【Java核心-安全基础】Java的安全机制
- 博客分类:
- Java
任何可以用来绕过系统安全策略限制的缺陷都是安全漏洞。 构建安全可靠的服务需要通过整体性的安全设计和综合性的防范手段。
Java的安全机制
1. 运行时安全机制
字节码校验
类加载过程中,字节码验证,防止不合规的代码影响JVM运行或载入恶意代码。 如,自行编译String类替换JDK的String类就无法通过类加载。
Class Loader 隔离代码
应用无法获取 Bootstrap Class-Loader 对象实例。
不同的 Class Loader 可以起到容器的作用,隔离模块间不必要可见性。
SecurityManage ...
【Java核心-进阶】运行时动态生成Java类
- 博客分类:
- Java
技术上可行的方式
生成源码文件 -> 编译源码 -> 加载类
方式1:javac 编译
可以用 ProcessBuilder 这个类启动 javac 进程,编译源码文件
方式2:Java Compiler API 编译
JDK中的 Java Compiler API 提供了与 javac 对等的编译能力。(示例:InMemoryJavaCompiler)
直接生成字节码 -> 加载类
一般通过字节码操作工具和类库来更改Java Class的字节码。 流行的工具有 ASM、Javassist、cglib、Byte Buddy 等。很多 ...
【Java核心-进阶】类加载
- 博客分类:
- Java
Java类加载的三个阶段
《Loading, Linking, and Initializing》
加载(Loading)
将Java字节码数据读取到JVM中,并映射为 Class 对象。 数据源可以是 jar文件、class文件或网络数据源。
用户可以实现自己的类加载器来自定义加载过 ...
CAS简介
CAS(compare-and-swap)是一种对数据进行原子性操作的技术。 它提供了一系列操作指令用于读取数值,或并发修改。 它是Java并发中所谓 “lock-free” 机制的基础。 CAS的底层依赖于CPU提供的指令。如,x86 CPU 的 cmpxchg
CAS使用方式
AtomicInteger
AtomicInteger使用了CAS技术, 它底层依赖于 Unsafe 对数据进行操作, 并使用 volatile 字段 value 记录数据,以保证可见性。
public class AtomicInteger extends Number ...