自定义注解实现接口限流(接口限流怎么实现)

网友投稿 434 2023-01-10


本篇文章给大家谈谈自定义注解实现接口限流,以及接口限流怎么实现对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。 今天给各位分享自定义注解实现接口限流的知识,其中也会对接口限流怎么实现进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

基于Redis、AOP、注解实现的单用户限流

@Retention 自定义注解实现接口限流:注解的作用域自定义注解实现接口限流,包含RetentionPolicy参数

@Inherited :允许子类继承父类的注解
@Documented :此注解会包含在javadoc中

RedisTemplate对象的配置

切面类

获取web对象工具

测试接口

正常访问:

限流:

SpringBoot Starter自定义注解 - 接口加解密

目标

本章我们将编写一个starter,目标如下:

1、对外提供 @OpenAPI 注解,使用此注解它会对接收的请求数据进行解密,对要返回的数据进行加密。

2、完成服务端使用示例

3、完成前端调用示例

加密规则

1、对业务数据进行AES加密,示意代码:encryptData=AES("业务数据", aesKey)

2、对AES的key进行公钥加密,示意代码:encryptKey=RSA(aesKey, 公钥)

3、签名sign=md5(encryptData+encryptKey)

加密后请求示例

Content-Type: application/x-www-form-urlencoded;charset=UTF-8

请求参数

服务端返回示例


pom.xml

定义注解

配置公私钥

具体代码逻辑

定义切面和自动装配

spring.factories


服务端修改

在业务项目中引入jar 包

配置公私钥

改动的地方很少,只需要在原接口增加@OpenAPI注解即可

前端修改

修改前代码

修改后要先对参数加密,然后对返回数据解密


安装两个加密库

封装RSA、AES和Base64加解密

Zuul上实现限流(spring-cloud-zuul-ratelimit)

Spring Cloud Zuul RateLimit项目Github地址:
https://github.com/marcosbarbero/spring-cloud-zuul-ratelimit
该包实现了在Zuul对每个服务进行限流。提供的几种限流方式:
pom.xml增加依赖:

配置示例:

配置命名空间:zuul.ratelimit
Policy属性:
1. 启动一个Zuul服务和一个API服务,配置正常的路由规则。访问API:
2. 按照上面的使用方式,重新启动配置有RateLimit的Zuul。相关配置:
3. 在postman中集中运行12次相同的API调用,结果中有两次调用返回429:
4. 查看对应的Response Headers和Body的信息:
如果希望自己控制key的策略,可以通过自定义RateLimitKeyGenerator的实现来增加自己的策略逻辑。

实例:

根据请求上的参数来对请求进行限流。比如有一个请求是http://localhost:8765/api-a//hello2?name=kevin,对相同的name值进行限流。我们设置了1分钟内,限流10次,那么如果1分钟内,name是kevin的请求超过10次,就会发生限流。

RateLimitKeyGenerator的实现:

测试

同时发送13个请求,其中name=kevin的有11次,name=marry的有2次,测试结果如下:

如何实现自定义注解

首先自定义注解实现接口限流,定义一个注解:

package com.guxiang.test;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
首先自定义一个 myTest注解
/**
 * @author guxiang
 * @date 2016年12月24日 下午10:22:11
 * 自定义的myTest注解
 */
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD,ElementType.ANNOTATION_TYPE})
public @interface MyTest {
    long time() default -1;
}

其次自定义注解实现接口限流,写一个类用于被myTest注解自定义注解实现接口限流,实现测试:

package com.guxiang.test;
public class SomeDaoImpl {
    public void save(){
        System.out.println("保存了数据");
    }
    public void update(){
        System.out.println("更新了数据");
    }
}

写一个测试类 这个类 引用myTest注解:

package com.guxiang.test;
public class SomeDaoImplTest {
    private SomeDaoImpl dao= new SomeDaoImpl();
    /**
     * 测试添加
     */
    @MyTest
    public void testAdd(){
        dao.save();
    }
    @MyTest
    public void testUpdate(){
        dao.update();
    }

最后自定义注解实现接口限流,写一个myTestRunner类使用反射实现注解的功能:

package com.guxiang.test;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
// 反射注解
public class MyTestRunner {
    public static void main(String[] args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, InstantiationException {
        Class clazz = SomeDaoImplTest.class;
        Method[] ms = clazz.getMethods();
        for (Method method : ms) {
            boolean hasMyTest = method.isAnnotationPresent(MyTest.class);
            if (hasMyTest) {
                method.invoke(clazz.newInstance(), null);
            }
        }
    }
}
关于自定义注解实现接口限流和接口限流怎么实现的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。 自定义注解实现接口限流的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于接口限流怎么实现、自定义注解实现接口限流的信息别忘了在本站进行查找喔。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:微服务网关腾讯云(腾讯云 网关)
下一篇:详解Java引用类型的参数也是值传递
相关文章

 发表评论

暂时没有评论,来抢沙发吧~