单应用架构设计和实现(springboot或者springcloud方式)

在这里插入图片描述
传统单体架构设计springboot方式
1)DNS域名解析
DNS域名解析可以在阿里云、腾讯之类的网站进行购买,但是国内购买的域名需要进行域名实名认证,对个人域名使用的范围也有所限制,可以直接到外网上购买域名,然后进行配置解析,本人使用的是https://www.namesilo.com/,可根据个人喜好进行购买。
2)虚拟ip
DNS域名解析配置同一个域名只能配置一个ip,如果解析到的后台服务器出现故障则无法对网站进行访问,可以在阿里云购买虚拟ip,虚拟ip的购买可以自行去了解,关于ip也是建议购买国外的IP,我记得国内的ip好像是不允许非注册的域名进行访问的。
3)配置nginx集群
nginx集群配置可参考链接
nginx中可以设置请求路径返回的信息在nginx中的缓存时间、浏览器端的缓存时间,该配置可以缓解请求对后台的压力,但是是需要根据实际场景进行考虑的,具体如何配置请学习nginx配置。
4)springboot负载均衡配置
可参考链接
5)reids主从配置
redis的主从需要进行主从集群配置,具体配置可以在网上进行查找
其中springboot项目中可以配置主从redis的ip地址,redis也可以采用vip+Keepalived的方式进行配置,确保高可用
6)mysql主从配置
读写分离或者没做读写分离的都可以采用链接方式进行配置。
也可以采用mycat中间件来实现mysql的主从,mycat默认从从库读取数据,往主库写入数据,也可以通过mycat的语法格式指定从主库读取数据。关于横向分表可以参考链接
mycat相关配置链接:
链接1链接2
7)流量监控
即使是单体架构流量监控的工作也同样重要。
a.流量监控可以分析和优化请求,例如对于频繁查询的接口可以考虑使用nginx缓存机制来缓解对tomcat的请求压力;
b.通过对流量的分析可以预测未来流量的趋势,可以提前制定应对计划,根据本人初略的查询,有针对nginx进行流量监控的,也有可以针对springboot本身进行流量监控的,可以根据项目需要进行选型,如果实在不知道怎么选型,可以到人才招聘网站上查询架构师的招聘需求,上面有提及一些流量监控的工具。能够进行设定并发请求阈值进行短信通知,这个也需要考察才能知道。
例如:Prometheus+SpringBoot应用监控全过程
服务端性能监控最佳实践(四):nginx-module-vts监控nginx流量
8)数据库定时备份
可以通过编写shell脚本的方式,然后通过使用linux自带的cron进行定时,理论上shell脚本还可以实现异地备份的功能。
本地备份的实现可查看链接

以上为传统方式的单体架构,也可以使用springcloud的方式来进行。
方式一
添加sentinel限流
在这里插入图片描述
这种方式不需要nacos配置中心,sentinel server可以单独启动,在springboot中进行配置。但是这种方式有缺陷,每一次sentinel都需要进行配置,所以需要引入nacos。
sentinel实际生产部署还是需要考虑安全和可靠性问题的,参考连接

方式二
在这里插入图片描述
sentinel配合nacos中心进行使用,将熔断限流信息存入mysql。参考链接
nacos生产部署需考虑安全问题可参考链接,需要注意springcloud的版本和nacos版本之间的兼容性。
方式三
在这里插入图片描述
配置gateway,因为gateway需要用到fegin负载均衡,所以需要gateway应用也注入到nacos配置中心。
方式四
在这里插入图片描述
将gateway和sentinel相整合,流控和熔断在gateway上进行。

网关访问权限配置
看到博客说可以将gateway和springsecurity进行整合,那么就要把验证前移。需要再gateway上设置哪些接口需要验证,哪些接口不需要验证,对于需要验证的接口先验证合法性,根据合法的token获得用户id,再根据不同路径确认其要访问的系统,根据系统可以获得其在系统中的权限请求列表,判断目前请求路径是否在列表中进行权限判断来决定是否放行,根据分析来看该方案是可行的,则gateway将会作为权限中心,那么gateway就需要去数据库查询权限信息,为了缓解压力,权限中心需要使用redis缓存存放不经常改变的权限信息,如果权限信息被修改了,则需要往redis里面进行实时更新,既然涉及到权限管理,则需要有一个权限管理系统对权限进行管理,因此系统架构图演变成如下的样子。
在这里插入图片描述
实际上目前仅为单体应用,我们可以假定其并发数量不会很高,但是当下游系统越来越多的时候,gateway网关的压力也会增大,架构中我们使用了redis,一般访问权限修改的可能是很小的,我们可以把某些经常查询但数量也不是很大的数据存入到redis中,例如系统-角色信息、系统中的菜单列表信息、角色菜单关系链接信息等长期放在数据库中,用户角色信息可以设置失效时间,这样我们在查询某个用户权限的时候,可以先到数据库或缓存中获取获取用户角色信息,再到redis中获得角色菜单信息,这个过程中可以减少和mysql的交互。
这样还有一个问题,gateway确实可以做到对权限的控制,但是当把参数往下游系统传送的时候会涉及到用户id的获取问题,再去做jwt属于额外的工作量,可以考虑把解析出来的id放到request的头信息中传到下游系统。

本人根据测验,gateway中无法实现我所想的这种方式,因为内部原理冲突,具体原因可参照链接,因此对gateway的配置进行修改,将gateway作为验证网关,修改后的架构图如下
在这里插入图片描述
当用户发送请求的时候,首先是经过网关,对于不需要验证的接口,直接路由到对应的服务器上。如果是首次登录,则需要经过用户系统进行合法性验证,验证之后的token会返回到前端同时存储到redis中,之后当用户访问需要权限验证的资源的时候,gateway会请求用户系统进行token的验证,验证通过gateway再去调用权限系统进行权限判断,如果权限判断通过则访问对应资源。
注意此种设计方式需要对ip进行限制,对于简单的应用可能做不到有那么多的服务器来部署,如果使用的是docker容器的方式来部署,可以绕开这个问题。
项目demo

下一篇将思考多系统如何使用springcloud框架进行实现,实际上springcloud框架也需要从两个方面进行考虑,一个为低并发量多系统公用公共设施的架构,另一个为高并发量多系统公用公共设施的架构。

其他建议引入:阿里巴巴《Java 开发手册》补充到:如果预计三年后的数据量根本达不到这个级别,请不要在创建表时就分库分表。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值