SpringCloud学习第三天
使用zuul实现路由代理
在父工程下新家gateway(网关)子项目,使用zuul后,以后路由的访问都要经过zuul,想要访问localhost:8081/user/1的服务,需要如下配置
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
</dependencies>
启动类
@EnableZuulProxy // 使用zuul
@SpringBootApplication
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class);
}
}
yml
server:
port: 10010
zuul:
routes:
user-service: # key:可随意取
path: /user-service/** # 匹配的路径
url: http://127.0.0.1:8081 # 代理的url
启动user-service、gateway项目,访问zuul的服务 localhost:10010/user-service/user/1,可以返回user信息。问题:zuul中配置的服务匹配路径url写死了,也无法实现负载均衡,优化:zull向Eureka动态拉取服务。
将zuul加入注册中心
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- 注意不要导错包,否则会找不到Eureka中的服务。自己也不会显示在服务列表中 -->
</dependencies>
yml
server:
port: 10010
spring:
application:
name: gateway
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10001/eureka
zuul:
routes:
user-service: # key:可随意取
path: /user-service/** # 匹配的路径
serviceId: user-service # 这里改成serviceId,实现负载均衡
# 简化配置
zuul:
routes:
user-service: /user-service/** # 服务名称:匹配路径
访问 localhost:10010/user-service/user/1可以获取到user-service提供的 user信息。
没有配置consumer-client路径,直接访问localhost:10010/consumer-client/consumer/1也可以访问到接口数据,原因是zuul会拉取Eureka所有的服务,默认配置好。
忽略部分服务,不对外暴露,使用如下配置
zuul:
ignored-services:
- consumer-client # 是个集合,可配多个
再次访问localhost:10010/consumer-client/consumer/1就会报错;
不去除路由匹配的前缀的配置:
zuul:
routes:
user-service: # key:可随意取
path: /user/** # 匹配的路径
serviceId: user-service # 这里改成serviceId,实现负载均衡
strip-prefix: false # 不去除路由匹配的前缀,局部
prefix: /api # 添加全局前缀
strip-prefix: true # 全局去除/api
不加strip-prefix,需要访问localhost:10010/user/user/1,加上访问localhost:10010/user/1即可。
过滤器
filerType 四种过滤类型
pre:前置过滤器,请求在进入路由之前执行
routing:路由过滤器,在路由请求时调用
post:后置过滤器
error:错误过滤器
自定义拦截器需要继承ZuulFilter,复写四个方法,如下一个简单的登录拦截过滤器
/**
* 实现登录过滤器
*/
@Component
public class LoginFilter extends ZuulFilter {
// 过滤器类型
@Override
public String filterType() {
return FilterConstants.PRE_TYPE;
}
// 过滤器顺序
@Override
public int filterOrder() {
return FilterConstants.PRE_DECORATION_FILTER_ORDER - 1;
}
// 是否过滤
@Override
public boolean shouldFilter() {
return true;
}
// 过滤器逻辑
@Override
public Object run() throws ZuulException {
// 获取request
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
// 获取参数
String token = request.getParameter("token");
// 判断是否存在
if(StringUtils.isBlank(token)){
// 拦截
ctx.setSendZuulResponse(false);
ctx.setResponseStatusCode(HttpStatus.FORBIDDEN.value());
}
return null;
}
}
重启zuul服务,请求localhost:10010/user-service/user/1,访问被拒绝,返回403,请求路径上带上token,localhost:10010/user-service/user/1?token="1"即可访问。
zuul中默认集成了Ribbon和Hystix,可修改默认配置
hystrix:
command:
default: #全局配置服务降级处理超时时长
execution:
isolation:
thread:
timeoutInMilliseconds: 6000
ribbon:
ReadTimeout: 5000 # 读取数据超时
ConnectTimeout: 5000 # 连接超时
标签:zuul,service,SpringCloud,学习,user,过滤器,10010,localhost
From: https://www.cnblogs.com/meer/p/17512611.html