概述
Spring Cloud【Finchley】-14 微服务网关Zuul的搭建与使用中我们搭建了zuul的微服务,对所有注册在Eureka Server上的服务进行了代理。 当然了,zuul也支持更加细粒度的支持,比如对某些特定的微服务,或者特定的URL等,这里我们继续来学习下zuul更加丰富的路由配置。
路由配置
1.忽略指定的微服务
在application.yml中通过 zuul.ignored-services属性指定忽略的微服务 ,多个服务使用,
分隔
zuul: ignored-services: microservice-provider-user,micorservice-consumer-movie-ribbon
测试下:
启动注册中心Eureka Server 项目 microservice-discovery-eureka
启动服务提供者micorservice-provider-user
启动服务消费者 micorservice-consumer-movie-ribbon
启动zuul网关microservice-gateway-zuul
访问zuul的端口 http://localhost:4534/microservice-provider-user/user/2
同时查看 http://localhost:4534/actuator/routes
说明配置生效了。
2.自定义微服务的访问路径
在application.yml中通过配置zuul.routes.微服务的ServiceId :指定路径
zuul: routes: microservice-provider-user: /userprovider/**
这样microservice-provider-user就会被映射到/userprovider/**路径
测试一下:
启动注册中心Eureka Server 项目 microservice-discovery-eureka
启动服务提供者micorservice-provider-user
启动服务消费者 micorservice-consumer-movie-ribbon启动zuul网关microservice-gateway-zuul
先访问 http://localhost:4534/microservice-provider-user/user/4
再放问下设置的映射路径: http://localhost:4534/userprovider/user/4
发现两个路径都可以访问的通,那我们看下zuul的路由映射呢
http://localhost:4534/actuator/routes
格式化如下:
3.忽略所有微服务,只用路由指定微服务
如果只想让zuul代理指定的微服务,可以将zuul.ignored-services设置为'*'
,然后再routes中设置指定的微服务
zuul: ignored-services: '*' routes: microservice-provider-user: /userprovider/**
测试一下:
启动注册中心Eureka Server 项目 microservice-discovery-eureka
启动服务提供者micorservice-provider-user
启动服务消费者 micorservice-consumer-movie-ribbon
启动zuul网关microservice-gateway-zuul
访问下映射后的路径,
那试试原来的地址还能访问吗?
http://localhost:4534/microservice-provider-user/user/4
看下 zuul的路由情况 http://localhost:4534/actuator/routes
发现原来的地址没有被zuul代理, ignored-services: ‘*’ 生效了。
4.同时指定微服务的serviceId和对应路径
效果同效果同自定义微服务的访问路径 ,只不过这里用的是电影微服务
zuul: routes: movie-route: # 该配置方式中,这个名称是路由名称,可自定义 service-id: micorservice-consumer-movie-ribbon path: /movie/** #与service-id对应的微服务的路径
测试下:
启动注册中心Eureka Server 项目 microservice-discovery-eureka
启动服务提供者micorservice-provider-user
启动服务消费者 micorservice-consumer-movie-ribbon
启动zuul网关microservice-gateway-zuul
zuul的路由情况:
访问 movie微服务映射后的地址 http://localhost:4534/movie/movie/2
5.同时指定微服务的URL和对应路径
zuul: routes: movie-route: # 该配置方式中,这个名称是路由名称,可自定义 url: http://localhost:7902/ # 指定的url 7902 为 该微服务的启动端口 path: /movie/** #与service-id对应的微服务的路径
如上配置可以实现将/movie/** 映射到 http://localhost:7902/**
测试
启动注册中心Eureka Server 项目 microservice-discovery-eureka
启动服务提供者micorservice-provider-user
启动服务消费者 micorservice-consumer-movie-ribbon
启动zuul网关microservice-gateway-zuul
zuul的路由情况:
访问 movie微服务映射后的地址:
但是这种配置方式的路由不会作为HystrixCommand执行,同时不能使用Ribbon来负载均衡多个URL。 可以使用下面的的配置来使用Zuul的Hystrix 、Ribbon特性
6.同时指定微服务的URL和对应路径,并且不破坏Zuul的Hystrix 、Ribbon特性
方式一:
根据官网的指导,我们来改造下
zuul: routes: movie-route: # 该配置方式中,这个名称是路由名称,可自定义 service-id: micorservice-consumer-movie-ribbon path: /movie/** #与service-id对应的微服务的路径 ribbon: eureka: enabled: false # 为Ribbon禁用Eureka micorservice-consumer-movie-ribbon: # 上面的service-id ribbon: listOfServers: http://localhost:7901,http://localhost:7902
方式二:
7.使用正则表达式指定Zuul的路由匹配规则
@Bean public PatternServiceRouteMapper serviceRouteMapper() { return new PatternServiceRouteMapper( "(?<name>^.+)-(?<version>v.+$)", "${version}/${name}"); }
看下 PatternServiceRouteMapper
构造函数两个参数 servicePattern 和 routePattern
servicePattern 微服务正则
routePattern 路由正则
上述的规则含义是 将 microservice-provider-user-v1这种微服务,映射到/v1/microservice-provider-user/**这个路径
8.设置路由前缀
示例一:
zuul: prefix: /api strip-prefix: false routes: microservice-provider-user: /userprovider/**
microservice-provider-user的控制层增加如下方法用作测试
访问 : http://localhost:4534/api/userprovider/3
访问zuul的 http://localhost:4534/api/userprovider/3 被转发到 microservice-provider-user的 /api/{id} 方法 。
查看zuul的路由规则 http://localhost:4534/actuator/routes
示例二:
zuul: routes: microservice-provider-user: # 微服务的serviceId path: /user/** strip-prefix: false
访问zuul的 /user/2 将被转发到microservice-provider-user的/user/2
microservice-provider-user日志:
查看下zuul的路由 http://localhost:4534/actuator/routes
9.忽略某些路径
如果需要更加细粒度的路由控制,比如想让zuul代理某个服务,同时又想保护该微服务的某些敏感路径,这个时候 ignored-patterns
属性就派上用场了。
zuul: routes: microservice-provider-user: /userprovider/** ignored-patterns: /**/admin/** # 忽略包含admin的路径
小提示
如果想看更多zuul的转发细节,请将 com.netflix包的日志设置为debug级别。
application.yml中增加
logging: level: com.netflix: DEBUG # 将 com.netflix包的日志级别设置为debug
举个例子:
server: port: 4534 spring: application: name: microservice-gateway-zuul eureka: client: service-url: defaultZone: http://artisan:artisan123@localhost:8761/eureka instance: instance-id: ${spring.application.name}:${spring.application.instance_id:${server.port}} #actuator 启用所有的监控端点 “*”号代表启用所有的监控端点,可以单独启用,例如,health,info,metrics # spring boot 升为 2.0 后,为了安全,默认 Actuator 只暴露了2个端点,heath 和 info management: endpoints: web: exposure: include: "*" endpoint: health: show-details: ALWAYS zuul: prefix: /api strip-prefix: false routes: microservice-provider-user: /userprovider/** logging: level: com.netflix: DEBUG # 将 com.netflix包的日志级别设置为debug,将打印zuul的转发细节
调用 http://localhost:4534/api/userprovider/3 ,观察zuul的日志如下
然后去对应的微服务看是否有匹配的路径即可。