spring-cloud技术笔记(十)-zuul
1、Zuul是spring cloud中的微服务网关。网关:是一个网络整体系统中的前置门户入口。请求首先通过网关,进行路径的路由,定位到具体的服务节点上。
2、Zuul是一个微服务网关.网关:是一个网络整体系统中的前置门户入口.请求首先通过网关,进行路径的路由,定位到具体的服务节点上.
3、Zuul网关不是必要的。是推荐使用的。
默认规则举例:
API 网关地址:http://localhost:2103。
用户服务名称:user-service。
用户登录接口:/user/login。
那么通过 Zuul 访问登录接口的规则就是
http://localhost:2103/user-service/user/login。
1. 指定具体服务路由
我们可以为每一个服务都配置一个路由转发规则:
zuul.routes.fsh-house.path=/api-house/**
上述代码将 fsh-house 服务的路由地址配置成了 api-house,也就是当需要访问 fsh-house 中的接口时,我们可以通过 api-house/house/hello 来进行。这其实就是将服务名称变成了我们自定义的名称。
有的时候服务名称太长了,放在 URL 中不太友好,我们希望它变得更友好一点,就可以这么去配置。这里的 api-house/**
后面一定要配置两个星号,两个星号表示可以转发任意层级的
URL,比如“/api-house/house/1”。如果只配置一个星号,那么就只能转发一级,比如“/api-house/house”。
2. 路由前缀
有的时候我们会想在 API 前面配置一个统一的前缀,比如像 http://c.biancheng.net/user/login 这样登录接口,如果想将其变成 http://c.biancheng.net/rest/user/login,即在每个接口前面加一个 rest,此时我们就可以通过 Zuul 中的配置来实现:
zuul.prefix=/rest
3. 本地跳转
Zuul 的 API 路由还提供了本地跳转功能,通过 forward 就可以实现。
zuul.routes.fsh-substitution.path=/api/**
zuul.routes.fsh-substitution.url=forward:/local
当我们想在访问 api/1 的时候会路由到本地的 local/1 上去,就可以参照上述代码实现。local 是本地接口需要我们自行添加,因此我们要建一个 Controller,代码如下所示。
@RestController
public class LocalController {
@GetMapping("/local/{id}")
public String local(@PathVariable String id) {
return id;
}
}
然后访问 http://localhost:2103/api/1 就可以看到我们想要的返回结果了,如图 1 所示。
二、Zuul网关的应用
1、网关访问方式
通过zuul访问服务的,URL地址默认格式为:http://zuulHostIp:port/要访问的服务名称/服务中的URL
服务名称:properties配置文件中的spring.application.name。
服务的URL:就是对应的服务对外提供的URL路径监听。
2、网关依赖注入
<!-- spring cloud Eureka Client 启动器 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId>
</dependency>
<!-- zuul网关的重试机制,不是使用ribbon内置的重试机制
是借助spring-retry组件实现的重试
开启zuul网关重试机制需要增加下述依赖
-->
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
</dependency>
3、网关启动器
**
* @EnableZuulProxy - 开启Zuul网关。
* 当前应用是一个Zuul微服务网关。会在Eureka注册中心中注册当前服务。并发现其他的服务。
* Zuul需要的必要依赖是spring-cloud-starter-zuul。
*/
@SpringBootApplication
@EnableZuulProxy
public class ZuulApplication {
public static void main(String[] args) {
SpringApplication.run(ZuulApplication.class, args);
}
}
4、网关全局变量配置
4.1 URL路径匹配
URL pattern
使用路径方式匹配路由规则。
参数key结构: zuul.routes.customName.path=xxx
用于配置路径匹配规则。
其中customName自定义。通常使用要调用的服务名称,方便后期管理
可使用的通配符有: * ?
? 单个字符
任意多个字符,不包含多级路径
任意多个字符,包含多级路径
zuul.routes.eureka-application-service.path=/api/**
参数key结构: zuul.routes.customName.url=xxx
url用于配置符合path的请求路径路由到的服务地址。
zuul.routes.eureka-application-service.url=http://127.0.0.1:8080/
4.2 服务名称匹配
service id pattern 通过服务名称路由
key结构 : zuul.routes.customName.path=xxx
路径匹配规则
zuul.routes.eureka-application-service.path=/api/**
key结构 : zuul.routes.customName.serviceId=xxx
serviceId用于配置符合path的请求路径路由到的服务名称。
zuul.routes.eureka-application-service.serviceId=eureka-application-service
服务名称匹配也可以使用简化的配置:
simple service id pattern 简化配置方案
如果只配置path,不配置serviceId。则customName相当于服务名称。
符合path的请求路径直接路由到customName对应的服务上。
zuul.routes.eureka-application-service.path=/api/**
4.3 路由排除配置
ignored service id pattern
配置不被zuul管理的服务列表。多个服务名称使用逗号’,'分隔。
配置的服务将不被zuul代理。
zuul.ignored-services=eureka-application-service
此方式相当于给所有新发现的服务默认排除zuul网关访问方式,只有配置了路由网关的服务才可以通过zuul网关访问
通配方式配置排除列表。
zuul.ignored-services=*
使用服务名称匹配规则配置路由列表,相当于只对已配置的服务提供网关代理。
zuul.routes.eureka-application-service.path=/api/**
通配方式配置排除网关代理路径。所有符合ignored-patterns的请求路径都不被zuul网关代理。
zuul.ignored-patterns=/**/test/**
zuul.routes.eureka-application-service.path=/api/**
4.4 路由前缀配置
prefix URL pattern 前缀路由匹配
配置请求路径前缀,所有基于此前缀的请求都由zuul网关提供代理。
zuul.prefix=/api
使用服务名称匹配方式配置请求路径规则。
这里的配置将为:http://ip:port/api/appservice/**的请求提供zuul网关代理,可以将要访问服务进行前缀分类。
并将请求路由到服务eureka-application-service中。
zuul.routes.eureka-application-service.path=/appservice/**
5 Zuul网关配置总结
网关配置方式有多种,默认、URL、服务名称、排除|忽略、前缀。
网关配置没有优劣好坏,应该在不同的情况下选择合适的配置方案。
zuul网关其底层使用ribbon来实现请求的路由,并内置Hystrix,可选择性提供网关fallback逻辑。使用zuul的时候,并不推荐使用Feign作为application client端的开发实现。毕竟Feign技术是对ribbon的再封装,使用Feign本身会提高通讯消耗,降低通讯效率,只在服务相互调用的时候使用Feign来简化代码开发就够了。而且商业开发中,使用Ribbon+RestTemplate来开发的比例更高。
三、Zuul网关过滤器
Zuul中提供了过滤器定义,可以用来过滤代理请求,提供额外功能逻辑。如:权限验证,日志记录等。
Zuul提供的过滤器是一个父类。父类是ZuulFilter。通过父类中定义的抽象方法filterType,来决定当前的Filter种类是什么。有前置过滤、路由后过滤、后置过滤、异常过滤。前置过滤:是请求进入Zuul之后,立刻执行的过滤逻辑。
路由后过滤:是请求进入Zuul之后,并Zuul实现了请求路由后执行的过滤逻辑,路由后过滤,是在远程服务调用之前过滤的逻辑。
后置过滤:远程服务调用结束后执行的过滤逻辑。
异常过滤:是任意一个过滤器发生异常或远程服务调用无结果反馈的时候执行的过滤逻辑。无结果反馈,就是远程服务调用超时。
3.1 过滤器实现方式
继承父类ZuulFilter。在父类中提供了4个抽象方法,分别是:filterType, filterOrder,
shouldFilter, run。其功能分别是:filterType:方法返回字符串数据,代表当前过滤器的类型。可选值有-pre, route, post, error。 pre -
前置过滤器,在请求被路由前执行,通常用于处理身份认证,日志记录等;route - 在路由执行后,服务调用前被调用;
error - 任意一个filter发生异常的时候执行或远程服务调用没有反馈的时候执行(超时),通常用于处理异常;
post - 在route或error执行后被调用,一般用于收集服务信息,统计服务性能指标等,也可以对response结果做特殊处理。
filterOrder:返回int数据,用于为同filterType的多个过滤器定制执行顺序,返回值越小,执行顺序越优先。
shouldFilter:返回boolean数据,代表当前filter是否生效。
run:具体的过滤执行逻辑。如pre类型的过滤器,可以通过对请求的验证来决定是否将请求路由到服务上;如post类型的过滤器,可以对服务响应结果做加工处理(如为每个响应增加footer数据)。
————————————————
版权声明:本文为优快云博主「王兵的小站」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/wb089094302/article/details/123396155