Spring Cloud中Zuul路由配置的示例分析

70次阅读
没有评论

共计 3449 个字符,预计需要花费 9 分钟才能阅读完成。

这篇文章主要为大家展示了“Spring Cloud 中 Zuul 路由配置的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让丸趣 TV 小编带领大家一起研究并学习一下“Spring Cloud 中 Zuul 路由配置的示例分析”这篇文章吧。

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 中 Zuul 路由配置的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注丸趣 TV 行业资讯频道!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-16发表,共计3449字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)