图例
Zuul做为网关层,自身也是一个微服务,跟其它服务Service-1,Service-2, … Service-N一样,都注册在eureka server上,可以相互发现,zuul能感知到哪些服务在线,同时通过配置路由规则(后面会给出示例),可以将请求自动转发到指定的后端微服务上,对于一些公用的预处理(比如:权限认证,token合法性校验,灰度验证时部分流量引导之类),可以放在所谓的过滤器(ZuulFilter)里处理,这样后端服务以后新增了服务,zuul层几乎不用修改。
pom
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
Zuul的核心是一系列的过滤器,这些过滤器可以完成以下功能:
1、身份认证与安全:识别每个资源的验证要求,并拒绝那些与要求不符的请求。
2、审查与监控:在边缘位置追踪有意义的数据和统计结果,从而带来精确的生产视图。
3、动态路由:动态地将请求路由到不同的后端集群。
4、压力测试:逐渐增加指向集群的流量,以了解性能。
5、负载分配:为每一种负载类型分配对应容量,并启用超出限定值的请求。
6、静态响应处理:在边缘位置直接建立部分相应,从而避免其转发到内部集群。
7、多区域弹性:跨越AWS Region进行请求路由,旨在实现ELB(Elastic Load Balancing)
使用的多样化,以及让系统的边缘更贴近系统的使用者。
zuul中定义了四种不同生命周期的过滤器类型
pre:路由之前
routing:路由之时
post: 路由之后
error:发送错误调用
main启动类
@SpringBootApplication
@EnableZuulProxy
public class ZuulApplication {
public static void main(String[] args) {
SpringApplication.run(ZuulApplication.class, args);
}
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
application.yml配置
1.常规配置
server:
port: 8040
spring:
application:
name: microservice-gateway-zuul
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
instance:
prefer-ip-address: true
management:
security:
enabled: false
2.指定微服务地址
zuul:
routes:
microservice-provider-user: /user/**
3.忽略指定微服务
zuul:
ignored-services: microservice-provider-user
4.忽略所有微服务,只路由指定的微服务
zuul:
ignored-services: '*' # 使用'*'可忽略所有微服务
routes:
microservice-provider-user: /user/**
5.同时指定微服务的serviceId和对应路径
zuul:
routes:
,
# 可以任意起名。
service-id: microservice-provider-user
path: /user/** # service-id对应的路径
6.同时指定path和url
zuul:
routes:
user-route: # 该配置方式中,user-route只是给路由一个
#名称,
# 可以任意起名。
url: http://localhost:8000/ # 指定的url
path: /user/** # url对应的路径。
#这样就可以将/user/**映射到
#http://localhost:8000/**,
#这种方式访问不会作为HystrixCommand执行,
#也不能使用ribbon来负载多个URL,
#例6可以解决该问题
7.同时指定path和URL,并且不破坏Zuul的Hystrix、Ribbon特性。
zuul:
routes:
user-route:
path: /user/**
service-id: microservice-provider-user
ribbon:
eureka:
enabled: false # 禁用掉ribbon的eureka使用
microservice-provider-user:
ribbon:
listOfServers: localhost:8000,localhost:8001
8.为Zuul添加映射前缀
zuul:
prefix: /api
strip-prefix: false
routes:
microservice-provider-user: /user/**
logging:
level:
com.netflix: DEBUG
9.忽略某些路径
zuul:
ignoredPatterns: /**/admin/** # 忽略所有包括/admin/的路径
routes:
microservice-provider-user: /user/**
10.本地转发
zuul:
routes:
route-name:
path: /path-a/**
url: forward:/path-b