zuul + ratelimit网关做限流(附录核心代码)

1、导入依赖
zuul.pom

         <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
        </dependency>

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        
        <!-- 计数器 -->
        <dependency>
            <groupId>com.marcosbarbero.cloud</groupId>
            <artifactId>spring-cloud-zuul-ratelimit</artifactId>
            <version>2.0.6.RELEASE</version>
        </dependency>
        
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>5.2.4.Final</version>
        </dependency>

如果不加hibernate的依赖,会报错

nested exception is javax.validation.NoProviderFoundException: Unable to create a Configuration, because no Jakarta Bean Validation provider could be found. Add a provider like Hibernate Validator (RI) to your classpath.

2、zuul.yml

zuul:
  routes:
    user: # user是网关里的路由名,自己起的
      path: /user/**
      serviceId: userService  #重定向的路由
    product:
      path: /product/**
      serviceId: productService
  # 配置限流
  ratelimit:
    enabled: true  #是否开启限流
    behind-proxy: true  #代理之后
    default-policy: #可选 - 针对所有的路由配置的策略,除非特别配置了policies
      limit: 3 #可选 - 每个刷新时间窗口对应的请求数量限制
      quota: 3 #可选-  每个刷新时间窗口对应的请求时间限制(秒)
      refresh-interval: 60 # 刷新时间窗口的时间,默认值 (秒)
      type: #可选 限流方式
        - url
    policies:  # user是网关里的路由名,自己起的
      user:
        limit: 2
        quota: 2
        efresh-interval: 60

3、分别启动zuul和user服务,然后连续调user服务下的接口,第三次的时候会出现这个页面
在这里插入图片描述
4、上面的提示不太友好,怎们可以改写一下,网关里写一个控制器
ErrorController.java

@RestController
public class ErrorHander implements ErrorController {
    @Override
    public String getErrorPath() {
        return "error";
    }

     //自定义的异常信息方法
    @RequestMapping(value = "error")
    public Map<String, Object> error() {
        Map<String, Object> map = new HashMap<>();
        map.put("msg", "计数器访问限流");              //提示信息
        map.put("code", 401);                        // 错误码
        return map;
    }
}

再次连续访问user服务里的接口,就会变成这样,自定义的返回结果样式可以自己修改
在这里插入图片描述
这里指定user服务下的限流策略是通过url的方式,就是在刷新时间内,调用user服务下接口的总次数,即使是多节点的,也是一样,我自己已经测过。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Zuul中使用WebSocket和SockJS,您需要进行以下配置: 1. 添加依赖项 ```xml <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-zuul</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-zuul-websocket</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency> ``` 2. 配置Zuul路由 ```yml zuul: routes: websocket: path: /websocket/** url: ws://localhost:8081 ``` 这将把所有以“/websocket”开头的请求路由到WebSocket服务器上。 3. 配置SockJS ```java @Configuration @EnableWebSocketMessageBroker public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer { @Override public void configureMessageBroker(MessageBrokerRegistry config) { config.enableSimpleBroker("/topic"); config.setApplicationDestinationPrefixes("/app"); } @Override public void registerStompEndpoints(StompEndpointRegistry registry) { registry.addEndpoint("/websocket").setAllowedOrigins("*").withSockJS(); } } ``` 这将配置一个SockJS端点,它将处理所有以“/websocket”开头的请求,并使用简单的代理模式将消息转发到“/topic”目的地。 4. 启用Zuul ```java @SpringBootApplication @EnableZuulProxy public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` 这将启用Zuul代理,并将它们路由到相应的WebSocket服务器和SockJS端点。 现在,您应该可以在Zuul中使用WebSocket和SockJS了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值