每秒请求数,就是说服务器在一秒的时间内处理了多少个请求。
②、提高带宽
阿里云不同主机的价格:
3、Gateway限流的实现
①、修改版本号,导入依赖
<spring-boot.version>2.3.7.RELEASE</spring-boot.version>
<spring-cloud.version>Hoxton.SR5</spring-cloud.version>
<spring-cloud-alibaba.version>2.1.1.RELEASE</spring-cloud-alibaba.version>
Spring Cloud Gateway官方提供了RequestRateLimiterGatewayFilterFactory流量控制器类,使用redis和lua脚本来实现令牌桶的方式。
org.springframework.boot
spring-boot-starter-data-redis-reactive
②、打开redis,添加redis配置
Gateway通过内置的RequestRateLimiter过滤器实现限流,使用令牌桶算法,借助Redis保存中间数据。用户可通过自定义KeyResolver设置限流维度。
Ⅰ、对请求的目标URL进行限流
Ⅱ、对来源IP进行限流
Ⅲ、特定用户进行限流
添加redis配置
redis:
host: 127.0.0.1
port: 6379
password: root123
database: 0
如果redis连接失败,限流功能将不能开启。因为没有redis作为容器来保存令牌,限流功能自然就失效了。
可以将redis的配置信息保存到nacos中,通过添加nacos配置中心客户端的方式进行读取
③、请求限流配置RequestRateLimiterConfig
package com.gateway.code;
import org.springframework.cloud.gateway.filter.ratelimit.KeyResolver;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import reactor.core.publisher.Mono;
/**
- 请求限流配置
*/
@SuppressWarnings(“all”)
@Configuration
public class RequestRateLimiterConfig {
/**
- 按IP来限流
*/
@Bean
@Primary
public KeyResolver ipAddrKeyResolver() {
return exchange -> Mono.just(exchange.getRequest().getRemoteAddress().getAddress().getHostAddress());
}
/**
- 按用户限流
*/
@Bean
KeyResolver userKeyResolver() {
return exchange -> Mono.just(exchange.getRequest().getQueryParams().getFirst(“user”));
}
/**
-
按URL限流,即以每秒内请求数按URL分组统计,超出限流的url请求都将返回429状态
-
@return
*/
@Bean
KeyResolver apiKeyResolver() {
return exchange -> Mono.just(exchange.getRequest().getPath().toString());
}
}
④、添加限流配置
将DynamicRoutingConfig文件内的conmponent注解取消,也就是取消之前的自定义配置
filters:
- name: RequestRateLimiter
args:
#用于限流的键的解析器的 Bean 对象的名字,使用 SpEL表达式根据#{@beanName}获取Bean对
象
key-resolver: ‘#{@ipAddrKeyResolver}’
#令牌桶填充速率,允许用户每秒处理多少个请求
redis-rate-limiter.replenishRate: 10
#令牌桶总容量,允许在一秒钟内完成的最大请求数
redis-rate-limiter.burstCapacity: 20
pom文件:
server:
#此处的8084端口号,就好像以前外置的tomcat的8080,让我们通过浏览器进行访问
#但此服务只是做了一个路由,它会将请求路由到其它微服务(一般是消费者)进行处理
port: 8084
spring:
application:
#微服务名
name: gateway
redis:
host: 47.100.191.44
port: 6379
password: xiaoli_redis
database: 0
cloud:
nacos:
discovery:
#指定nacos注册中心的地址
server-addr: 127.0.0.1:8848
gateway:
discovery:
locator:
以前:localhost:8082/user/aa
路由:localhost:8084/consumer/user/aa
路由:localhost:8084/provider/user/aa
#是否与服务发现组件进行结合,通过service-id(必须设置成大写)转发到具体的服务实例。默认false
#为true代表开启基于服务发现的路由规则。
enabled: false
#配置之后访问时service-id无需大写
lower-case-service-id: true
routes: #路由
路由标识(id:标识,具有唯一性)
- id: user-consumer-api
#目标服务地址(uri:地址,请求转发后的地址),会自动从注册中心获得服务的IP,不需要手动写死
uri: lb://consumer
#优先级,越小越优先
#order: 999
#路由条件(predicates:断言)
predicates:
路径匹配,
localhost:8082/user/aa 不能进入
localhost:8082/cum/user/aa 能
- Path=/cum/**
filters: #过滤器
#路径前缀删除示例:请求/name/bar/foo,StripPrefix=2,去除掉前面两个前缀之后,最后转发到目标服务的路径为/foo
#前缀过滤,请求地址:http://localhost:8084/usr/hello
#此处配置去掉1个路径前缀,再配置上面的 Path=/usr/,就将转发到指定的微服务
#因为这个api相当于是服务名,只是为了方便以后nginx的代码加上去的,对于服务提供者service-client来说,不需要这段地址,所以需要去掉
-
StripPrefix=1
-
name: RequestRateLimiter
args:
#用于限流的键的解析器的 Bean 对象的名字,使用 SpEL表达式根据#{@beanName}获取Bean对象
key-resolver: ‘#{@ipAddrKeyResolver}’
#令牌桶填充速率,允许用户每秒处理多少个请求
redis-rate-limiter.replenishRate: 10
#令牌桶总容量,允许在一秒钟内完成的最大请求数
redis-rate-limiter.burstCapacity: 20
- name: Hystrix
args:
name: fallback
fallbackUri: forward:/fallback
#生产者
路由标识(id:标识,具有唯一性)
- id: user-provider-api
#目标服务地址(uri:地址,请求转发后的地址),会自动从注册中心获得服务的IP,不需要手动写死
uri: lb://provider
#优先级,越小越优先
#order: 999
#路由条件(predicates:断言)
predicates:
路径匹配,
- Path=/api/prv/**
filters:
#路径前缀删除示例:请求/name/bar/foo,StripPrefix=2,去除掉前面两个前缀之后,最后转发到目标服务的路径为/foo
#前缀过滤,请求地址:http://localhost:8084/usr/hello
#此处配置去掉1个路径前缀,再配置上面的 Path=/usr/,就将转发到指定的微服务
#因为这个api相当于是服务名,只是为了方便以后nginx的代码加上去的,对于服务提供者service-client来说,不需要这段地址,所以需要去掉
-
StripPrefix=2
-
name: Hystrix
args:
name: fallback
fallbackUri: forward:/fallback
logging:
level:
#开启spring-Cloud-gateway的日志级别为debug,方便debug调试
org.springframework.cloud.gateway: trace
org.springframework.http.server.reactive: debug
org.springframework.web.reactive: debug
reactor.ipc.netty: debug
#springboot监控Actuator,暴露所有端点
management:
endpoints:
web:
exposure:
include: ‘*’
#自定义配置
gateway:
nacos:
#配置中心地址
server-addr: ${spring.cloud.nacos.discovery.server-addr}
#指定环境
namespace: xxx-xx-xx-xx
#读取配置管理中的Data Id
data-id: dynamic-routing.json
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
最后
俗话说,好学者临池学书,不过网络时代,对于大多数的我们来说,我倒是觉得学习意识的觉醒很重要,这是开始学习的转折点,比如看到对自己方向发展有用的信息,先收藏一波是一波,比如如果你觉得我这篇文章ok,先点赞收藏一波。这样,等真的沉下心来学习,不至于被找资料分散了心神。慢慢来,先从点赞收藏做起,加油吧!
另外,给大家安排了一波学习面试资料:
以上就是本文的全部内容,希望对大家的面试有所帮助,祝大家早日升职加薪迎娶白富美走上人生巅峰!
大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-NSKtj41n-1711961169748)]
最后
俗话说,好学者临池学书,不过网络时代,对于大多数的我们来说,我倒是觉得学习意识的觉醒很重要,这是开始学习的转折点,比如看到对自己方向发展有用的信息,先收藏一波是一波,比如如果你觉得我这篇文章ok,先点赞收藏一波。这样,等真的沉下心来学习,不至于被找资料分散了心神。慢慢来,先从点赞收藏做起,加油吧!
另外,给大家安排了一波学习面试资料:
[外链图片转存中…(img-zEWycDPn-1711961169748)]
[外链图片转存中…(img-AsZNisbD-1711961169749)]
以上就是本文的全部内容,希望对大家的面试有所帮助,祝大家早日升职加薪迎娶白富美走上人生巅峰!