编辑
2023-12-25
实用工具
00

简介

Zuul 是 Netflix 提供的一个基于 JVM 的网关服务,其主要作用是将所有请求转发到相应的后端服务。Zuul 主要有以下几个特点:

  • 路由和过滤:Zuul 可以通过定义一些路由规则,让请求转发到不同的后端服务,并且可以在路由前和路由后进行一些过滤操作。
  • 负载均衡:Zuul 内置了 Ribbon 负载均衡机制,可以自动地将请求分发到不同的服务器上,实现负载均衡的功能。
  • 可插拔性:Zuul 采用了过滤器链的机制,可以在处理请求的不同阶段中插入不同的过滤器,实现不同的功能。

在Zuul的组件中,主要由以下几个部分组成:

  1. 核心模块:包含了Zuul的核心代码,负责接收和处理外部请求,并进行路由、过滤等操作。其中,核心模块还包含了Zuul的主要配置类和启动类,用于对整个系统进行配置和启动。

  2. 路由模块:负责请求的路由功能,可以根据不同的路径或请求头信息对请求进行分发,并将请求发送到后端对应的服务实例中。

  3. 过滤器模块:提供了基于拦截器的过滤功能,可以对请求进行鉴权、限流、重试等操作,并对响应进行处理和转换。

  4. 发现模块:用于注册和发现后端服务实例,可以通过各种服务发现机制(如Eureka、Consul等)实现服务的自动发现和负载均衡。

  5. 监控模块:提供了一系列的监控指标和报告,可以帮助用户对系统进行实时监控和分析,以便及时发现和排查问题。

编辑
2023-12-22
学习记录
00

前提

AspectJ是一种面向切面编程(AOP)的框架,它可以在不修改原有代码的情况下,为其添加额外的行为。AspectJ使用三个核心心心概念:连接点(Join Point),切面(Aspect),和建议(Advice)

该类使用AspectJ注解来实现日志记录

连接点

连接点(Join Point)是指需要被切面影响的方法或构造器。您可以使用pointcut语句来定义连接点

java
@Pointcut("execution(public * com.test.controller..*.*(..))") public void webLog() {}

切面

切面(Aspect)是指包含pointcut和建议的类。您可以使用@Aspect注解来标记一个类为一个切面,例如:

java
@Aspect @Component public class WebLogAcpect { // ... }

建议

建议(Advice)是指在连接点之前或之后执行的方法。您可以使用@Before, @After, @Around等注解来标记一个方法为一个建议,例如:

java
@Before("webLog()") public void doBefore(JoinPoint joinPoint) throws Throwable { // ... }
编辑
2023-12-14
学习记录
00

前提

oracle中没有主键自增这个功能,需要使用数据库序列实现

创建序列

java
create sequence BACKSTAGE_LOG_ID_SEQ start with 1 --从1开始,不能小于最小值 maxvalue 9999999999999999999 --设置最大值 minvalue 0 --设置最小值 nocycle --一直累加,不循环 cache 5000 --缓存,表示一次产生5000个序号 noorder;
编辑
2023-12-12
实用工具
00

xxl介绍

XXL-JOB 是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。

设计思想 是将调度行为抽象形成 调度中心 平台,平台本身不承担业务逻辑,而是负责发起 调度请求 后,由 执行器 接收调度请求并执行 任务,这里的 任务 抽象为 分散的 JobHandler。通过这种方式即可实现 调度 与 任务 相互解耦,从而提高系统整体的稳定性和拓展性。 官方文档 官方git

简单使用

admin模块

克隆 git项目在本地

使用idea打开会发现三个模块

模块名称模块说明
xxl-job-admin调度中心,提供管理平台UI界面,真实开发场景中一般将其进行单独打包部署
xxl-job-core公共依赖模块,项目整合xxl-job时,需要导入该依赖
xxl-job-executor-samplesdemo案例

在mysql数据库中导入sql文件,在项目目录的doc/db路径下

表名说明
xxl_job_group保存执行器信息,新添加的执行器均在此表中保存
xxl_job_info用户保存任务信息,包括任务所属执行器,执行频次,过期策略等
xxl_job_lock任务调度锁
xxl_job_log保存调度结果、执行结果、调度入参、调度机器和执行器
xxl_job_log_report用于记录任务执行的成功次数,失败次数,一般以天为维度
xxl_job_logglue任务GLUE日志:用于保存GLUE更新历史,用于支持GLUE的版本回溯功能
xxl_job_registry执行器注册表,维护在线的执行器和调度中心机器地址信息
xxl_job_user系统用户表,用于登录admin控制台,使用MD5加密
编辑
2023-12-06
实用工具
00

Bean

BeanUtils

java
package com.ruoyi.common.utils.bean; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * Bean 工具类 * * @author ruoyi */ public class BeanUtils extends org.springframework.beans.BeanUtils { /** Bean方法名中属性名开始的下标 */ private static final int BEAN_METHOD_PROP_INDEX = 3; /** * 匹配getter方法的正则表达式 */ private static final Pattern GET_PATTERN = Pattern.compile("get(\\p{javaUpperCase}\\w*)"); /** * 匹配setter方法的正则表达式 */ private static final Pattern SET_PATTERN = Pattern.compile("set(\\p{javaUpperCase}\\w*)"); /** * Bean属性复制工具方法。 * * @param dest 目标对象 * @param src 源对象 */ public static void copyBeanProp(Object dest, Object src) { try { copyProperties(src, dest); } catch (Exception e) { e.printStackTrace(); } } /** * 获取对象的setter方法。 * * @param obj 对象 * @return 对象的setter方法列表 */ public static List<Method> getSetterMethods(Object obj) { // setter方法列表 List<Method> setterMethods = new ArrayList<Method>(); // 获取所有方法 Method[] methods = obj.getClass().getMethods(); // 查找setter方法 for (Method method : methods) { Matcher m = SET_PATTERN.matcher(method.getName()); if (m.matches() && (method.getParameterTypes().length == 1)) { setterMethods.add(method); } } // 返回setter方法列表 return setterMethods; } /** * 获取对象的getter方法。 * * @param obj 对象 * @return 对象的getter方法列表 */ public static List<Method> getGetterMethods(Object obj) { // getter方法列表 List<Method> getterMethods = new ArrayList<Method>(); // 获取所有方法 Method[] methods = obj.getClass().getMethods(); // 查找getter方法 for (Method method : methods) { Matcher m = GET_PATTERN.matcher(method.getName()); if (m.matches() && (method.getParameterTypes().length == 0)) { getterMethods.add(method); } } // 返回getter方法列表 return getterMethods; } /** * 检查Bean方法名中的属性名是否相等。<br> * 如getName()和setName()属性名一样,getName()和setAge()属性名不一样。 * * @param m1 方法名1 * @param m2 方法名2 * @return 属性名一样返回true,否则返回false */ public static boolean isMethodPropEquals(String m1, String m2) { return m1.substring(BEAN_METHOD_PROP_INDEX).equals(m2.substring(BEAN_METHOD_PROP_INDEX)); } }