zuul 网关的用途_Zuul网关

2022-09-22 20:21:31 浏览数 (1)

大家好,又见面了,我是你们的朋友全栈君。

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

0 人点赞