SpringCloud之服务限流与熔断,入职3个月的Java程序员面临转正

每秒请求数,就是说服务器在一秒的时间内处理了多少个请求。

②、提高带宽

阿里云不同主机的价格:

 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开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

最后

俗话说,好学者临池学书,不过网络时代,对于大多数的我们来说,我倒是觉得学习意识的觉醒很重要,这是开始学习的转折点,比如看到对自己方向发展有用的信息,先收藏一波是一波,比如如果你觉得我这篇文章ok,先点赞收藏一波。这样,等真的沉下心来学习,不至于被找资料分散了心神。慢慢来,先从点赞收藏做起,加油吧!

另外,给大家安排了一波学习面试资料:

image

image

以上就是本文的全部内容,希望对大家的面试有所帮助,祝大家早日升职加薪迎娶白富美走上人生巅峰!
大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-NSKtj41n-1711961169748)]

最后

俗话说,好学者临池学书,不过网络时代,对于大多数的我们来说,我倒是觉得学习意识的觉醒很重要,这是开始学习的转折点,比如看到对自己方向发展有用的信息,先收藏一波是一波,比如如果你觉得我这篇文章ok,先点赞收藏一波。这样,等真的沉下心来学习,不至于被找资料分散了心神。慢慢来,先从点赞收藏做起,加油吧!

另外,给大家安排了一波学习面试资料:

[外链图片转存中…(img-zEWycDPn-1711961169748)]

[外链图片转存中…(img-AsZNisbD-1711961169749)]

以上就是本文的全部内容,希望对大家的面试有所帮助,祝大家早日升职加薪迎娶白富美走上人生巅峰!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值