大家好,又见面了,我是你们的朋友全栈君。
Zuul的主要作用:
1.路由,进行请求转发。
2.鉴权,进行身份认证(安全)。
3.限流,限制访问的数量,保证服务器的稳定。
除此之外还有以下作用
4.负载均衡。
5.压力测试。
6.监控
1.Zuul简单使用
1.添加依赖
org.springframework.cloud
spring-cloud-starter-netflix-zuul
2.添加@EnableZuulProxy 注解
@EnableZuulProxy
@SpringBootApplication
@EnableDiscoveryClient
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class,args);
}
}
3.配置路由地址
a.配置写死的地址
zuul:
routes:
user:
path: /user/**
url: http://127.0.0.1:8083
b.结合eureka,动态拉取服务列表,根据服务id找到对应的url。
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka
zuul:
routes:
user:
path: /user-service/**
serviceId: user-service
c.简化版配置,routes的key是服务id,值是映射的地址
zuul:
routes:
user-service: /user-service/**
d.Zuul默认为从eureka拉取服务列表中的所有服务配置了key=服务名,值为 /服务名/** 的routes。也就是说即使不做任何配置,也可以匹配服务名进行访问服务。
e.某些服务不需要Zuul的默认配置,做以下配置做过滤。
ignored-services:
– customer-service
f.若想去除路由前缀,可做以下配置。strip-prefix: false
zuul:
routes:
#user-service: /user-service/**
user:
path: /user/**
serviceId: user-service
strip-prefix: false
2.ZuulFilter简介
Zuul最重要的一个功能是实现请求的鉴权,而Zuul实现的方式是通过过滤器,ZuulFilter则是这些过滤器的顶级父类,其中有四个最重要的方法。
//过滤器类型
public abstract String filterType();
//过滤器优先级
public abstract int filterOrder();
//是否启用过滤器
boolean shouldFilter();
//过滤逻辑
Object run() throws ZuulException;
其中,Zuul的过滤器类型主要有四种,也代表着ZuulFilter的生命周期
pre:请求在路由被执行之前
routing:在路由请求时调用
post:在routing和error过滤器之后调用
error:处理请求时发生错误时调用
自定义一个过滤器,程式如下
@Component
public class LoginFilter extends ZuulFilter {
//过滤器类型,分为pre(处理请求头,身份验证等),routing(路由转发),post(路由转发后的处理),error(处理请求时发生错误时调用)
@Override
public String filterType() {
return FilterConstants.PRE_TYPE;
}
//优先级
@Override
public int filterOrder() {
return FilterConstants.SERVLET_DETECTION_FILTER_ORDER-1;
}
//是否启动过滤拦截
@Override
public boolean shouldFilter() {
return true;
}
//拦截的逻辑
@Override
public Object run() throws ZuulException {
RequestContext context = RequestContext.getCurrentContext();
HttpServletRequest request =context.getRequest();
String token = request.getParameter(“access-token”);
if (StringUtils.isBlank(token)){
context.setSendZuulResponse(false);
context.setResponseStatusCode(HttpStatus.FORBIDDEN.value());
}
return null;
}
}
3. Zuul的负载均衡和熔断机制
Zuul集成了Ribbon和Hystrix,只需要做简单的配置,就可以实现负载均衡和熔断机制。需要注意的是,hystrix的超时时长要大于RIbbon的超时时长。另外,Zuul中Ribbon的超时时长计算公式如下
ribbonTimeout = (ribbonReadTimeout ribbonConnectTimeout) * (maxAutoRetries 1) * (maxAutoRetriesNextServer 1);
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 6000
ribbon:
ConnectionTimeOut: 500
ReadTimeOut: 2000
4.Zuul的高可用性
Zuul作为微服务,可以启动多台Zuul,自动注册到eureka上,形成集群。通常可搭配Ngnix服务网关来使用,来实现对Zuul集群的负载均衡调用。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/170617.html原文链接:https://javaforall.cn