疯狂Spring Cloud连载(24)Zuul路由配置


声明:本文转载自https://my.oschina.net/JavaLaw/blog/1579997,转载目的在于传递更多信息,仅供学习交流之用。如有侵权行为,请联系我,我会及时删除。

本文节选自《疯狂Spring Cloud微服务架构实战》

Spring Cloud教学视频:https://my.oschina.net/JavaLaw/blog/1552993

Spring Cloud电子书:https://my.oschina.net/JavaLaw/blog/1570383

Zuul路由配置

        路由配置看似简单,但也有部分的规则需要说明,小节以前面搭建的集群项目为基础,讲解Zuul的路由配置。

简单路由

        Spring Cloud在Zuul的“routing”阶段实现了几个过滤器,这些过滤器决定如何进行路由工作。其中,最基本的就是SimpleHostRoutingFilter,该过滤器运行后,会将HTTP请求全部转发到“源服务”(HTTP服务),本书将其称为简单路由,本章7.2小节的例子,实际上就是使用了简单路由进行请求转发。以下为简单路由的配置,同时使用了path与url:

zuul:    routes:     routeTest:       path: /routeTest/163       url: http://www.163.com 

        以上的配置,访问“http://localhost:8080/reuteTest/163”,将会跳转到163网站。为了配置简便,可以省略path,默认情况下使用routeId作为path,以下的配置省略了path配置:

zuul:    routes:     route163:       url: http://www.163.com 

        访问“http://localhost:8080/route163”,同样会路由到163网站。实际上,要触发简单路由,配置的url的值,需要以“http:”或者“https:”字符串打头。以下的配置,不能触发简单路由。

zuul:    routes:     noRoute163:       url: www.163.com 

        简单路由的过滤器SimpleHostRoutingFilter,使用的是HttpClient进行转发,该过滤器会将HttpServletRequest的相关数据(HTTP方法、参数、请求头等),转换为HttpClient的请求实例(HttpRequest),再使用CloseableHttpClient进行转发。

        在此过程中,为了保证转发的性能,使用了HttpClient的连接池功能。涉及连接池,就需要对其进行配置。在使用简单路由时,可以配置以下两项,修改HttpClient连接池的属性:

  • zuul.host.maxTotalConnections:目标主机的最大连接数,默认值为200。配置该项,相当于调用了PoolingHttpClientConnectionManager的setMaxTotal方法。
  • zuul.host.maxPerRouteConnections:每个主机的初始连接数,默认值为20。配置该项,相当于调用了PoolingHttpClientConnectionManager的setDefaultMaxPerRoute方法。

跳转路由

        除了简单路由外,也支持跳转路由,当外部访问网关的A地址时,会forward到B地址,处理跳转路由的过滤器为SendForwardFilter。接下来进行简单测试,为网关项目(zuul-gateway)添加一个控制器,请见代码清单7-5。

        代码清单7-5:

        codes\07\03\zuul-gateway\src\main\java\org\crazyit\cloud\web\SourceController.java

@RestController public class SourceController {      @RequestMapping(value = "/source/hello/{name}", method = RequestMethod.GET)         public String hello(@PathVariable("name") String name) {         return "hello " + name;     } } 

        控制器中提供了一个最简单的“hello”服务,用来当作“源服务”,在application.yml中进行转发配置,配置项如下:

zuul:    routes:     helloRoute:       path: /test/**       url: forward:/source/hello 

        当外部访问“/test”地址时,将会自动forward到“/source/hello”地址,打开浏览器,输入:http://localhost:8080/test/anugs,可以看到浏览器会返回字符串“hello angus”,可见源服务被调用。跳转路由实现较为简单,实际上是调用了RequestDispatcher的forward方法进行跳转。

Ribbon路由

        在7.3.2中,我们已经接触过Ribbon路由。当网关作为Eureka客户端,注册到Eureka服务器时,可以通过配置serviceId,将请求转发到集群的服务中。使用以下配置,可以执行Ribbon路由过滤器:

zuul:    routes:     sale:       path: /sale/**       serviceId: zuul-sale-service 

        与简单路由类似,serviceId也可以被省略,当省略时,将会使用routeId作为serviceId,下面的配置片断,效果等同于上面的配置:

zuul:    routes:     zuul-sale-service:       path: /sale/** 

        需要注意的是,如果提供的url配置项,不是简单路由格式(不以http:或htpps:开头),也不是跳转路由格式(forward:开头),那么将会执行Ribbon路由过滤器,将url看作是一个serviceId,下面的配置片断,效果也等同于前面的配置:

zuul:    routes:     sale:       path: /sale/**       url: zuul-sale-service 

自定义路由规则

        如果上面的路由配置无法满足实际的需求,可以考虑使用自定义的路由规则。实现方式较为简单,在配置类中创建一个PatternServiceRouteMapper即可,请见代码清单7-6。

        代码清单7-6:codes\07\03\zuul-gateway\src\main\java\org\crazyit\cloud\MyConfig.java

@Configuration public class MyConfig {      @Bean     public PatternServiceRouteMapper patternServiceRouteMapper() {         return new PatternServiceRouteMapper(                 "(zuul)-(?<module>.+)-(service)", "${module}/**");     } } 

        创建的PatternServiceRouteMapper实例,构造器第一个参数为serviceId的正则表达式,第二个参数为路由的path。访问“module/**”的请求,将会被路由到“zuul-module-service”的微服务。

        更进一步,以上的路由规则,如果想让一个或多个服务不被路由,可以使用zuul.ignoredServices属性,例如在代码清单7-6的基础上,想排除zuul-sale-service、zuul-book-service这两个模块,可以配置“zuul.ignoredServices: zuul-sale-service, zuul-book-service”。

忽略路由

        除了上面提到的zuul.ignoredServices配置可以忽略路由外,还可以使用zuul.ignoredPatterns来设置不进行路由的URL,请见以下配置片断:

zuul:   ignoredPatterns: /sale/noRoute   routes:     sale:       path: /sale/**       serviceId: zuul-sale-service 

        访问“/sale”路径的请求,都会被路由到“zuul-sale-service”进行处理,但“/sale/noRoute”除外。

本文节选自《疯狂Spring Cloud微服务架构实战》

Spring Cloud教学视频:https://my.oschina.net/JavaLaw/blog/1552993

Spring Cloud电子书:https://my.oschina.net/JavaLaw/blog/1570383

本书代码共享地址:https://gitee.com/yangenxiong/SpringCloud

本文发表于2017年11月27日 10:38
(c)注:本文转载自https://my.oschina.net/JavaLaw/blog/1579997,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如有侵权行为,请联系我们,我们会及时删除.

阅读 2278 讨论 0 喜欢 0

抢先体验

扫码体验
趣味小程序
文字表情生成器

闪念胶囊

你要过得好哇,这样我才能恨你啊,你要是过得不好,我都不知道该恨你还是拥抱你啊。

直抵黄龙府,与诸君痛饮尔。

那时陪伴我的人啊,你们如今在何方。

不出意外的话,我们再也不会见了,祝你前程似锦。

这世界真好,吃野东西也要留出这条命来看看

快捷链接
网站地图
提交友链
Copyright © 2016 - 2021 Cion.
All Rights Reserved.
京ICP备2021004668号-1