Spring Boot Zuul

基本配置文件

Application Class

1
2
3
4
5
6
7
@SpringBootApplication
@EnableZuulProxy
class ApigatewayApplication

fun main(args: Array<String>) {
SpringApplication.run(ApigatewayApplication::class.java, *args)
}

@EnableZuulProxy 与 @EnableZuulServer 区别

@EnableZuulServer,不加载任何反向代理过滤器,不使用Eureka的服务发现来发现其他服务。@EnableZuulServer只在搭建自己的路由服务并不使用Zuul的预构建功能时使用。
比如需要使用Zuul来配合其它不是Eureka的服务发现引擎,如Consul。

application.properties

1
2
3
4
5
6
7
8
9
10
11
server.port=8080

## remove prefix from URL
zuul.routes.api.stripPrefix=false
## connection limit
zuul.host.max-total-connections=200000
zuul.host.max-per-route-connections=2000

## 添加静态路由配置
zuul.routes.api-sso.path=/api/sso/gateway/**
zuul.routes.api-sso.url=http://sso-gateway-service

如果部署在kubernetes上,则不需要eureka,直接使用kube自带发现服务

route优先级问题

1
2
3
4
5
6
# Email
zuul.routes.api-email.path=/email/**
zuul.routes.api-email.url=http://email-service
# Root
zuul.routes.root.path=/**
zuul.routes.root.url=http://ethex-frontend

路及匹配的顺序是从上到下

查看当前route path配置

1
management.security.enabled=false

访问 http://ip/routes/

1
2
zuul.routes.stripPrefix=false
zuul.routes.root.path=/gateway/**

访问/gateway/xxx,此时转发的请求是/xx;如果修改为true,则是/gateway/xx

跳转到本地URL

1
2
zuul.routes.user.path=/user/**
zuul.routes.user.url=forward:/user

跨域问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@Bean
fun getCORSFilter(): CorsFilter {
val source = UrlBasedCorsConfigurationSource()
val config = CorsConfiguration()
//允许跨域
config.allowCredentials = true
//允许向该服务器提交请求的URI,*表示全部
config.addAllowedOrigin("*")
//允许访问的头信息,*表示全部
config.addAllowedHeader("*")
//允许的method
config.addAllowedMethod("OPTIONS")
config.addAllowedMethod("HEAD")
config.addAllowedMethod("GET")
config.addAllowedMethod("PUT")
config.addAllowedMethod("POST")
config.addAllowedMethod("DELETE")
config.addAllowedMethod("PATCH")
source.registerCorsConfiguration("/**", config)
return CorsFilter(source)
}

报错:The ‘Access-Control-Allow-Origin’ header contains multiple values

解决方案:

1
zuul.ignored-headers=Access-Control-Allow-Credentials, Access-Control-Allow-Origin

sensitiveHeaders与ignoredHeaders的区别

  • sensitiveHeaders会过滤客户端附带的headers

例如:sensitiveHeaders: X-ABC如果客户端在发请求是带了X-ABC,那么X-ABC不会传递给下游服务。

  • ignoredHeaders会过滤服务之间通信附带的headers

例如:ignoredHeaders: X-ABC如果客户端在发请求是带了X-ABC,那么X-ABC依然会传递给下游服务。但是如果下游服务再转发就会被过滤。

Read Timeout

1
2
3
4
5
zuul.host.max-total-connections=3000
zuul.host.max-per-route-connections=1000
zuul.host.socket-timeout-millis=30000
zuul.host.connect-timeout-millis=30000
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=30000