用户登录后IP记录日志的六种实现方案探讨

这篇具有很好参考价值的文章主要介绍了用户登录后IP记录日志的六种实现方案探讨。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

之前大群里有小伙伴在讨论用户IP日志记录的一些方案,也有小伙伴在做这个需求,私底下跟我咨询过,所以在此特地汇总梳理一下。

### 方案1
在登录业务中直接记录用户每次登录的IP日志,如下图所示:

后台记录当前登录的ip 如何实现,tcp/ip,网络协议,网络

用户请求登录的Controller,原先用户直接调用登录的service,这里假设用户登录校验都没问题,这个时候新增一个业务方法用于保存用户的ip,这个ip需要通过Controller的方法获得请求参数Request的IP后传入到Service,如此就可以保存。这里的数据库可以用MySql这样的关系型数据库,也可以使用MongoDB,个人建议后者。

这种方案简单粗暴,但是有个缺点,就是耦合太高了。对原先的代码有了侵入性,Controller与Service的方法都需要进行修改后方可生效。

### 方案2

为了降低耦合,使用消息队列,消息队列可以在controller中发、也可以在service中发,如下图所示

后台记录当前登录的ip 如何实现,tcp/ip,网络协议,网络

如果不考虑事务,并且不修改service的情况下,可以直接在controller中发消息即可。消费监听到消息后,调用service的保存ip方法即可。

使用消息队列方案也有一个很大的缺点,那就是太重了,很多公司一开始可能并没有消息队列,额外增加MQ也会提高运维的复杂度。所以这个方案看情况而定,没有必要为了一个非主线任务而增加中间件。

### 方案3
同样是解耦,由于MQ太重,所以可以采用Spring的异步任务来做。如下图所示:

后台记录当前登录的ip 如何实现,tcp/ip,网络协议,网络

此处也不考虑事务,因为没必要,直接在Controller中调用异步任务就可以。通过在异步任务中进行IP保存。

这么做其实没啥问题,但是有的公司的技术Leader或架构师不喜欢这种方式,因为这仍然对原有代码进行了破坏,也就是Controller需要修改代码,也依然会存在一定的耦合度。所以请看方案4。

### 方案4
使用Spring的AOP切面,如下图所示:

后台记录当前登录的ip 如何实现,tcp/ip,网络协议,网络

通过AOP,可以直接针对某个指定的方法进行切入,结合AOP的多种通知机制来做,如此针对性的方法可以在AOP中实现,只要切到登录业务方法,那么就会进入AOP的通知,在通知中调用IP业务进记录保存即可。

使用AOP切面也会存在小缺点,从长远考虑,Service中的方法小概率被其他业务或其他子项目调用,如此便会生成不必要的日志。短期的话AOP简单方便可以直接用,也降低代码的耦合,对原有业务代码零侵入。

### 方案5
使用拦截器(有些框架叫做过滤器),本质上这也类似于切面,只不过这是针对请求的入口,在进入到controller之前进行IP数据的获取与记录。也许有小伙伴会问,AOP也可以直接切controller呀,直接用AOP也行吧?没错,但是习惯性不这么做,AOP一般对service的切入较多。相对而言,使用拦截器则更佳。参考如下图所示:

后台记录当前登录的ip 如何实现,tcp/ip,网络协议,网络

通过拦截器注册,指定分配给某个url的路由(如:/user/login)即可。如此每次请求经过该路由,则进入拦截器中,通过ip的获得并且调用IpService进行记录保存即可。

本方案相对可以实现,并且有的小伙伴也在这么用。所以如果在Java后端代码中实现的话,比较推荐方案5。当然处理方案5之外,还有一个比较好的方式,请参看方案6。

### 方案6
网关记录用户登录的IP日志。方案1~5都需要经过java代码的编写,并且重新打包发布版本,而且开发和运维还都需要走流程走工单。那么假设技术经理提出不从java代码层面来做的话,这个时候其实也可以。请参看如下图所示:

后台记录当前登录的ip 如何实现,tcp/ip,网络协议,网络

OpenResty目前在很多公司都是作为业务网关来使用,而且在高并发场景中出现的很多,几乎都在用,比如多级缓存架构都需要借助于OpenResty来实现。在图中,OpenResty可以作为业务网关来控制请求的走向,请求进来如果匹配到登录url(如:/user/login),则进行lua脚本的转发,请求会进入到lua脚本中进行控制,lua脚本可以获得用户的ip以及用户id,如此就可以直接在lua中进行数据的存储,不管是mysql、mongodb或是redis,都可以进行存取。此处可以直接结合mongodb来进行日志记录的保存即可。

可以看到,本方案只需要修改网关增加lua脚本即可生效,对后端的Java代码是0侵入的,并且也降低业务代码的复杂度。当然缺点也有,那就是需要和运维人员协调,让运维来进行网关的业务编写。当然有些公司是由Java开发来实现OpenResty的相关代码,那么这样就更方便了,减少沟通成本。

「Java架构师2.0」正在筹备中...文章来源地址https://www.toymoban.com/news/detail-796505.html

到了这里,关于用户登录后IP记录日志的六种实现方案探讨的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言实现排序算法的六种方式

    1、冒泡法 2、交换法 每次用当前的元素一一的同其后的元素 3、选择法 从数据中选择最小的同第一个值交换,在从剩下的部分中选择最小的与第二个交换,这样往复下去 4、插入法 在前面的数中寻找相应的位置插入, 然后继续下一张 插入排序就是每一步都将一个待排数据按

    2024年01月25日
    浏览(36)
  • Java面试之单例模式的六种实现方式

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 由于设计模式在面向对象中起着举足轻重的作用,在面试中很多公司都喜欢问一下有关设计模式的问题。在常用的设计模式中,Singleton单例模式是唯一一个能用短短几十行代码完整实现的模式,因此,写

    2024年02月10日
    浏览(33)
  • mysql实现if语句判断功能的六种使用形式

    在Mysql数据库中实现判断功能有很多方式,具体又分为函数和if语句形式,函数的好处是可以作为sql的一部分来运行,而if语句则需要在存储过程中使用。 语法: 解释: 判断第一个表达式是否为 NULL,如果为 NULL 则返回第二个参数的值,如果不为 NULL 则返回第一个参数的值 参

    2024年02月15日
    浏览(36)
  • 实现用户操作日志记录

    java自带的日志框架是java.util.logging(JUL),从JDK1.4(2002)开始捆绑在JDK中。可以使用JUL来记录操作日志。以下是使用JUL记录事务的示例: 系统日志 :统日志主要是为开发排查问题提供依据,一般打印在日志文件中;系统日志的可读性要求没那么高,日志中会包含代码的信息

    2024年02月15日
    浏览(31)
  • Bean 的六种作用域

      目录 一、作用域是什么? 1、singleton(单例作用域) 2、prototype(原型作用域) 3、request(请求作用域) 4、session(回话作用域) 5、application(全局作用域) 6、websocket( HTTP WebSocket 作用域) 二、单例作⽤域VS 全局作⽤域 三、设置作用域 Bean的作用域是指Bean实例的生命周

    2024年02月10日
    浏览(29)
  • 关于Bean的六种作用域

    在JavaSE中,我们学习过了全局变量以及局部变量,这里就涉及到了作用域问题,那么什么是作用域呢? 限定程序中变量的使用范围叫做作用域,或者说在源代码中定义变量的某个区域就叫做作用域。 而Bean的作用域指的是 Bean在Spring整个框架中的某种行为模式 , 比如singleto

    2024年02月08日
    浏览(42)
  • 服务限流的六种方式

    服务限流,是指通过控制请求的速率或次数来达到保护服务的目的,在微服务中,我们通常会将它和熔断、降级搭配在一起使用,来避免瞬时的大量请求对系统造成负荷,来达到保护服务平稳运行的目的。下面就来看一看常见的6种限流方式,以及它们的实现与使用。 固定窗

    2024年02月10日
    浏览(26)
  • 【SpringMVC]获取参数的六种方式

    目录 1.通过ServletAPI获取 2.通过控制器方法的形参获取 3.@RequestParam:将请求参数和控制器方法的形参绑定 4.@RequestHeader:将请求头信息与控制器方法的形参的值进行绑定 5. CookieValue:将cookie数据和控制器方法的形参绑定 Cookie: ​编辑 6.通过控制器方法的实体类类型的形参获取

    2024年02月09日
    浏览(41)
  • Python中的六种基本数据类型

    Python中分为六种基本数据类型 不可变类型(又叫静态数据类型,没有增删改操作):数字(number)、字符串(string)、元组(tuple) 可变类型(又叫动态数据类型,支持增删改操作):列表(list)、字典(dictionary)、集合(set) 1. 数字类型(numbers): 数字类型下还可分为整数(int)、浮点数(f

    2024年02月04日
    浏览(27)
  • 斐波那契数列的六种解法

    做这个问题之前,我们需要了解到斐波那契数列是什么东西?是干什么的? 斐波那契数列是什么? 一、斐波那契数列指的是这样一个数列:1、1、2、3、5、8、13、21、…… 这个数列从第三项开始,每一项都等于前两项之和。 二、应用:通常在个别股票中不是太准确,通常在指数上

    2024年02月08日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包