一、环境准备
①去skywalking官网下载Skywalking APM(version≥9.0.0)以及Java Agent;
②将下载好的agent压缩包解压过后放置apache-skywalking-apm目录下;
③打开webapp目录下的yml配置文件,并将启动端口改为8081(默认8080),防止端口冲突;
④打开bin目录下startup.bat,启动服务;
若出现以上两个页面则代表skywalking启动成功,浏览器输入localhost:8081,查看Web端页面;
二、链路追踪
①于若依官网下载完ruoyi-cloud源码后,用idea打开;
RuoYi-Cloud: 🎉 基于Spring Boot、Spring Cloud & Alibaba的分布式微服务架构权限管理系统,同时提供了 Vue3 的版本
② 同时准备Nacos,在config目录下的application文件下配置Nacos持久化,具体参考
③idea各个服务下添加JVM配置指令;
修改选项下面选择添加VM选项,并在框内添加如下指令;
-javaagent:F:\Desktop\apache-skywalking-apm-9.0.0\apache-skywalking-apm-bin\apache-skywalking-java-agent-9.0\skywalking-agent\skywalking-agent.jar
-Dskywalking.agent.service_name=ruoyi-auth
-Dskywalking.collector.backend_service=localhost:11800
(第一行为本地skywalking-agent.jar包的文件目录位置;第二行为服务名称,与你所启动的服务名一致;)
④启动服务,并查看localhost:8081查看效果;
若是如上页面,可以查看到各个服务的状态、各个之间的拓扑图关系以及trace,即代表参数配置成功,成功实现链路追踪!
三、ruoyi登录认证源码分析
若依登录界面实现登录功能,发现调用了login,getinfo,getRouters三个接口。
可以在trace处查看,刚刚调用了的接口trace分布图,这边采用了树结构,方便更简洁明了的查看各个模块之间的关系;首先查看上半分支,点击对应的节点,可以查看具体的接口调用method以及端点;
①根据以上信息大致可以推断出,Ruoyi-Auth 服务向某个目标地址 ;
http://192.168.159.1:9201/user/info/admin
发起了一个成功的 GET 请求,而且没有出现错误。这可能是 Ruoyi-Auth 服务调用了其他服务的/user/info/{username}
端点。
②这个操作的成功执行表明 Ruoyi-Auth 服务成功从 Redis 缓存中读取了数据而没有出现错误,以提高性能和减少对数据库的请求压力。
③记录了 Ruoyi-System 服务成功接收并处理了一个 HTTP GET 请求,请求的端点是
/user/info/{username}
,并且返回状态码为 200 表示请求成功。
④Ruoyi-System 服务中的一个操作的信息。操作的端点指示它涉及到 AlibabaDruid 组件中的数据库连接获取操作(getConnection)
⑤ Ruoyi-System 服务中的一个操作,该操作使用了 mysql-connector-java 组件与本地 MySQL 数据库(Peer: localhost:3306)进行通信。操作类型是 "Exit",表示 Ruoyi-System 服务向数据库发出了查询请求。数据库查询的语句用于获取用户信息、角色信息和部门信息,以及相关的联接条件。操作没有出现错误(error: false)。
⑥Ruoyi-System 服务中的一个操作,该操作涉及 AlibabaDruid 组件中的数据库连接关闭操作(close)。操作是本地操作(Local),没有指定对等端(No Peer),并且没有出现错误(error: false)。这通常表示在操作完成后成功关闭了数据库连接。
⑦Ruoyi-Auth 服务中的一个操作,该操作使用 Lettuce 组件与本地 Redis 缓存服务(Peer: localhost:6379)进行通信。操作类型是 "Exit",表示 Ruoyi-Auth 服务向 Redis 缓存发出了读取请求。操作没有出现错误(error: false)。
⑧Ruoyi-Auth 服务向 Redis 缓存发出了 EXISTS 命令,用于检查某个键是否存在。操作没有出现错误(error: false)。
⑨这个操作使用了 Feign 组件向地址为
http://192.168.159.1:9201/logininfor
发起了一个成功的 POST 请求,并且没有出现错误。 Feign 组件通常用于进行远程服务调用,这个操作可能是对某个服务的登录信息进行提交的请求,并且请求成功返回了状态码 200。
⑩这个标记描述了 Ruoyi-System 服务中的一个操作,该操作是一个入站操作(Entry),表示 Ruoyi-System 服务接收了一个 HTTP POST 请求。操作的端点是 POST:/logininfor,使用了 SpringMVC 组件来处理请求。没有指定对等端(No Peer),并且操作没有出现错误(error: false)。请求的 URL 是 http://192.168.159.1:9201/logininfor,HTTP 请求方法是 POST,而且请求成功返回了状态码 200,通常表示请求成功。这个操作用于处理用户登录信息的提交。
其中11/12/13操作与④⑤⑥一致,都是连接数据库,从数据库读取数据,关闭数据库的过程;
14.这个操作与 Redis 缓存相关,使用了 SETEX 命令来将数据写入缓存。SETEX 通常用于在一定时间后使缓存中的数据过期。这个操作成功执行并且没有出现错误,即成功将数据写入了缓存。
四、总结
用户发起登录请求: 用户使用 POST 请求向 Ruoyi-Auth 服务的
/login
端点发送登录请求。Ruoyi-Auth 处理登录请求: Ruoyi-Auth 服务使用 SpringMVC 组件处理接收到的登录请求。
认证逻辑: Ruoyi-Auth 服务处理登录请求,可能包括用户身份验证、权限检查和会话管理等。
数据库查询: Ruoyi-Auth 服务通过数据库查询操作(Mysql/JDBC/PreparedStatement/execute)从名为 "ry-cloud" 的 MySQL 数据库中检索用户信息、角色信息和部门信息。
缓存操作: Ruoyi-Auth 服务使用 Lettuce 组件与本地 Redis 缓存服务进行缓存操作,包括 GET、EXISTS 和 SETEX 等。
返回登录结果: Ruoyi-Auth 服务返回登录结果,通常是将用户重定向到其他页面或返回认证令牌等信息。