一个大型网站系统会有很多接口,把它们都塞进一个后端应用程序里是很不理智的行为。这样做的话,无论是在开发阶段还是运营阶段,都会存在很大的麻烦。因此,后端应用程序需要拆分成独立的模块,拆分后端应用程序可以根据业务架构划分,如划分成用户模块和发布模块等。除了按功能划分以外,应用拆分还需要考虑权限分类(普通用户和管理员)及并发压力(高并发接口和普通接口)等因素。
拆分和整合后端应用程序很难在项目初期就一次性确定好,需要经常在开发过程中或者在调优过程中不断做调整。如果做好了前面强调的“限制函数调用层级”和“公共模块”,那么拆分或整合后端应用程序会变得非常简单,如图4.58所示。其中,公共模块是通用的,没有业务代码,接口迁移过去后可直接使用。
从技术层面上讲,每个接口请求都是完全独立的,在拆分应用后,后端应用程序可以正常运行在不同的Web应用服务器里。也就是说,从“正常运行”角度讲,后端应用程序之间可以不用考虑相互协调的问题。
不过,一般情况下,大部分的接口都需要做用户鉴权,而用户信息一般会记录在上节中介绍的Session当中。因此,我们需要做Session共享,而Session共享需要解决两个问题:
·在同一个Web应用服务器(Tomcat)下,不同的后端应用程序共享Session。默认情况下,Session是不能跨后端应用程序使用的,所以需要通过设置让Session支持跨后端应用程序使用。
·在不同的Web应用服务器下,后端应用程序共享Session。Session是被存储在Web应用服务器上的(Tomcat程序内),默认情况下,Session是不能跨Web应用服务器使用的。因此,需要设置一个共用的Session数据存储中心,一般使用Redis作为Session的存储中心。
以上这两个设置都只需要在后端应用程序的配置文件(默认是application.properites)中设置即可,无须在代码中做其他修改。配置文件中的设置如代码4.31所示,其中redis的连接IP和端口需要根据实际情况修改。
代码4.31 配置文件中的Session相关设置
#解决问题一,修改cookie的存储路径
server.servlet.session.cookie.path=/
#解决问题二,使用Redis作为Session存储中心
spring.session.store-type=redis #设置Session的存储方式
server.servlet.session.timeout=3600s #设置Session超时时间spring.redis.hostName=192.168.3.54 #设置Redis的连接IP
spring.redis.port=6380 #设置Redis的连接端口