<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
<!-- <version>2.2.7.RELEASE</version>-->
</dependency>
package com.springcloud.lesson11.zuul.proxy;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.SpringCloudApplication;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
/**
* Zuul 代理引导类
* @author <a href="mailto:[email protected]">Finen</a>
* @see
* @since
*/
@SpringCloudApplication
@EnableZuulProxy
public class ZuulProxyApplication {
public static void main(String[] args) {
SpringApplication.run(ZuulProxyApplication.class, args);
}
}
## Zuul 代理应用
spring.application.name=zuul-proxy
## 服务端口
server.port=6060
## 管理安全失效
# 启用端点 env
management.endpoint.env.enabled=true
# 暴露端点 env 配置多个,隔开
management.endpoints.web.exposure.include=*
application.properties
## 指定 user-service-provider
zuul.routes.user-service-provider = /user-service/**
## 配置 ribbon
user-service-provider.ribbon.listOfServers = http://localhost:9090/
## http://localhost:8080/user-service/* => http://localhost:9090/*
注意:实际配置 Ribbon 底层 HTTP 调用客户端,并非 zuul 独享此功能
装配类:HttpClientRibbonConfiguration
装配类:OkHttpRibbonConfiguration
激活配置:ribbon.okhttp.enabled=true
端口信息
zuul-proxy : 6060
config-server : 7070
user-service-client: 8080
user-service-provider : 9090
eureka-server : 10000
-
eureka-server
-
user-service-provider (1)
-
config-server (2)
- user-service-client
- zuul-proxy
- user-service-client
-
configs/zuul-config.properties
## Zuul Proxy 配置内容
## 指定 user-service-provider
zuul.routes.user-service-provider = /user-service/**
## 指定 user-service-client
zuul.routes.user-service-client = /user-client/**
<!-- 依赖 Spring Cloud Config Client -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
bootstrap.properties
## Zuul 代理应用
spring.application.name = zuul-proxy
## 配置客户端应用关联的应用
## spring.cloud.config.name 是可选的
## 如果没有配置,采用 ${spring.application.name}
spring.cloud.config.name = zuul-config
## 关联 profile
spring.cloud.config.profile = default
## 关联 label
spring.cloud.config.label = master
## 激活 Config Server 服务发现
spring.cloud.config.discovery.enabled = true
## Config Server 服务器应用名称
spring.cloud.config.discovery.serviceId = config-server
## Spring Cloud Eureka 客户端 注册到 Eureka 服务器
eureka.client.serviceUrl.defaultZone = http://localhost:10000/eureka
<!-- 依赖 Spring Cloud Netflix Eureka -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
ZuulFilter 调用链
ZuulFilter#run()
<- ZuulFilter#runFilter()
<- FilterProcessor#runFilters
FilterProcessor#preRoute()
FilterProcessor#route()
FilterProcessor#postRoute()
ZuulServletFilter
ZuulServlet
RequestContext context = RequestContext.getCurrentContext();
context.setZuulEngineRan();
try {
preRoute();
} catch (ZuulException e) {
error(e);
postRoute();
return;
}
try {
route();
} catch (ZuulException e) {
error(e);
postRoute();
return;
}
try {
postRoute();
} catch (ZuulException e) {
error(e);
return;
}
ZuulServletFilter
适用范围更大,可以拦截所有的Servlet
,包括 ZuulServlet
ZuulServlet
会有URL 匹配的模式,url-pattern
Zuul 有两种的激活模式:
-
@EnableZuulProxy
导入
ZuulProxyMarkerConfiguration
,随后生成一个ZuulProxyMarkerConfiguration.Marker()
Bean,这个Bean 作为ZuulProxyAutoConfiguration
的装配前置条件。请注意:
ZuulProxyMarkerConfiguration
扩展了ZuulServerAutoConfiguration
,所以ZuulServlet
和ZuulController
会被自动装配ZuulController
有DispatcherServlet
来在控制,它的映射地址是:"/*",DispatcherServlet
中注册了一个ZuulHandlerMapping
,它控制映射到ZuulController
,可以参考ZuulServerAutoConfiguration
:@Bean public ZuulController zuulController() { return new ZuulController(); } @Bean public ZuulHandlerMapping zuulHandlerMapping(RouteLocator routes) { ZuulHandlerMapping mapping = new ZuulHandlerMapping(routes, zuulController()); mapping.setErrorController(this.errorController); return mapping; }
通过源码分析,
ZuulController
将请求委派给ZuulServlet
,所以所有的ZuulFilter
实例都会被执行。因此,访问 http://localhost:6060/user-service-client/user/find/all ,实际将请求递交给 DispatcherServlet
发送请求"/user-service-client/user/find/all"
DispatcherServlet
ZuulHandlerMapping
ZuulController
ZuulServlet
RibbonRoutingFilter
-
@EnableZuulServer
导入
ZuulServerMarkerConfiguration
,随后生成一个ZuulServerMarkerConfiguration.Marker()
Bean ,主要用作引导装配ZuulServerAutoConfiguration
ZuulServerAutoConfiguration
与 父类 ZuulProxyAutoConfiguration
区别:
父类ZuulProxyAutoConfiguration
提供了RibbonRoutingFilter
调用层次:
DispatcherServlet
ZuulHandlerMapping
ZuulController
ZuulServlet
ZuulFilter