目录
- Zuul 简介
- 配置
- 依赖配置
- 启动类配置
- 配置文件配置
- 本地配置 application.properties
- 远程配置 bootstrap.properties
- 获取路由规则的接口
- zuul过滤器
- 执行流程
- 示例
Zuul 简介
Zuul 是分布式 SpringCloud 项目的流量入口,理论上所有进入到微服务系统的请求都要经过 Zuul 来过滤和路由。
网关的职责:
- 统一入口为全部微服务提供唯一入口点,网关起到外部和内部隔离,保障了后台服务的安全性
- 鉴权棱验:识别每个请求的权限,拒绝不符合要求的请求
- 动态路由:动态的将请求路由到不同的后端集群中。
配置
依赖配置
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
<!--健康监控-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--注册到Eureka-->
<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-config</artifactId>
<version>LATEST</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
启动类配置
启动类上打上注解
@EnableZuulProxy
如果要配置到分布式配置中心,在启动类里加上
@Bean
@RefreshScope
@ConfigurationProperties("zuul")
@Primary
public ZuulProperties zuulProperties() {
return new ZuulProperties();
}
配置文件配置
本地配置 application.properties
spring.application.name=micro-zuul
server.port=7070
eureka.client.serviceUrl.defaultZone=http://admin:admin@localhost:8763/eureka/
# 使用路径方式匹配路由规则。
# 参数key结构: zuul.routes.customName.path=xxx
# 用于配置路径匹配规则。
# 其中customName自定义。通常使用要调用的服务名称,方便后期管理
# 可使用的通配符有: * ** ?
# ? 单个字符
# * 任意多个字符,不包含多级路径
# ** 任意多个字符,包含多级路径
zuul.routes.micro-web.path=/web/**
# 参数key结构: zuul.routes.customName.url=xxx
# url用于配置符合path的请求路径路由到的服务地址。
#zuul.routes.micro-order.url=http://localhost:8080/
# key结构 : zuul.routes.customName.serviceId=xxx
# serviceId用于配置符合path的请求路径路由到的服务名称。
zuul.routes.micro-web.serviceId=micro-web-no
#zuul.routes.micro-web1.path=/web/path/**
#zuul.routes.micro-web1.serviceId=micro-web-no
# ignored service id pattern
# 配置不被zuul管理的服务列表。多个服务名称使用逗号','分隔。
# 配置的服务将不被zuul代理。
#zuul.ignored-services=eureka-application-service
# 此方式相当于给所有新发现的服务默认排除zuul网关访问方式,只有配置了路由网关的服务才可以通过zuul网关访问
# 通配方式配置排除列表。
zuul.ignored-services=*
# 通配方式配置排除网关代理路径。所有符合ignored-patterns的请求路径都不被zuul网关代理。
zuul.ignored-patterns=/**/local/**
# prefix URL pattern 前缀路由匹配
# 配置请求路径前缀,所有基于此前缀的请求都由zuul网关提供代理。
#zuul.prefix=/api
management.endpoints.web.exposure.include=*
# http://localhost:6060/actuator/hystrix.stream
#针对某个服务传输指定的headers信息 ,默认是过滤掉 Cookie,Set-Cookie,Authorization 这三个信息的
#这里置空就是不要过滤掉这三个
zuul.routes.micro-web.sensitive-headers=
#指定全局的headers传输,对所有路由的微服务
#zuul.sensitive-headers=Cookie,Set-Cookie,Authorization
#添加host头信息,标识最初的服务端请求地址
zuul.add-host-header=true
#默认添加 X-Forwarded-*头域
zuul.add-proxy-headers=true
zuul.routes.zuul-server.path=/local/**
zuul.routes.zuul-server.url=forward:/local
#全局关闭重试
zuul.retryable=false
#关闭该服务的重试
zuul.routes.micro-web.retryable=false
#请求连接的超时时间
ribbon.ConnectTimeout=2000
#请求处理的超时时间
ribbon.ReadTimeout=10000
#全局超时时间
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=100000
远程配置 bootstrap.properties
eureka.client.serviceUrl.defaultZone=http://admin:admin@localhost:8763/eureka/
spring.cloud.config.profile=dev
spring.cloud.config.label=master
#这种配置是configserver还单机情况,直接连接这个单机服务就行
#spring.cloud.config.uri=http://localhost:8085/
#configserver高可用配置
开启config-server服务发现功能
spring.cloud.config.discovery.enabled=true
#服务发现的服务名称
spring.cloud.config.discovery.service-id=config-server
#如果连接不上获取配置有问题,快速响应失败
spring.cloud.config.fail-fast=true
#默认重试的间隔时间,默认1000ms
spring.cloud.config.retry.multiplier=1000
#下一间隔时间的乘数,默认是1.1
#spring.cloud.config.retry.initial-interval=1.1
#最大间隔时间,最大2000ms
spring.cloud.config.retry.max-interval=2000
#最大重试次数,默认6次
spring.cloud.config.retry.max-attempts=6
spring.rabbitmq.host=127.0.0.1
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
management.endpoints.web.exposure.include=*
#请求连接的超时时间
ribbon.ConnectTimeout=2000
#请求处理的超时时间
ribbon.ReadTimeout=10000
#全局超时时间
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=100000
远程仓库要配置 api-gateway.properties,全部配置 zuul. 开头的配置就可以了。
获取路由规则的接口
http://localhost:7070/actuator/routes
zuul过滤器
Zuul 大部分功能都是通过过滤器来实现的,Zuul 定义了4种标准的过滤器类型,这些过滤器类型对应于请求的典型生命周期。
- pre: 这种过滤器在请求被路由之前调用。可利用这种过滤器实现身份验证、在集群中选择请求的微服务,记录调试信息等。
- routing: 这种过滤器将请求路由到微服务。这种过滤器用于构建发送给微服务的请求,并使用apache httpclient 或 netflix ribbon请求微服务。
- post: 这种过滤器在路由到微服务以后执行。这种过滤器可用来为响应添加标准的 http header、收集统计信息和指标、将响应从微服务发送给客户端等。
- error: 在其他阶段发送错误时执行该过滤器。
执行流程
示例
@Slf4j
@Component
public class AccessFilter extends ZuulFilter {
@Override
public String filterType() {
return FilterConstants.PRE_TYPE;
}
@Override
public int filterOrder() {
return 0;
}
@Override
public boolean shouldFilter() {
return RequestContext.getCurrentContext().sendZuulResponse();
}
@Override
public Object run() throws ZuulException {
//获取上下文
RequestContext ctx = RequestContext.getCurrentContext();
//获取Request
HttpServletRequest request = ctx.getRequest();
//获取请求参数accessToken
String accessToken = request.getParameter("accessToken");
//使用String工具类
if (StringUtils.isBlank(accessToken)) {
log.warn("accessToken is empty");
//设置为false不进行路由
ctx.setSendZuulResponse(false); //进行拦截
ctx.setResponseStatusCode(401);
try {
ctx.getResponse().getWriter().write("accessToken is empty");
} catch (Exception e) {
}
return null;
}
log.info("access is ok");
return null;
}
}