前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >『互联网架构』软件架构-zuul微服务网关(中)(101)

『互联网架构』软件架构-zuul微服务网关(中)(101)

作者头像
IT架构圈
发布2019-07-12 11:46:29
5830
发布2019-07-12 11:46:29
举报
文章被收录于专栏:IT架构圈

咱们今天继续说springcloud的zuul。在最早我们是没有网关这个概念的,微服务搭建起来后,客户端就直接访问一个个微服务了,这些方式有很多的弊端,上次都说了,针对这些弊端,我们用一种什么样的方式去解决呢,那就是springcloud为我们整合一个框架zuul统一的微服务,在这些所有的后端的微服务中间加了一层网关层,网关层类似于设计模式里面的门面模式,就是靠这种门面进行隔离让后端的和请求端进行隔离解耦,互相之前不进行相互的影响,他们之前的影响都通过门面来进行解决。切记:网关调用后端的微服务,全部使用无状态请求。源码:https://github.com/limingios/netFuture/tree/master/源码/『互联网架构』软件架构-zuul微服务网关(中)(101)/

(一)zuul聚合微服务

许多场景下,外部请求需要查询 zuul后端的多个微服务。举个例子,一个电影售票手机APP,在购票订单页上,既需要查询“电影微服务"获得电影相关信息,又需要查询“用户微服务"获得当前用户的信息。如果让手机端直接请求各个微服务(即使使用 zuul进行转发),那么网络开销、流量耗费、耗费时长可能都无法令我们满意。那么对于这种场景,可使用 zuul聚合微服务请求一一一手机 APP只需发送一个请求给 zuul,由 zuul请求用户微服务以及电影微服务,并组织好数据给手机 APP,使用这种方式,手机端只须发送一次请求即可,简化了客户端侧的开发;不仅如此,由于 zuul、用户微服务、电影微服务一般都在同一个局域网中,因此速度会非常快,效率会非常高。

  • 实例代码

08-ms-gateway-zuul-aggregation

  • 运行项目(需启动两个用户微服务和一个订单微服务,eureka-server,zuul的项目 1.08-ms-consumer-order-ribbon 2.08-ms-eureka-server 3.08-ms-gateway-zuul-aggregation 4.08-ms-provider-user

eureka里面有3个服务

  • 聚合请求

其实就是访问一个zuul的一个controller,通过zuul中的controller来选择性的请求多个微服务。http://127.0.0.1:8040/aggregate/1 一个请求order的微服务,一个请求user的微服务。

(二)zuul的路由配置

前文已经编写了一个简单的 zuul网关,并让该网关代理了所有注册到 Eureka server的微服务。但在现实中可能只想让 zuul代理部分微服务,又或者需要对 URL进行更加精确的控制。

  • 源码

08-ms-gateway-zuul

  • 路由忽略微服务

配置忽略指定微服务,只需在application.yml里加上如下配置

代码语言:javascript
复制
zuul:  ignored-services: microservice-provider-user
  • 其他路由配置课查看项目示例的配置文件

指定微服务地址routes, user = microservice-provider-user

代码语言:javascript
复制
server:  port: 8040spring:  application:    name: microservice-gateway-zuuleureka:  client:    service-url:      defaultZone: http://localhost:8761/eureka/  instance:    prefer-ip-address: truezuul:  routes:    microservice-provider-user: /user/**management:  security:    enabled: false

忽略指定微服务ignored-services

代码语言:javascript
复制
server:  port: 8040spring:  application:    name: microservice-gateway-zuuleureka:  client:    service-url:      defaultZone: http://localhost:8761/eureka/  instance:    prefer-ip-address: truezuul:  ignored-services: microservice-provider-usermanagement:  security:    enabled: false

忽略所有微服务,只路由指定的微服务

代码语言:javascript
复制
server:  port: 8040spring:  application:    name: microservice-gateway-zuuleureka:  client:    service-url:      defaultZone: http://localhost:8761/eureka/  instance:    prefer-ip-address: truezuul:  ignored-services: '*'   # 使用'*'可忽略所有微服务  routes:    microservice-provider-user: /user/**management:  security:    enabled: false

同时指定微服务的serviceId和对应路径

代码语言:javascript
复制
server:  port: 8040spring:  application:    name: microservice-gateway-zuuleureka:  client:    service-url:      defaultZone: http://localhost:8761/eureka/  instance:    prefer-ip-address: truezuul:  routes:    user-route:                   # 该配置方式中,user-route只是给路由一个名称,可以任意起名。      service-id: microservice-provider-user      path: /user/**              # service-id对应的路径management:  security:    enabled: false

同时指定path和url

代码语言:javascript
复制
server:  port: 8040spring:  application:    name: microservice-gateway-zuuleureka:  client:    service-url:      defaultZone: http://localhost:8761/eureka/  instance:    prefer-ip-address: truezuul:  routes:    user-route:                   # 该配置方式中,user-route只是给路由一个名称,可以任意起名。      url: http://localhost:8000/ # 指定的url      path: /user/**              # url对应的路径。这样就可以将/user/**映射到http://localhost:8000/**,这种方式访问不会作为HystrixCommand执行,也不能使用ribbon来负载多个URL,例6可以解决该问题management:  security:    enabled: false

强烈建议使用下面的配置,同时指定path和URL,并且不破坏Zuul的Hystrix、Ribbon特性。

代码语言:javascript
复制
server:  port: 8040spring:  application:    name: microservice-gateway-zuuleureka:  client:    service-url:      defaultZone: http://localhost:8761/eureka/  instance:    prefer-ip-address: truezuul:  routes:    user-route:      path: /user/**      service-id: microservice-provider-userribbon:  eureka:    enabled: false    # 禁用掉ribbon的eureka使用microservice-provider-user:  ribbon:    listOfServers: localhost:8000,localhost:8001management:  security:    enabled: false

为Zuul添加映射前缀1

代码语言:javascript
复制
server:  port: 8040spring:  application:    name: microservice-gateway-zuuleureka:  client:    service-url:      defaultZone: http://localhost:8761/eureka/  instance:    prefer-ip-address: truezuul:  prefix: /api  strip-prefix: false  routes:    microservice-provider-user: /user/**logging:  level:    com.netflix: DEBUGmanagement:  security:    enabled: false# 访问Zuul的/api/microservice-provider-user/1路径,请求将会被转发到microservice-provider-user的/api/1,可查看日志打印,有助于理解。

为Zuul添加映射前缀2

代码语言:javascript
复制
server:  port: 8040spring:  application:    name: microservice-gateway-zuuleureka:  client:    service-url:      defaultZone: http://localhost:8761/eureka/  instance:    prefer-ip-address: truezuul:  routes:    microservice-provider-user:       path: /user/**      strip-prefix: falselogging:  level:    com.netflix: DEBUGmanagement:  security:    enabled: false# 这样访问Zuul的/user/1路径,请求将会被转发到microservice-provider-user的/user/1,可查看日志打印,有助于理解。

忽略某些路径

代码语言:javascript
复制
server:  port: 8040spring:  application:    name: microservice-gateway-zuuleureka:  client:    service-url:      defaultZone: http://localhost:8761/eureka/  instance:    prefer-ip-address: truezuul:  ignoredPatterns: /**/admin/**   # 忽略所有包括/admin/的路径  routes:    microservice-provider-user: /user/**management:  security:    enabled: false

忽略某些路径

代码语言:javascript
复制
server:  port: 8040spring:  application:    name: microservice-gateway-zuuleureka:  client:    service-url:      defaultZone: http://localhost:8761/eureka/  instance:    prefer-ip-address: truezuul:  routes:    route-name:      path: /path-a/**      url: forward:/path-bmanagement:  security:    enabled: false

忽略某些路径

代码语言:javascript
复制
server:  port: 8040spring:  application:    name: microservice-gateway-zuuleureka:  client:    service-url:      defaultZone: http://localhost:8761/eureka/  instance:    prefer-ip-address: truezuul:  routes:    route-name:      path: /path-a/**      url: forward:/path-bmanagement:  security:    enabled: false

其实上边的例子:https://cloud.spring.io/spring-cloud-static/Edgware.SR6/single/spring-cloud.html 都是从官网拆出来的,要看一手文档。其实我就是搬运工,加上了自己的理解。

PS:这次说了zuul的路由和在zuul网关做聚合项目。下次继续说zuul的微网关设置。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-07-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 编程坑太多 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • (一)zuul聚合微服务
  • (二)zuul的路由配置
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档