介绍
Spring Cloud Zuul
通过与Spring Cloud Eureka
整合, 将自身注册为Eureka
服务治理下的应用, 同时从Eureka
中获得所有其他微服务的实例信息. 是的将维护服务实例的工作交给以服务名为ContextPath
的方式来创建路由映射.
使用
Maven
依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
在应用主类添加注解@EnableZuulProxy
开启Zuul
的API网关功能.
配置
-
路由转发
-
传统路由方式配置
zuul.routes.api-a-url.path=/api-a-url/** zuul.routes.api-a-url.url=http://localhost:8080/
所有符合
/api-a-url/**
规则的路由都将转发到http://localhost:8080/
地址上.
其中api-a-url
为路由的名字, 可以任意订单, 但是一组path
和url
映射关系的路由名要相同. -
面向服务路由
需要加入
Eureka
的依赖, 让路由的path
不是映射具体的url, 而是映射到具体的服务.<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
配置方式
zuul.routes.api-a.path=/api-a/** zuul.routes.api-a.service-id=hello-service zuul.routes.api-b.path=/api-b/** zuul.routes.api-b.service-id=feign-consumer eureka.client.service-url.defaultZone=http://localhost:1111/eureka/
-
-
请求过滤
要实现对请求的过滤和拦截, 如鉴权等, 我们可以在API网关请求到的时候处理, 如果对每个服务处理的话会冗余很多.
实现一个简单的
Zuul
过滤器需要继承ZuulFilter
, 下面的demo
拦截请求必须携带accessToken
参数, 如不存在, 则不转发请求, 并返回401.public class AccessFilter extends ZuulFilter { @Override public String filterType() { // pre 请求之前执行 return "pre"; } @Override public int filterOrder() { return 0; } @Override public boolean shouldFilter() { return true; } @Override public Object run() throws ZuulException { RequestContext context = RequestContext.getCurrentContext(); HttpServletRequest request = context.getRequest(); String accessToken = request.getParameter("accessToken"); if (accessToken == null) { context.setSendZuulResponse(false); context.setResponseStatusCode(401); } return null; } }
filterType
过滤器的类型, 决定过滤器请求在哪个生命周期中执行.pre
请求被路由之前调用routing
路由请求时被调用post
在routing
和error
过滤器之后被调用error
处理请求发生错误时被调用
filterOrder
通过int值定义过滤器执行的顺序,数值越小优先级越高shouldFilter
返回一个boolean
值来判断该过滤器是否要执行. 可以通过次方法指定过滤器的有效范围.run
过滤器的具体逻辑.
-
多实例配置
多实例配置通过
zuul.routes.<route>.path
与zuul.routes.<route>.serviceId
参数对的方式配置zuul.routes.user-service.path=/user-service/** zuul.routes.user-service.serviceId=user-service ribbon.eureka.enabled=false user-service.ribbon.listOfServers=http://localhost:8080/,http://localhost:8081/
ribbon.eureka.enabled
: 由于zuul.routes.<route>.serviceId
指定的是服务名称, 默认情况下ribbon
会根据服务发现机制来获取配置服务名对于的实例清单.
但是如果没有整合类似Eureka
之类的服务治理框架,所以需要设置为false
, 否则配置的serviceId
获取不到对应的实例清单. -
服务路由配置
Spring Cloud Zuul
通过与Spring Cloud Eureka
整合, 实现了对服务实例的自动化维护, 所以在使用服务路由配置的时候, 只需要通过zuul.routes.<route>.path
和zuul.routes.<route>.serviceId
参数方式配置.zuul.routes.user-service.path=/user-service/** zuul.routes.user-service.serviceId=user-service
还可以使用更简洁的方式
zuul.routes.<serviceId>=<path>
方式配置zuul.routes.user-service=/user-service/**
如果不希望某个接口被路由, 可以使用
zuul.ignored-patterns
参数设置zuul.ignored-patterns=/**/hello/**
-
服务路由默认规则
Spring Cloud Zuul
和Spring Cloud Eureka
整合之后, 会为Eureka
中的每个服务都自动创建一个默认路由规则, 默认path
会使用serviceId
配置的服务名作为请求前缀.
可以使用zuul.ignored-services
参数设置一个服务名匹配表达式来定义不自动创建路由的规则.
如果zuul.ignored-services=*
时,Zuul
将对所有的服务不自动创建路由规则. 这个情况下需要手动添加路由配置. -
自定义路由映射规则
PatternServiceRouteMapper
对象可以通过正则表达式来自定义服务与路由映射的身材关系,, 第一个参数匹配服务名是否符合自定义规则的表达式,
第二个参数定义根据服务名内容转换出的路径表达式规则.
如果项目中定义了PatternServiceRouteMapper
实现后,只要符合第一个参数定义规则的服务名, 则会优先使用该实现构建出的路径表达式,如果没有匹配上的服务则还是会使用默认的路由映射规则, 即采用完整服务名作为前缀的路径表达式.@Bean public PatternServiceRouteMapper serviceRouteMapper() { return new PatternServiceRouteMapper( "(?<name>^.+)-(?<version>v.+$)", "${version}/${name}" ); }
-
路由前缀
全局设置路由规则前缀
zuul.prefix=/api
对于代理前缀会默认从路径中移除, 可以通过
zuul.stripPrefix=false
关闭移除代理前缀操作
通过zuul.routes.<route>.strip-prefix=false
对指定的路由关闭移除代理前缀操作. -
Cookie与头信息
设置全局参数为空覆盖默认值
zuul.sensitiveHeaders=
通过指定路由的参数配置
# 方法1: 对指定路由开启自定义敏感头 zuul.routes.<route>.customSensitiveHeaders=true # 方法2: 将指定路由的敏感头设置为空 zuul.routes.<route>.sensitiveHeaders=
本文由 anybbo 创作,采用 知识共享署名4.0
国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: Dec 17,2020