访问 :8765/hi/hello 或 :8765/hi2/hello 都将路由到 hello-service的hello接口,访问 :8765/jboost/ 将访问到jboost博客首页。添加自定义路由后,默认路由仍然存在, 你仍然可以通过 :8765/hello-service/hello 来访问 hello-service的hello接口。
默认的路由规则将Service ID作为匹配路径,看起来有点长,我们想将匹配路径缩短一点,比如hello-service的匹配路径想改为 /hello/**, 而不是/hello-service/**, 如果像上面配置,一个微服务系统可能涉及几十甚至上百个服务,那配置起来将是一场噩梦。别急, zuul提供了 ServiceRouteMapper 接口来解决这一问题,其中 PatternServiceRouteMapper 可以基于正则表达式来进行路由抽取。
创建一个配置类,注入一个 PatternServiceRouteMapper 的bean,如下
@Configuration public class ZuulConfiguration { @Bean public PatternServiceRouteMapper serviceRouteMapper() { return new PatternServiceRouteMapper( "(?<name>^.+)-(?<postfix>.+$)", "${name}"); } }该实现将会对所有服务的路由进行调整,service id 形如 name-postfix的匹配路径为 /name/**, 如hello-service 匹配 /hello/**。 如果正则表达式匹配失败,则还是以默认规则进行路由,如果匹配成功,则默认规则失效,但在配置文件中定义的路由仍然有效。上述验证中,你都可以通过 :8765/actuator/routes 来查看当前生效的路由。
其它配置zuul使用Ribbon来定位服务实例,所有请求都在hystrix command里执行,所以在zuul中可以添加Ribbon, Hystrix相关配置(具体参考前面Ribbon、Hystrix相关文章)
zuul.ignoredPatterns 对某些路径进行屏蔽,如 /**/admin/** 将会屏蔽所有路径中包含admin的接口访问
zuul.sensitiveHeaders 对一些header进行过滤,不传递给后端服务,默认包括Cookie,Set-Cookie,Authorization, 如果要让zuul发送所有header,则需要显式地将sensitiveHeaders置空值
zuul.prefix 为所有映射添加前缀,如/api, 这样route里配的 /myusers/** 就能匹配客户端请求的/api/myusers/**。默认zuul代理在转发时,前缀会被移除,通过设置zuul.stripPrefix=false可不移除
总结本文简单介绍了zuul的基本使用与路由规则,更高阶的应用我们后面继续。
认真生活,快乐分享
欢迎关注微信公众号:空山新雨的技术空间
获取Spring Boot,Spring Cloud,Docker等系列技术文章