Spring Boot 2系列(二十九):集成 WebSocket 广播和点对点两种通信方式
要了解 WebSocket, 可先看Spring Boot实践系列(二十五):WebSocket详解与使用,可参考官方文档Spring Boot -> WebSockets, Spring MVC提供了对 WebSockets 的支持Spring Web MVC -> WebSockets。
本篇主要记录广播(topic)和点对点(queue)两种模式集成的Demo代码。
要了解 WebSocket, 可先看Spring Boot实践系列(二十五):WebSocket详解与使用,可参考官方文档Spring Boot -> WebSockets, Spring MVC提供了对 WebSockets 的支持Spring Web MVC -> WebSockets。
本篇主要记录广播(topic)和点对点(queue)两种模式集成的Demo代码。
Web应用的 Session 默认是由服务器容器(如:Tomcat)管理,当部署服务器集群时,会出现在服务器A登录后,再次访问被负载均衡转发到服务器B时会被要求重新登录,这对访问同一个域名站点用户来说是非常不友好的体验,登录服务器的 Session 无法被集群中的其它服务器共用, 这就是集群环境下的 Session 共享问题。
解决集群环境下的 Session 问题的思路基本有三种:
1. 服务器 Session 复制:让集群中每台服务器都有其它服务器的Session, 这是服务器Session复制机制。
2. 持久化 Session:自定义 Session管理实现,接管容器对Session的管理,把 Session 持久化提供公共使用,每次请求根据 SessionId到 Session 缓存服务器取 Session 进行判断。
3. 在负载均衡服务器配置粘性 Session:即把同一个 Session 的多个访问始终绑定到同一台服务器,不推荐使用, 当该服务器宕机机就会出现 Session 丢失,没有利点集群的优势。
目前行业广泛使用且推荐使用的是持久化Session
,对Session 执行统一的存储和访问,实现 Session 在集群服务中的共享。
Listener 监听器,Filter 过滤器,Interceptor 拦截器是 Java Web领域非常重要的三大神器(组件),会经常使用到。
关注这三个的知识点本篇不做描述,主要记录在Spring Boot框架中这三大组件的使用。
前面文章也有提到:Spring事件监听,SpringMVC之HandlerInterceptor拦截器, Spring Boot实践系列(二十二):Web相关配置详解 。
官方文档:Spring Boot -> Application Events and Listeners,Spring Boot -> Servlets, Filters, Listeners, Spring Boot -> Add a Servlet, Filter, or Listener to an Application。
架构模式:使用类似甚至相同的功能组件或模块组个一个整体来解决共性的问题;问题重复出现,解决方案可重用。
大型网站应用是随着业务的扩张发展从小型网站演化而来,适合的架构才是最好的架构,满足业务需求,没有资源浪费。在互联网行业,技术为业务服务,架构演进由业务需求驱动。
Linux下的 ls、grep、wc 三个命令可组合成统计目录下文件及文件夹的个数
统计当前目录下文件的个数(不包括目录)
$ ls -l | grep “^-“ | wc -l统计当前目录下文件的个数(包括子目录)
$ ls -lR| grep “^-“ | wc -l查看某目录下文件夹(目录)的个数(包括子目录)
$ ls -lR | grep “^d” | wc -l
命令解析:
ls -l
每一行对应一个文件或目录(目录、链接、设备文件),ls -lR是列出所有文件,包括子目录。
drwxr-xr-x 10 root root 4096 Mar 30 00:57 bower_components
-rw-r–r– 1 root root 505 Mar 30 00:52 bower.json
第一位是d
表示目录(directory),是-
表示普通文件。
grep “^-“
过滤ls的输出信息,只保留一般文件,只保留目录是grep “^d”。wc -l
统计输出信息的行数,统计结果就是输出信息的行数,一行信息对应一个文件,所以就是文件的个数。
重构了一个项目,项目相对复杂,对外提供了很多接口产品给第三方调用,也调用多个第三方的数据,数据结构各种格式都有,业务有用户、登录、产品、订单、预付费/扣费、报表、客户、财务、对账等十多项服务。由单一架构拆分成多个Spring Boot微服务,Spring Cloud做服务管理。
重构后的项目也许在架构上仍存在缺陷,但比之前的单一架构则有较大的改进,非常方便横向扩展,大大降低了业务系统之间的耦合。本篇记录下重构的思路。
重构的目的主要是解决问题,如果问题不存在则重构没有意义,如果重构没有解决问题那更没有意义还浪费资源带来不可预知的风险,主要问题有:
JPA规范中主键生成策略@GeneratedValue
四种用法:TABLE,SEQUENCE,IDENTITY,AUTO
。
Spring Boot集成 JPA,在实体类映射表主键列的属性上使用**@GeneratedValue**注解来指示主键生成策略,主键生成策略的类型由枚举类GenerationType
的值确定。
Spring Boot为内嵌的Tomcat 8.5,Jetty 9和Undertow提供了 WebSockets 自动配置。 如果打包 war 文件部署到独立容器,则Spring Boot会认为容器负责其对WebSocket支持的配置。
Spring Framework提供了丰富的WebSocket支持,可以通过spring-boot-starter-websocket模块轻松的集成使用。
Spring Boot -> WebSockets, Spring Framework -> Web on Servlet Stack -> WebSockets。