springCloud学习4(Zuul服务路由) (2)

  然后编写配置文件:

spring: application: name: zuulservice #服务发现配置 eureka: instance: prefer-ip-address: true client: register-with-eureka: true fetch-registry: true service-url: defaultZone: :8761/eureka/ server: port: 5555

这样便以默认配置启动了 zuul 服务网关。

3、路由配置

  Zuul 核心就是一个反向代理。在微服务架构下,Zuul 从客户端接受微服务调用并将其转发给下游服务。要和下游服务进行沟通,Zuul 必须知道如何将进来的调用映射到下游路由中。Zuul 有一以下几种路由机制:

通过服务发现自动映射路由

通过服务发现手动映射路由

使用静态 URL 手动映射

1)、服务发现自动映射

默认情况下,Zuul 根据服务 ID 来进行自动路由。先将组织服务中的延时去掉

注释延时代码

启动之前的所有服务实例,然后通过 postman 访问localhost:5555/organizationservice/organization/12,得到结果如下:

访问结果

说明服务网关自动路由成功。

  如果要查看 Zuul 服务器管理的路由,可以通过访问 Zuul 服务器上的/routes,返回结果如下:

{ "/confsvr/**": "confsvr", "/licensingservice/**": "licensingservice", "/organizationservice/**": "organizationservice" }

左边的路由由基于 Eureka 的服务 ID 自动创建的,右边为路由所有映射的 Eureka 服务 ID。

2)、服务发现手动手动

  如果觉得自动路由不好用,我们还可以更细粒度地明确定义路由映射。例如想要缩短组织服务名称来简化路由,可在application.yml配置中定义路由映射,在配置文件中加入如下配置:

zuul: routes: organizationservice: /org/**

  上面的配置将org开头的路径映射到组织服务上了。重启服务器,访问localhost:5555/org/organization/12,仍然能够获取到数据。

  现在访问/routes端点可以看到如下结果:

{ "/org/**": "organizationservice", "/confsvr/**": "confsvr", "/licensingservice/**": "licensingservice", "/organizationservice/**": "organizationservice" }

可以看到不光有自定义的组织路由,自动映射的组织路由也存在,如果想要排除自动映射的路由可配置ignored-services属性,用法如下:

zuul: routes: organizationservice: /org/** # 使用","分隔,“*”表示全部忽略 ignored-services: 'organizationservice'

  服务网关有一种常见模式是通过使用/api之类的标记来为所有服务调用添加前缀,可通过配置prefix属性来支持。用法如下:

zuul: routes: organizationservice: /org/** # 使用","分隔,“*”表示全部忽略 ignored-services: 'organizationservice' prefix: /api

配置后再次访问/routes端点可以看到路径前都加上了/api

3)、静态 URL 手动映射

  如果系统系统中还存在一些不受 Eureka 管理的服务,可以建立 Zuul 直接路由到一个静态定义的 URL。假设许可证服务是其他语言编写的 web 项目,并且希望通过 Zuul 来代理,可这样配置:

zuul: routes: #用于内部识别关键字 licensestatic: path: /licensestatic/** url: :8091

配置完成后重启 zuul 访问/routes端点如下所示,静态路由已经加入:

{ "/api/licensestatic/**": "http://localhost:8091", "/api/org/**": "organizationservice", "/api/confsvr/**": "confsvr", "/api/licensingservice/**": "licensingservice", "/api/zuulservice/**": "zuulservice" }

  licensestatic 端点不再使用 Eureka,直接将请求路由到localhost:8091。但是这里存在一个问题,如果许可证服务有多个实例,该如何用到负载均衡?这里只能配置一条路径指向请求。这里又有一个配置项来禁用 Ribbon 与 Eureka 集成,然后列出许可证服务的所有实例,配置如下:

#zuul配置 zuul: routes: #用于内部识别关键字 licensestatic: path: /licensestatic/** serviceId: licensestatic organizationservice: /org/** # 使用","分隔,“*”表示全部忽略 ignored-services: 'organizationservice' prefix: /api ribbon: eureka: #禁用Eureka支持 enabled: false licensestatic: ribbon: #licensestatic服务将会路由到下列地址 listOfServers: :10011,:10012

配置完毕后,访问/routes端点发现licensestatic/**映射到了 licensestatic 服务上,相当于 Zuul 模拟了一个服务出来。但是 Eureka 上是没有这个服务的,所以需要禁用掉 Ribbon 的 Eureka 支持,不然是无法访问成功的(Ribbon 向 Eureka 查询该服务不存在,报错)。现在 x=连续访问localhost:5555//api/licensestatic/licensing/12,可以发现正常响应和 404 交替出现(10011 上能否访问成功,10012 报错 404),说明配置的多个地址生效了。

问题又来了

  禁用eureka支持会导致所有服务的地址都需要手动指定,ribbon不会再从eureka中获取服务实例信息。所以没办法混合使用

  目前有两种办法来规避这个问题:

对于不能用 Eureka 管理的应用,可以建立一个单独的 Zuul 服务器来处理这些路由。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwzxwf.html