1 websocket基本使用
websocket 是 javax.websocket下面的,不需要任何依赖,直接就可以使用
@ServerEndpoint 标记声明一个websocket 服务 ,configurator 属性指定 鉴权 配置类,@ServerEndpoint 标记的类 为每个链接会创建一个该对象实例,也就是成员变量这个链接内私有。
@OnOpen , @OnClose , @OnMessage , @OnError 4个事件方法,对应事件触发的时候调用 (除了@PathParam("path") 标记的参数以外,最多只能有 String message, Session session 两个参数)
配置鉴权类
测试客户端html代码:
websocket地址格式:ws://localhost/te/websocket/pathParam/ ,他们的协议 是 ws ,如果使用安全套接字证书就是wss://localhost/te/websocket/pathParam/,类似 http 和 https
客户端创建 websocket 的时候可以指定私有协议: new WebSocket("ws://localhost/te/websocket/pathParam",["token"])
客户端创建 websocket 支持 pathParam: new WebSocket("ws://localhost/te/websocket/pathParam/?id=1")
客户端创建 websocket 的时候可以指定请求参数: new WebSocket("ws://localhost/te/websocket/pathParam/1")
当然这些参数都需要服务器端支持
2 websocket在使用内嵌容器的spring中使用需要指定WebsocketExporter,否者不能识别 websocket
需要注意的是 @ServerEndpoint 标记的 类不要被AOP 切到,否者或异常
3 Sec-WebSocket-Protocol 自定义协议参数传递
客户端如果带了Sec-WebSocket-Protocol参数,服务器端响应必须带上同样的Sec-WebSocket-Protocol值才能正常的建立链接。否者服务器端的连接会立马断开。
4 性能使用就meter测试,本地机器可以轻松支持2000线程,10条消息/线程/秒 的请求。(线程多余3000,请求每秒一条消息都卡,感觉是window端口的问题,按理说一个客户端请求占一个端口,window 端口有6W多个,不应该卡才对,可可能是就jmeter的限制,线程多了就卡死)
2000线程,每秒10 条,应该远远不是 我本机 websocket 的性能瓶颈,目前测试的瓶颈应该是 客户端限制的,这时候 java程序的cpu占用,内存占用都不高。
如果直接用nginx 做websocket service 代理,明显会受到 客户端端口的限制(LVS 的 三种负载均衡策略给出了解决方案(DR模式))
备注:和普通tcp socket 一样,服务器端只会占用一个端口,但是一个客户端会占用一个端口。