当前位置: 首页 > news >正文

网站开发的软件支持在线购物系统的分析与设计

网站开发的软件支持,在线购物系统的分析与设计,商场网站开发,网站做的不满意上一篇记录了gateway网关的基础功能和配置#xff0c;并且使用了默认的限流功能。 springcloud gateway网关-CSDN博客 这里简单记录一下gateway网关集成mybatisPlus实现动态限流。gateway网关默认的限流方式各项限流参数都是在配置文件中配置#xff0c;不够灵活#xff0…上一篇记录了gateway网关的基础功能和配置并且使用了默认的限流功能。 springcloud gateway网关-CSDN博客 这里简单记录一下gateway网关集成mybatisPlus实现动态限流。gateway网关默认的限流方式各项限流参数都是在配置文件中配置不够灵活虽然使用阿里的Sentinel组件可以实现从nacos注册中心、配置中心动态读取配置但是还是有一定的局限性。 有些业务上需要限流功能可以在平台的页面上进行灵活配置并且实时生效。 大致流程数据库添加一个流控表有需要限流的URL最大限流限制数、时间范围等字段。通过页面维护这个表的数据。gateway中写一个全局过滤器中收到请求后用URL去数据库中查询、或者从缓存查询得到需要限制的参数再调用写好的限流方法实现限流。限流方法用Redis的Zset数据结构实现的滑动窗口算法当然也可以用其他的限流算法。 下面的配置是基于上一篇文章的代码来实现。 一、pom文件中添加依赖 mybatisPlus相关依赖 !-- 数据库驱动 --dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion8.0.27/version/dependency!-- druid数据库连接池 --dependencygroupIdcom.alibaba/groupIdartifactIddruid-spring-boot-starter/artifactIdversion1.2.16/version/dependency!-- mybatis-plus --dependencygroupIdcom.baomidou/groupIdartifactIdmybatis-plus-boot-starter/artifactIdversion3.5.1/version/dependency!-- druid数据库连接池 需要用到该依赖 ,否则启动报错--dependencygroupIdjavax.servlet/groupIdartifactIdjavax.servlet-api/artifactIdversion4.0.1/versionscopeprovided/scope/dependency 二、配置文件 server:port: 8089spring:application:name: gatewaydatasource:url: jdbc:mysql://127.0.0.1:3306/test-db?characterEncodingUTF-8useUnicodetrueuseSSLfalsetinyInt1isBitfalseallowPublicKeyRetrievaltrueserverTimezoneAsia/Shanghaiusername: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Drivertype: com.alibaba.druid.pool.DruidDataSourcedruid: # 全局druid参数绝大部分值和默认保持一致。(现已支持的参数如下,不清楚含义不要乱设置)# 连接池的配置信息# 初始化大小最小最大initial-size: 5min-idle: 5maxActive: 20# 配置获取连接等待超时的时间maxWait: 60000# 配置间隔多久才进行一次检测检测需要关闭的空闲连接单位是毫秒timeBetweenEvictionRunsMillis: 60000# 配置一个连接在池中最小生存的时间单位是毫秒minEvictableIdleTimeMillis: 300000validationQuery: SELECT 1testWhileIdle: truetestOnBorrow: falsetestOnReturn: false# 打开PSCache并且指定每个连接上PSCache的大小poolPreparedStatements: truemaxPoolPreparedStatementPerConnectionSize: 20# 配置监控统计拦截的filters去掉后监控界面sql无法统计wall用于防火墙#filters: stat,wall,slf4j# 通过connectProperties属性来打开mergeSql功能慢SQL记录connectionProperties: druid.stat.mergeSql\true;druid.stat.slowSqlMillis\5000webStatFilter:enabled: true########## Redis ############redis:database: 0host: 127.0.0.1port: 6379password:########## gateway 相关配置 ############cloud:gateway:routes:- id: service-01uri: http://127.0.0.1:8080predicates:- Path/svs1/**filters:- StripPrefix1 # 去掉path前缀1代表去掉第一个- name: RequestRateLimiterargs:redis-rate-limiter.replenishRate: 1 #令牌桶每秒填充数redis-rate-limiter.burstCapacity: 1 #令牌容量key-resolver: #{apiKeyResolver} # 限流策略对应配置中的Bean- id: service-02uri: http://127.0.0.1:8080predicates:- Path/svs2/**filters:- StripPrefix1#mybatis plus 设置 mybatis-plus:mapper-locations: classpath:mapper/*.xmlglobal-config:# 关闭MP3.0自带的bannerbanner: falsedb-config:#主键类型 0:数据库ID自增,1:该类型为未设置主键类型, 2:用户输入ID,3:全局唯一ID (数字类型唯一ID), 4:全局唯一ID UUID,5:字符串全局唯一ID (idWorker 的字符串表示);id-type: AUTO# 默认数据库表下划线命名table-underline: trueconfiguration:# 这个配置会将执行的sql打印出来在开发或测试的时候可以用log-impl: org.apache.ibatis.logging.stdout.StdOutImpl# 返回类型为Map,显示null对应的字段call-setters-on-nulls: true三、相关代码 1redis工具类 package com.zhh.gateway.common.util;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.ZSetOperations; import org.springframework.stereotype.Component;import java.util.concurrent.TimeUnit;/*** Description: Redis缓存* Author: zhaoheng* CreateTime: 2024-03-13 21:10*/ Component public class RedisCache {public static final String SYS_PREFIX gateway:;Autowiredprivate RedisTemplate redisTemplate;public String getZSetKey(String key) {return SYS_PREFIX zset: key;}/*** zSet数据结构添加数据* param key 唯一标识* param value 值* param score 分值用于排序* param expireTime 过期时间单位秒* param T*/public T void zSetAdd(String key, T value, double score, long expireTime) {key getZSetKey(key);ZSetOperations zSetOps redisTemplate.opsForZSet();zSetOps.add(key, value, score);zSetOps.getOperations().expire(key, expireTime, TimeUnit.SECONDS);}/*** 删除指定范围内的数据* param key 唯一标识* param min 最小值* param max 最大值* return*/public Long zSetRemoveRangeByScore(String key, double min, double max) {return redisTemplate.opsForZSet().removeRangeByScore(getZSetKey(key),min,max);}/*** 统计数据总量* param key 唯一标识* return*/public Long zSetCountAll(String key) {return redisTemplate.opsForZSet().zCard(getZSetKey(key));} }2限流过滤器实现 核心就是Redis实现的滑动窗口的限流算法 package com.zhh.gateway.filter;import com.zhh.gateway.common.util.RedisCache; import com.zhh.gateway.pojo.ApiLimiterPO; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.gateway.filter.GatewayFilterChain; import org.springframework.cloud.gateway.filter.GlobalFilter; import org.springframework.core.Ordered; import org.springframework.stereotype.Component; import org.springframework.web.server.ServerWebExchange; import reactor.core.publisher.Mono;/*** Description: 全局过滤器 限流过滤器* Author: zhaoheng* CreateTime: 2024*/ Slf4j Component public class ApiLimiterFilter implements GlobalFilter, Ordered {Autowiredprivate RedisCache redisCache;SneakyThrowsOverridepublic MonoVoid filter(ServerWebExchange exchange, GatewayFilterChain chain) {String url exchange.getRequest().getPath().value();log.info(request url:{}, url);// TODO 从请求头或cookie中获取签名解析得到用户唯一标识String userId zs;this.apiLimiterByUser(url, userId);return chain.filter(exchange);}/*** IApiLimiterService* 过滤器执行顺序值越小越靠前** return*/Overridepublic int getOrder() {return 0;}/*** 根据用户唯一标识限流** param reqUrl 请求* param userId 用户唯一标识* throws Exception*/public void apiLimiterByUser(String reqUrl, String userId) throws Exception {// TODO 根据URL从数据库中查询限流相关配置//ApiLimiterPO apiLimiterPO iApiLimiterService.getByUrl(reqUrl);// 模拟从数据库中查询到的数据ApiLimiterPO apiLimiterPO ApiLimiterPO.builder().apiUrl(/api/v1.0/user/query)// 限流1秒钟最多2个请求.rangeTime(1).limitMax(2).build();// 没有查询到数据说明该接口没有配置限流if (null apiLimiterPO) {log.info(无需限流,url:{}, reqUrl);return;}log.info(apiLimiterPO:{}, apiLimiterPO.toString());// 根据用户id限流String key xl: userId;// 时间窗口大小 限流【rangeTime】秒钟最多【limitMax】个请求int rangeTime apiLimiterPO.getRangeTime();// 流量大小int limitMax apiLimiterPO.getLimitMax();// 当前时间long now System.currentTimeMillis();// Redis实现滑动窗口算法 删除【rangeTime】秒之前的数据redisCache.zSetRemoveRangeByScore(key, 0, now - (rangeTime * 1000));// 添加请求数据到Redis设置过期时间redisCache.zSetAdd(key, now, now, 60 * 60);// 统计总数据量Long sum redisCache.zSetCountAll(key);if (sum limitMax) {// TODO 一般都是自定义异常然后全局异常处理器再统一返回错误信息给调用端throw new Exception(请稍后再试);}} }这就完事 读取数据库相关的简单业务代码就不做过多展示了具体细节也是根据业务而定这里只记录一下实现思路和核心流控代码。
http://www.hkea.cn/news/14582853/

相关文章:

  • 广东峰凌建设有限公司网站手机版网页制作
  • 丰台网站制作公司网站建设案例教程视频
  • 鞍山做网站优化网上做衣服的网站
  • ext做的网站有那些怎么做一个手机网站
  • 江苏广兴建设集团网站苏州网站建设开发公司
  • 网站备案要营业执照原件吗网站文章展示是做怎么
  • 重庆网站建站价格个人简历自我介绍200字
  • 网站开发专业有哪些网站开发前端需要学什么
  • 百度做网站续费费用单页网站作用是什么
  • 做旅游计划的网站兰州新区小程序建站
  • 广东泰通建设有限公司网站网站建设有哪些文件
  • 网站源码安全吗商标注册多少钱
  • 电子商务网站采用的开发技术如何零基础做网站
  • 汉中免费做网站公司品牌营销与推广
  • 那几家是做失物招领的网站asp.net网站开发案例
  • 权4网站怎么做企业邮箱是啥
  • 集团微信网站方案策划wordpress影视解析插件
  • 深圳英文网站建设网站是做流程
  • 一个空间2个网站代码东莞平面设计公司有哪些
  • 做国际贸易网站哪家好山西+网站建设
  • 专门找图片素材的网站网络设置的网站
  • 做公司网站的好处为什么都说2024年房价降
  • 青岛网站制作需要多少钱湖南建筑信息平台
  • python建立简易网站六安电子商务网站建设
  • 卫浴外贸版网站案例wordpress文章摘要字数
  • 凡科建站视频教程wordpress英文转中文
  • 在哪一个网站做社保申报我要自学网python
  • 陕西省高速集团建设网站临沂百度代理公司有几个
  • js特效网站模板下载郑州建设网站设计
  • 做一个二手网站怎么做建筑设计公司名字起名大全