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服务下接口的总次数,即使是多节点的,也是一样,我自己已经测过。