服务网关Zuul 学习笔记
路由是微服务架构不可或缺的一部分。例如,
/可能被映射到您的Web应用程序,/api/users被映射到用户服务以及/api/shop被映射到商店服务。 Zuul是Netflix提供的基于JVM的路由器和服务器端负载平衡器使用服务网关做统一入口和统一认证,他可以和Eureka,Ribbon,Hystrix等组件配合使用。Zuul组件的核心是一系列的过滤器!
配置统一入口
1. 创建模块SpringBoot_Zuul并引入依赖:
<dependencies>
<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-netflix-zuul</artifactId>
</dependency>
</dependencies>
2. 创建包与启动类: 并加上@EnableZuulProxy注解启用网关
@SpringBootApplication
@EnableZuulProxy
public class ApplicationZuul {
public static void main(String[] args) {
SpringApplication.run(ApplicationZuul.class, args);
}
}
3.创建application.yml配置文件,并将zuul模块注册上去注册中心并配置网关相关转发配置
Zuul启动程序不包括发现客户端,因此,对于基于服务ID的路由,您还需要在类路径上提供其中之一(Eureka是一种选择)
server:
port: 8080 #指定端口
spring:
application:
name: eureka-zuul #指定服务名
eureka:
client:
serviceUrl: #注册到注册中心
defaultZone: http://127.0.0.1:8761/eureka/
instance:
prefer-ip-address: true
zuul:
prefix: /api #可配请求前缀
routes: #转发配置
springBoot-client: # 名称可以随便写 但最好见名思意
#配置请求URL的请求规则 请求只要是这个地址:http://localhost:8080/client/....
#开头就去eureka-client模块找
path: /client/**
#指定Eureka注册中心中的服务id
serviceId: eureka-client
tensquare-test: #test模块
path: /test/** #配置请求URL的请求规则 请求只要是这个地址开头就去eureka-test模块找
serviceId: eureka-test #指定Eureka注册中心中的服务id
..........................
ribbon: #调用超时配置
ConnectTimeout: 5000
ReadTimeout: 5000
4.启动测试是否配置好了统一入口,访问http://localhost:8080/client/getss?id=888888888 看看是否是去eureka-client模块调用服务
zuul内部集成了ribbon,会自动负载均衡的方式去调用部署多态相同的内部服务
5. zuul的配置项说明:
1. - zuul.ignored-services: 说明
在不用**
zuul.ignored-services:配置项的时候:
你不想向外界暴露除你配置的隐射之外的服务就可以使用zuul.ignored-services😗*
zuul:
routes:
springBoot-Client:
path: /client/**
serviceId: eureka-client
retryable: true
ignored-services: '*' #除了配置好的路由`path`访问,其他一切通过路由服务名访问都不通过
----------------------
ignored-services: #本身是个集合,可以配置多个忽略服务,其他没忽略的可以访问
- eureka-test
----------------------
ignored-services: eureka-test,eureka-Service #也可以用','隔开配置多个
2 .-zuul.prefix: 为所有请求配置请求前缀
3**-zuul.retryable:**(请求重试)
设置为true
使自动重试失败的请求,也可以为单独路由进行配置``zuul.routes.MyspringBoot-Client.retryable还可以修改使用客户端配置的重试操作的参数,在笔记2重试有介绍! 开启这个功能前提需要引用spring-retry的依赖
4. -zuul.ignored-patterns: 该配置可以忽略特定路径后面的所有的请求:
zuul: routes: springBoot-test: path: /test/** serviceId: eureka-test springBoot-Client: path: /client/** serviceId: eureka-client ignored-patterns: /**/list/**上面表示访问路径
端口:/xxxx/list/xxxx,/list/后面的所有请求都会被忽略,例如:
http://localhost:8080/client/list与http://localhost:8080/client/list/map都访问不了
5.-Zuul的Http客户端
支持Apache Http、Ribbon的RestClient和OkHttpClient,现在默认使用Apache HTTP客户端。如果要使用``RestClient或,OkHttpClient,
# 启用Ribbon的RestClient ribbon.restclient.enabled=true # 启用OkHttpClient ribbon.okhttp.enabled=true使用
OkHttpClient需要注意在你的项目中已经包含com.squareup.okhttp3相关包
6.-Zuul.sensitive-headers: 该配置可以设置忽略的请求头(解决请求没有cookie与Authorization)
zuul: #全局 ....... sensitive-headers: Cookie,Set-Cookie,Authorization #忽略这些请求头,该配置也是默认的,默认是不为空的! ----------------------- zuul: routes: springBoot-Client: path: /client/** serviceId: eureka-client retryable: true sensitive-headers: Authorization,Cookie #也可以配置在单独路由上如果
sensitiveHeaders在单独路径上设置了,则它将覆盖全局sensitiveHeaders设置!因为默认就是忽略掉请求头
Cookie,Set-Cookie,Authorization,所以会请求会丢失掉cookie,Authorization, 如果想发送请求带上这些请求头,则将该配置设置为空,例如:zuul: routes: springBoot-Client: path: /client/** serviceId: eureka-client retryable: true sensitive-headers: #设置留空
7.-Zuul.force-original-query-string-encoding 查询字符串编码
处理传入的请求时,查询参数被解码,因此可以在
Zuul过滤器中进行修改。然后在路由过滤器中构建后端请求时重新编码它们。如果使用Javascript的encodeURIComponent()方法编码,结果可能与原始输入不同。虽然这在大多数情况下不会出现任何问题,但一些Web服务器可以用复杂查询字符串的编码来挑选。要强制查询字符串的原始编码,可以将特殊标志传递给
ZuulProperties,以便查询字符串与HttpServletRequest::getQueryString方法相同:
application.ymlzuul: forceOriginalQueryStringEncoding: true #默认是false**注意:**此特殊标志仅适用于
SimpleHostRoutingFilter,您可以使用RequestContext.getCurrentContext().setRequestQueryParams(someOverriddenParameters)轻松覆盖查询参数,因为查询字符串现在直接在原始的HttpServletRequest上获取。
8. -禁用Zuul过滤器
Spring Cloud的Zuul在代理和服务器模式下默认启用了多个
ZuulFilterbean。有关启用的可能过滤器,请参阅zuul过滤器包。如果要禁用它,只需设置zuul...disable=true。按照惯例,filters之后的包是Zuul过滤器类型。例如,禁用org.springframework.cloud.netflix.zuul.filters.post.SendResponseFilter设置zuul.SendResponseFilter.post.disable=true
9. - Zuul超时
如果要为通过
Zuul代理的请求配置套接字超时和读取超时,则根据您的配置,有两个选项:
- 如果
Zuul使用服务发现(serviceId),则需要使用ribbon.ReadTimeout和ribbon.SocketTimeout功能区属性配置这些超时 。如果通过指定URL配置了
Zuul(url)路由,则需要使用zuul.host.connect-timeout-millis和zuul.host.socket-timeout-millis。
10. - 重定向与请求转发问题解决
如果
Zuul在Web应用程序的前面,则Location当Web应用程序通过HTTP状态代码重定向时,您可能需要重新编写标头3XX。否则,浏览器将重定向到Web应用程序的URL,而不是Zuul URL。您可以配置LocationRewriteFilterZuul过滤器以将Location标头重写为Zuul的URL。它还添加回去的全局前缀和特定于路由的前缀。以下示例通过使用Spring Configuration文件添加过滤器:@Configuration public class ZuulConfig { @Bean public LocationRewriteFilter locationRewriteFilter() { return new LocationRewriteFilter(); } //return "redirect:/test"; 重定向写法 不用加路由`path`前缀路径 //return "forward:/test"; 转发写法 }小心使用此过滤器。筛选器作用于
Location所有3XX响应代码的标头,这可能不适用于所有情况,例如,将用户重定向到外部URL时!上面的解决重定向方式好处在与控制层可以直接写
api方法的路径,不用加路由前缀路径,缺点是不能重定向到外部url;(推荐使用方式)要重定向到外部
URL可以使用另一种方式:zuul: routes: springBoot-Client: path: /client/** serviceId: eureka-client retryable: true add-host-header: true #配置上加上>>>添加主机头然后在控制层写重定向路径时要加上路由前缀:
return "redirect:/client/test";||return "forward:/client/test";
11.- 路由跨域请求
默认情况下,
Zuul将所有跨源请求(CORS)路由到服务。如果您想让Zuul处理这些请求,可以通过提供自定义WebMvcConfigurerbean 来完成:@Bean public WebMvcConfigurer corsConfigurer() { return new WebMvcConfigurer() { public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/path-1/**") .allowedOrigins("https://allowed-origin.com") .allowedMethods("GET", "POST"); } }; }在上面的示例中,我们允许
GET和POST从的方法allowed-origin.com将跨域请求发送到以开头的端点path-1。您可以使用/**映射将CORS配置应用于特定的路径模式或整个应用程序的全局路径。您可以自定义属性:allowedOrigins,allowedMethods,allowedHeaders,exposedHeaders,allowCredentials并maxAge通过此配置。
-
-zuul.ribbon饥饿加载
Zuul内部使用Ribbon调用远程URL,并且Ribbon客户端默认在第一次调用时由Spring Cloud加载。可以使用以上配置更改Zuul的此行为,并将导致在应用程序启动时,使Ribbon相关的应用程序上下文正在加载。zuul:
ribbon:
eager-load:
enabled: true
可能你配置了之后发现没有起效果,那是因为需要指定具体哪些服务需要饥饿加载,
Spring Cloud Zuul的饥饿加载中没有设计专门的参数来配置,而是直接采用了读取路由配置来进行饥饿加载的做法。所以,如果我们使用默认路由,而没有通过配置的方式指定具体路由规则,那么zuul.ribbon.eager-load.enabled=true的配置就没有什么作用了!
因此我们需要忽略掉所有的默认路由; zuul.ignored-services: ‘*’
1
扩展资料:
网关官网文档:
如果要为通过Zuul代理的请求配置套接字超时和读取超时,则根据您的配置,有两种选择:
- 如果Zuul使用服务发现,则需要使用
ribbon.ReadTimeout和ribbon.SocketTimeout功能区属性配置这些超时 。
如果通过指定URL配置了Zuul路由,则需要使用 zuul.host.connect-timeout-millis和zuul.host.socket-timeout-millis。


640

被折叠的 条评论
为什么被折叠?



