简介(是什么)
服务拆分,使得原本清晰的业务线不那么明朗了,各个服务散落在不同角落,为了实现一个具体的业务逻辑,可能调用多个不同的服务,此时需要一个面向服务治理的组件——网关,Zuul就是在这种场景下诞生的。
在没有引入网关时,用户的请求的一个购买请求需要调用多个微服务。
此时可能遇到的问题:
- 请求由客户端(网页、APP)控制,对其来说稍显复杂
- 需要解决跨域问题
- 很多服务需要认证授权
在引入网关后,用户请求直达网关,由网关决定之后的请求分发到哪个微服务。
此时带来的好处:
- 请求由后端控制,易于监控
- 认证、鉴权、登录一步搞定
Zuul is the front door for all requests from devices and web sites to the backend fo the Netflix streaming application.
Zuul像网站后端应用的前门,其底层是Servlet,本质是过滤器,从代码层面看是一系列Filter所构成的责任链。
案例(怎么用)
创建项目ms-g1-zuul
,添加网关依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
添加注解:
@EnableZuulProxy
添加配置:
server:
port: 10070
spring:
application:
name: zuul-server
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka
zuul:
routes:
product:
path: /product/**
serviceId: product-service
这里Zuul网关的端口为 10070,项目名为zuul-server。
关于zuul的配置在最后几行:
- product 我起的路由名称
- path 表示将所有
/product
开头的请求做URL映射 - serviceId 即服务名称
依次启动3个项目:
- ms-a1-eureka-server 注册中心
- ms-c1-product-service 服务提供者
- ms-g1-zuul 网关服务
路由配置
路由规则在实际项目中可能非常复杂,Zuul提供了多种方式来进行路由配置。
基础配置
zuul:
routes:
product-service: /product/**
将product-service
服务映射到 ‘/product’
忽略服务
zuul:
ignored-services: product-service, user-service
这样Zuul就不会处理被忽略的服务,而代理其他服务。
zuul:
ignored-patterns: /**/delete/**
忽略某些接口,屏蔽掉服务中含有delete
的接口。
路由指定服务
zuul:
ignored-services: '*'
routes:
product-service: /product/**
这样Zuul就只路由 product-service
服务。
多个路由规则
zuul:
routes:
route-rule-a:
serviceId: product-service
path: /product/**
route-rule-b:
serviceId: user-service
path: /user/**
这里的route-rule-a
只是一个名称,没有实际意义。
路由某个URL
zuul:
routes:
user-route:
url: http://localhost:8080/
path: /user/**
这里不是路由某个服务,而是代理一个URL地址。
路由前缀
zuul:
prefix: /ms-service
strip-prefix: false
routes:
product-service: /product/**
在访问Zuul服务 /ms-service/product-service/s1
路径时,请求会被转发到product-service服务的/ms-service/s1
失败重试
zuul:
retryable: true // 开启重试机制
ribbon:
MaxAutoRetries: 2 // 服务失败重试次数
MaxAutoRetriesNextServer: 1 //切换相同服务数量
某些场景下,开启自动重试能提升用户体验。
配置说明
在上面的举例中,映射路径使用的是/product/**
,还有其他几种选项:
配置方式 | 说明 | 举例 |
---|---|---|
/** | 匹配任意路径 | /product/add,/product/save,/product/id/123 |
/* | 匹配单级路径 | /product/add,/product/save,/product/list |
/? | 匹配一个字符 | /product/a,/product/s |
未完待续
Zuul是外界进入微服务应用内部的入口,其原理不复杂,但是需要面对的业务场景太多,因此需要较好的扩展性,Zuul还给用户暴露了更多了扩展能力,在下一节中将从Zuul的生命周期来探索更多可能。
项目代码托管于Github。