All Projects → jjj124 → Limiter

jjj124 / Limiter

Licence: apache-2.0
一个注解使你的SpringBoot项目获得分布式锁和限流器能力

Programming Languages

java
68154 projects - #9 most used programming language

Projects that are alternatives of or similar to Limiter

Eureka Consul Adapter
This project contains a Spring Boot Starter that registers HTTP endpoints on a Spring Cloud Eureka server to support Prometheus's service discovery mechanism for Consul (<consul_sd_config>)
Stars: ✭ 93 (+0%)
Mutual labels:  spring-boot, spring, spring-cloud
Devops Service
DevOps Service is the core service of Choerodon. It integrated several open source tools to automate the DevOps process of planning, coding, building, testing, and deployment, operation, monitoring.
Stars: ✭ 36 (-61.29%)
Mutual labels:  spring-boot, spring, spring-cloud
Localstack Spring Boot
Spring Boot AutoConfiguration for LocalStack
Stars: ✭ 22 (-76.34%)
Mutual labels:  spring-boot, spring, spring-cloud
Spring Cloud Consul
Spring Cloud Consul
Stars: ✭ 703 (+655.91%)
Mutual labels:  spring-boot, spring, spring-cloud
Web Development Interview With Java
Java 开发相关技术栈(大中厂)高频面试问题收录。
Stars: ✭ 69 (-25.81%)
Mutual labels:  spring-boot, spring, spring-cloud
Mica
Spring Cloud 微服务开发核心工具集。工具类、验证码、http、redis、ip2region、xss 等,开箱即用。 🔝 🔝 记得右上角点个star 关注更新!
Stars: ✭ 749 (+705.38%)
Mutual labels:  spring-boot, spring, spring-cloud
Jbone
jbone基于Spring Cloud框架开发,旨在为中小企业提供稳定的微服务解决方案,为开发人员提供基础开发骨架,jbone包含微服务中所有常用组件,例如注册中心、服务管理、服务监控、JVM监控、内存分析、调用链跟踪、API网关等等。业务功能包括系统权限的统一管理、单点登录、CMS、电商平台、工作流平台、支付平台等等。
Stars: ✭ 961 (+933.33%)
Mutual labels:  spring-boot, spring, spring-cloud
Spring Boot Klock Starter
基于redis的分布式锁组件,简单方便快捷接入项目,使项目拥有分布式锁能力
Stars: ✭ 546 (+487.1%)
Mutual labels:  lock, spring-boot, spring
Spring Cloud Study
开源书《跟我学Spring Cloud》的配套代码。讨论QQ群:731548893
Stars: ✭ 1,036 (+1013.98%)
Mutual labels:  spring-boot, spring, spring-cloud
Mini Platform
Mini-Platform致力于更简洁易用的轻量级微服务治理平台。
Stars: ✭ 45 (-51.61%)
Mutual labels:  spring-boot, spring, spring-cloud
Spring Boot Examples
about learning Spring Boot via examples. Spring Boot 教程、技术栈示例代码,快速简单上手教程。
Stars: ✭ 26,812 (+28730.11%)
Mutual labels:  spring-boot, spring, spring-cloud
Spring Cloud Cloudfoundry
Integration between Cloudfoundry and the Spring Cloud APIs
Stars: ✭ 83 (-10.75%)
Mutual labels:  spring-boot, spring, spring-cloud
Chaos Monkey Spring Boot
Chaos Monkey for Spring Boot
Stars: ✭ 646 (+594.62%)
Mutual labels:  spring-boot, spring, spring-cloud
Onetwo
一个基于spring和spring boot的快速开发框架……
Stars: ✭ 16 (-82.8%)
Mutual labels:  spring-boot, spring, spring-cloud
Spring Cloud Contract
Support for Consumer Driven Contracts in Spring
Stars: ✭ 569 (+511.83%)
Mutual labels:  spring-boot, spring, spring-cloud
Spring Cloud Examples
Examples of microservice instrastructures
Stars: ✭ 11 (-88.17%)
Mutual labels:  spring-boot, spring, spring-cloud
Spring Cloud Aws
Integration for Amazon Web Services APIs with Spring
Stars: ✭ 541 (+481.72%)
Mutual labels:  spring-boot, spring, spring-cloud
Spring Cloud Release
Spring Cloud Release Train - dependency management across a wide range of Spring Cloud projects.
Stars: ✭ 543 (+483.87%)
Mutual labels:  spring-boot, spring, spring-cloud
Spring Thrift Api Gateway
Gateway for Apache Thrift requests processing that is built on Spring Cloud stack
Stars: ✭ 38 (-59.14%)
Mutual labels:  spring-boot, spring, spring-cloud
Okta Blog Archive
Okta Developer Blog
Stars: ✭ 74 (-20.43%)
Mutual labels:  spring-boot, spring, spring-cloud

Limiter

Limiter是一款注解驱动的,适应于业务层面的分布式限流降级框架。Limiter可以使你的SpringBoot项目获得分布式锁和各种限流器能力,帮助你轻松解决业务层面的竞态条件问题,在不提高业务复杂度的同时增强接口的安全性。

Quick Start

添加依赖

<dependency>
	<groupId>site.higgs.limiter</groupId>
    	<artifactId>limiter-support</artifactId>
	<version>1.0-SNAPSHOT</version>
</dependency>

添加@EnableLimiter 注解

@SpringBootApplication
@EnableLimiter
public class Application {
	public static void main(String[] args) {
		SpringApplication.run(Application.class, args);
	}
}

How To Use

Lock组件为例

Step 0. 定义锁资源

下面的代码向BeanFactory中注册了一个BeanIdjdkLock的实例

@Bean
Lock jdkLock() {
    JdkLock jdkLock = new JdkLock("mnyJdkLock");
    return jdkLock;
}

Step 1. 编写业务接口

我们假设有这样一个业务场景,用户可以使用一个Vip兑换码来延长自己的VIP期限,理所当然的是,每个兑换码只能被使用一次,通常情况下,我们会在数据库中查询该兑换码是否存在并且是否已经使用。

@RequestMapping(method = RequestMethod.POST, value = "/exchangeVip")
public ResponseMessage exchangeVip(@RequestBody ExchangeVipRequest request) {
    return demoService.exchangeVip(request, ContextUtils.getCurrentUser());
}

Step 2.添加HLock注解

上面的接口并不安全,假如在极短的的时间内用户发起了多次相同兑换的请求,由于数据库的事务隔离特性,该兑换码便会被多次兑换,这个漏洞可能被用户恶意使用,造成损失。 这里涉及的重放攻击问题此处不再深入讨论,(欢迎移步我的博客)。现在我们添加HLock注解保护该接口。

@RequestMapping(method = RequestMethod.POST, value = "/exchangeVip")
@HLock(limiter = "jdkLock", key = "#request.vipCode", fallback = "fallbackToBusy")
public ResponseMessage exchangeVip(@RequestBody ExchangeVipRequest request) {
   return demoService.exchangeVip(request, ContextUtils.getCurrentUser());
}

该注解的含义是,在请求到达时,使用jdkLock这个锁锁住#request.vipCode这个资源,如果锁成功了,后面的逻辑继续进行,在业务逻辑完成后便会释放该资源,如果#request.vipCode这个资源已经被锁定,便会降级到fallbackToBusy方法进行。这样其他相同 #request.vipCode的请求便会被拦截,

在同一class下添加降级方法 fallbackToBusy

ResponseMessage fallbackToBusy(ExchangeVipRequest request) {
   return ResponseMessage.error("服务繁忙,请稍后再试!");
 }

Step 3. 使用分布式锁

随着业务发展,单实例应用不能再满足业务的需求,分布式改造开始了。上面的jdkLock是一个存储在内存的锁,这意味着切换到多实例环境后,仍然可能在多个实例上同时发起多个相同的请求。要解决这个问题,只需要将锁切换至分布式锁即可,这里我们以RedisLock为例。

注入一个RedisLock

@Bean
    Lock redisLock() {
        Config config = new Config();
        config.useSingleServer().setAddress("redis://127.0.0.1:6379")
                .setDatabase(1);
        RedissonClient redissonClient = null;
        try {
            redissonClient = Redisson.create(config);
        } catch (Exception e) {
            logger.info("redis连接失败");
         
        }
        logger.info("redis连接成功");
        RedisLock redisLock = new RedisLock(redissonClient, "myRedisLock");

        return redisLock;
}

修改注解

@HLock(limiter = "redisLock", key = "#request.vipCode", fallback = "fallback")

Step 4. star this niubility project

Document

FAQ

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].