接上一章节Zuul 进行请求过滤,这里讲讲使用Zuul 的路由规则
Zuul 的路由规则
(1) 在前面的例子中:
#配置路由规则 zuul.routes.接自定义名字
zuul.routes.api-lixuanhong.path=/api-lixuanhong/**
zuul.routes.api-lixuanhong.serviceId=springcloud-service-feign
当访问地址符合/api-lixuanhong/**规则的时候,会被自动定位到springcloud-service-feign 服务上,不过两行代码有点麻烦,还可以简化为:
#zuul.routes 后面跟着的是服务名,服务名后面跟着的是路径规则
zuul.routes.springcloud-service-feign=/api-lixuanhong/**
zuul.routes 后面跟着的是服务名,服务名后面跟着的是路径规则,这种配置方式更简单。
(2) 如果映射规则我们什么都不写,系统也给我们提供了一套默认的配置规则默认的配置规则如下:
#默认的规则
zuul.routes.springcloud-service-feign.path=/springcloud-service-feign/**
zuul.routes.springcloud-service-feign.serviceId=springcloud-service-feign
(3) 默认情况下,Eureka 上所有注册的服务已经都被 Zuul 创建映射关系来进行路由,可以通过http://localhost:Zuul端口号/服务名/接口路径,进行访问。但是对于我这里的例子来说,我希望springcloud-service-feign 提供服务; 而 springcloud-service-provider 作为服务提供者只对服务消费者提供服务,不对外提供服务。 如果使用默认的路由规则,则 Zuul 也会自动为springcloud-service-provider 创建映射规则,这个时候我们可以采用如下方式来让 Zuul 跳过 springcloud-service-provider 服务,不为其创建路由规则,使其不能访问:
#忽略掉服务提供者的默认规则
zuul.ignored-services=springcloud-service-provider
不给某个服务设置映射规则,这个配置我们可以进一步细化,比如说我不想给/hello 接口路由,那我们可以按如下方式配置:
#忽略掉某一些接口路径
zuul.ignored-patterns=/**/hello/**
此外,我们也可以统一的为路由规则增加前缀,设置方式如下:
#配置网关路由的前缀
zuul.prefix=/myapi
此时我们的访问路径就变成了 http://localhost:8084/myapi/springcloud-service-feign/web/hello
通配符 | 含义 | 举例 | 说明 |
---|---|---|---|
? | 匹配任意单个字符 | /springcloud-service-feign/? | 匹配 /springcloud-service-feign/a, /springcloud-service-feign/b, /springcloud-service-feign/c 等 |
* | 匹配任意数量的字符 | /springcloud-service-feign/* | 匹配 /springcloud-service-feign/aaa, /springcloud-service-feign/bbb, /springcloud-service-feign/ccc 等,无法匹配 /springcloud-service-feign/a/b/c |
** | 匹配任意数量的字符 | /springcloud-service-feign/** | 匹配 /springcloud-service-feign/aaa, /springcloud-service-feign/bbb, /springcloud-service-feign/ccc 等, 也可以匹配 /springcloud-service-feign/a/b/c |
(5) 一般情况下 API 网关只是作为各个微服务的统一入口,但是有时候我们可能也需要在 API 网关服务上做一些特殊的业务逻辑处理,那么我们可以让请求到达 API 网关后,再转发给自己本身,由 API 网关自己来处理,那么我们可以进行如下的操作:
在 springcloud-api-gateway 项目中新建如下 Controller:
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class GateWayController {
@RequestMapping("/api/local")
public String hello() {
System.out.println("在api gateway中执行业务处理...");
return "exec the api gateway.";
}
}
然后在 application.properties 文件中配置:
zuul.routes.gateway.path=/gateway/**
zuul.routes.gateway.url=forward:/api/local
进行访问