Zuul 路由服务器

1 .编写pom.xml 文件

< artifactid>zuul-server< /artifactid>
< name>SpringCloud Demo Projects(Zuul) – Zuul Server< /name>
< dependencies>
〈!一声明对spring-cloud-starter-zuul的依赖一〉
< dependency>
< groupid>org.springframework.cloud< /groupid>
< artifactid>spring-cloud-starter-zuul< /artifactId>
< /dependency>
< /dependencies>

2. 编写启动类

启动类加入@EnableZuulProxy 注解
该注解其实是一个复合注解, 其包含@ EnableCircuitBreaker(开启服务降级) 和@EnableDiscoveryClient(注册到eureka Service) 注解。

3. 编写配置文件

#服务器端口, 要记住这个端口,后面的访问都是通过这个端口进行访问的

server .port=8280
spring.application.name =ZUUL-PROXY
#对于微服务,基本上都少不了这个配置
eureka.client.service- url.defaultZone=http://localhost:8260/eureka

4.路由测试

访问地址http://Iocalhost:8280/productservice/products,其中productservice/products为商品微服务,8280为zuul端口号而非商品服务端口号

Zuul 路由服务器的默认设计就是能够与Spring Cloud 相关产品进行整合,应用到这里就是Zuul 将默认从Eureka 服务器中获取所注册的服务,然后将服务的ID 作为请求路径中的一部分,然后将用户的请求自动转发到这些服务中。Zuul 路由服务已经默认集成了负载均衡功能

KISS 原则:服务网关只不过是服务调用过程中的一个检查点,不应该用来处理业务的复杂性
stateless 原则:Zuul 服务网关中不应该、也不可以保存有关服务调用过程中的状态数据

5 Hystrix 容错与监控测试

输入地址http://localhost:8280 /hystrix.stream进行监控

Zuul 本身已经默认集成了Hystrix 和Ribbon,所以Zuul 天生就拥有线程隔离和服务容错的自我保护能力,以及对服务调用的客户端负载均衡功能。但是需要注意,当使用path 与url 的映射关系来配置路由规则时,对于路由转发的请求则不会采用HystrixCommand 来包装,所以这类路由请求就没有线程隔离和服务容错保护功能, 并且也不会有负载均衡的能力。因此在使用Zuul 的时候尽量使用path 和serviceld 的组合进行配置,这样不仅可以保证API 网关的健壮和稳定,也能用到Ribbon 的客户端负载均衡功能。

6 设置zuul路由规则

Zuul 提供了多种机制对请求路由进行映射,如下:

.与Eureka服务器整合自动根据微服务的ID进行映射,这个是默认机制,也是之前示例中所使用的机制。
.结合微服务ID 通过自定义方式进行路由映射。
.直接使用静态URL 路径的方式对微服务进行路由映射。
.添加全局路由映射。
.通过自定义路由转换器,实现更灵活的路由映射。

  1. 服务路由默认规则
    .Zuul 会自动为注册到Eureka 服务器上的每个服务都创建一个默认路由规则:访问路径的前缀为serviceld 配置的服务名称。就会形成如下格式的访问路径:
    http://[zuul路由服务器地址]/[serviceid]/[具体服务的端点]
  2. 自定义微服务访问路径
    .配置文件中通过增加格式为“ zuul.routes.微服务Id=指定路径”的属性配置方式进行配置,对访问路径进行控制,例如:

zuul.routes.userservice = /user/**(以匹配所有以“ /user/”开头的访问路径。)

这样就可以通过/user/来访问userservice 所提供的服务http://localhost: 8280/user/users/3
.zuul 默认会将所有注册到Eureka 服务器中的服务进行映射,通过之前http://localhost: 8280/userservice /users/3 依然可以访问
3. 忽略指定微服务
.通过设置该属性可以指定在默认映射中所要忽略的微服务zuul:routes:ignored-services(zuul.ignored services)。指定后
Zuul 的路由服务将不再代理该路径下的访问。例如:zuul.ignored services=userservice
想让Zuul 忽略所有服务的路由映射zuul. ignored -services 的值设置为“*”。例如:

//指定要被替换的微服务名称
zuul:routes:somedepart.serviceId: userservice
// 指定替换使用的路径(必须与ignored-services属性联用)
zuul:routes:somedepart.path: /cd/**
//忽略所有服务的路由映射
//zuul:routes:ignored-services: userservice
zuul:routes:ignored-services: “*”

  1. 通过静态URL 路径配置路由映射
    .对于没有注册到Eureka 服务器中的微服务,可以通过在Zuul 路由服务器中配置静态
    的URL ,来进行服务的路由映射,最简单的配置如下

zuul.routes.python-service.path=/pythonservice/**
zuul.routes.python-service.url=http://pythonserver:8686

.通过这种配置, Zuul 路由服务器就可以将对pythonserver路径下的所有访问转发到
http://pythonserver:8686的服务接口 , 而不需要访问Eureka 服务器。但这样就会有一个问题, 如果没有
经过Eureka 服务器,那自然就得不到Ribbon 的负载均衡功能了。针对这个问题, Zuul 己
经帮开发者想到了解决方案,在这种情况下开发者只需要禁用Ribbon 与Eureka 的自动集
成设置,采用于工设置方式开启即可,配置如下:
#禁用Ribbon 与Eureka 自动集成功能

ribbon.eureka.enabled=false

#通过手工方式配置服务地址列表
python-service.ribbon.listOfServices=http://pythonserver:8686 ,http://pythonserver:8687 , http://pythonserver:8688
配置时尽量使用serviceld 进行配置, 避免直接设置静态URL的方式。(避免4和5)

7 服务超时

  1. 在默认情况下, 当Zuul 请求执行一个服务时间超过l 秒时,则会中断执行并返回一个500 的错误

    通过hystrix.command.default.execution.isolation.thread.timeoutlnMilliseconds 属性设置这个值

  2. Zuul 中Ribbon 在服务执行时也有一个超时时间配置,默认为5 秒钟,也就是说当一个服务执行时间超过了5 秒,那么也会被中断并返回500 的错误

    通过servicename .ribbon.ReadTimeout 属性设置最大超时时间

这里需要同时设置Hytrix 和Ribbon 的值

8 Zuul 过滤器

https://blog.csdn.net/fanrenxiang/article/details/81239429

  1. 在Zuu l 中定义了4 种标准的过滤器类型

PRE 过滤器:在请求被路由之前调用
ROUTING 过滤器: 在调用目标服务之前被调用
POST 过滤器:在目标微服务执行以后
ERROR 过滤器:该过滤器在处理请求过程中发生错误时被调用

  1. 自定义的过滤器(STATIC 类型的过滤器)直接在Zuul 中生成响应,而不将请求
    转发到后端的微服务上。

  2. 禁用Zuul 过滤器
    在配置文件中只需要按照如下格式就可以配置所需要禁用的过滤器:

zuul.[filter- name). [ filter-type) . disable=true

比如,下面配置将禁用FormBodyWrapperFilter中的PRE 过滤器:

zuul.FormBodyWrapperFilter.pre.disable=true

我们的代码需要保证在post 阶段不再有异常抛出,因为一旦有异常后就会造成该过滤器后面其他的post 过滤器将不再被执行。

9 @EnableZuulServer 与@EnableZuulProxy 比较

简单来说@EnableZuulProxy 注解包含@EnableZuulServer 的所有功能, 并且还加入了@EnableCircuitBreaker和@EnableDiscoveryClient 。当我们需要运行一个没有代理功能的Zuul 服务,或者需要有选择地开/关部分代理功能时, 需要使用@EnableZuulServer 替代@EnableZuulProxy 。这时’
开发者添加的任何ZuulFilter 类型实体类都会被自动加载,这和使用@EnableZuulProxy 是
一样的,但@EnableZuulProxy 不会自动加载任何代理过滤器。

10 EnableZuulServer 注解的过滤器

PRE类型过滤器

• ServletDetectionFilter:该过滤器是最先被执行的。其主要用来检查当前请求是通过
Spring 的DispatcherServlet 处理运行的,还是通过Zuu!Servlet 来处理运行的?判断
结果会保存在isDispatcherServletRequest 中, 值类型为布尔型。
• FormBodyWrapperFilter : 该过滤器的目的是将符合要求的请求体包装成FormBody
Request Wrapper 对象, 以供后续处理使用。
• DebugFilter : 当请求参数中设置了debug 参数时,该过滤器将当前请求上下文中的
debugRouting 和debugRequest 设置为true ,这样后续的过滤器可以根据这两个参数
信息定义一些debug 信息,当生产环境出现问题时,可以通过增加该参数让后台打
印出debug 信息,以帮助开发者进行问题分析。对于请求中的debug 参数的名称,
可以通过zuul.debug. parameter 属性进行自定义。

ROUTE类型过滤器

• SendForwardFilter : 该过滤器只对请求上下文中存在forward.to (Filter Constants.
FORWARD_TO_KEY)参数的请求进行处理,即处理之前我们路由规则中forward
的本地跳转。

POSt类型过滤器

• SendResponseFilter:该过滤器是对代理请求所返回的响应进行封装,然后作为本次
请求的响应发送给请求者。

Error类型过滤器

• SendErrorFilter:该过滤器判断当前请求上下文中是否有异常信息,判断的标准是
RequestContext.getThrowable()是否不为空,如果有,则转发到Spring Boot 默认的
错误页面:== /error==,也可以通过设置error.path 来自定义错误页面。

11 EnableZuulProxy 注解的过滤器

@EnableZuulProxy 则在@EnableZuulServer 的基础上增加了以下过滤器。

PRE类型过滤器

• PreDecorationFilter:该过滤器根据提供的RouteLocator 确定路由到的地址,以及怎
样去路由。该路由器也可为后端请求设置各种代理相关的header 。

ROUTE类型过滤器

• RibbonRoutingFilter : 该过滤器会针对上下文中存在serviceld (可通过RequestContext.
getCurrentContext().get(”serviceld”)获取〉的请求进行处理,使用Ribbon 、Hystrix
和可插拔的HTTP 客户端发送请求,并将服务实例的请求结果返回。也就是之前所
说的只有当我们使用serviceId 配置路由规则时’ Ribbon 和Hystrix 方才生效。
• SimpleHostRoutingFilter:该过滤器检测到routeHost 参数(可通过RequestContext.
getRouteHost()获取)设置时,则会通过Apache HttpClient 向指定的URL 发送请求。
此时,该请求不会使用HystrixCommand 进行包装,所以这类请求也就没有线程隔
离和服务容错保护功能。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值