API网关服务组件Spring Cloud Zuul使用详解1(路由详解1:传统路由配置)
作者:hangge | 2020-10-10 08:10
序:基本介绍
1,什么是 Spring Cloud Zuul?
- Zuul 是 Netflix 开源的微服务网关,可以和 Eureka、Ribbon、Hystrix 等组件配合使用。
- Spring Cloud Zuul 是 Spring Cloud 对 Zuul 进行了整合与增强实现的 API 网关组件。
- Zuul 的主要功能是路由转发和请求过滤。
2,Spring Cloud Zuul 主要应用场景
- 动态路由:APP、web 网站通过 zuul 来访问不同的服务提供方,且与 ribbon 结合,还可以负载均衡的路由到同一个应用不同的实例中。
- 安全认证:zuul 作为互联网服务架构中的网关,可以用来校验非法访问、授予 token、校验 token 等。
- 限流:zuul 通过记录每种请求的类型来达到限制访问过多导致服务 down 掉的目的。
- 静态响应处理:直接在 zuul 就处理一些请求,返回响应内容,不转发到微服务内部。
- 区域弹性:主要是针对 AWS 上的应用做一些弹性扩展。
一、传统路由配置
1,基本介绍
所谓的传统路由配置方式就是在不依赖于服务发现机制的情况下,通过在配置文件中具体指定每个路由表达式与服务实例的映射关系来实现 API 网关对外不请求的路由。
由于没有 Eureka 等服务治理框架的帮助,我们需要根据服务实例的数量(单实例、多实例)采用不同方式的配置来实现路由规则,下面会通过样例分别进行介绍。
2,构建网关
(1)创建一个 基础的 Spring Boot 工程,命名为 api-gateway,并在 pom.xml 中添加相关的依赖配置:
注意:对于 spring-cloud-starter-netflix-zuul 依赖,如果查看它的依赖内容可以发现,该模块除了包含 Netiflix Zuul 的核心依赖 zuul-core 之外,还包含下面这些网关服务需要的重要依赖:
- spring-cloud-starter-netflix-hystrix:该依赖用来在网关服务中实现对微服务转发时候的保护机制,通过线程隔离和断路器,防止微服务的故障引发 API 网关资源无法释放,从而影响其他应用的对外服务。
- spring-cloud-starter-netflix-ribbon:该依赖用来实现在网关服务进行路由转发时候的客户端负载均衡以及请求重试。
- spring-boot-starter-actuator:该依赖用来提供常规的微服务管理端点。另外,在 Spring Cloud Zuul 中还特别提供了 /routes 端点来返回当前的所有路由规则。
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-zuul</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Hoxton.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
(2)接着在应用主类上添加 @EnableZuulProxy 注解开启 Zuul 的 API 服务网关功能:
@SpringBootApplication @EnableZuulProxy public class ApiGatewayApplication { public static void main(String[] args) { SpringApplication.run(ApiGatewayApplication.class, args); } }
(3)最后在 application.properties 中配置 Zuul 应用的基础信息,如应用名、服务端口号等:
spring.application.name=api-gateway server.port=5555
3,单实例路由转发配置
(1)单实例的路由转发通过 zuul.routes.<route>.path 与 zuul.routes.<route>.url 参数对的方式进行配置:
- 比如下面配置实现了对符合 /my-service/** 规则的请求路径转发到 http://localhost:8081/ 地址的路由规则
zuul.routes.my-service.path=/my-service/** zuul.routes.my-service.url=http://localhost:8081/
(2)启动服务测试一下,当有一个请求 http://localhost:5555/my-service/hello 被发送到 API 网关上,根据匹配的规则,API 网关会转发请求到 http://localhost:8081/hello 地址:
(3)可以发现这个与我们直接访问目标地址的结果是一样的:
4,多实例路由转发配置
(1)多实例的路由转发通过 zuul.routes.<route>.path 与 zuul.routes.<route>.service-id 参数对的方式进行配置,其中 service-id 是由用户手工命名的服务名称,配合 ribbon.listOfServers 参数实现服务与实例的维护:
- 比如下面配置实现了对符合 /my-service/** 规则的请求路径转发到 http://localhost8081/ 和 http://localhost8082/ 两个实例地址的路由规则。
zuul.routes.my-service.path=/my-service/** zuul.routes.my-service.service-id=my-service my-service.ribbon.listOfServers=http://localhost:8081/,http://localhost:8082/
(2)启动服务测试一下,当多个请求 http://localhost:5555/my-service/hello 被发送到 API 网关上,根据匹配的规则以及内置的Ribbon负载均衡策略,请求会被轮流转发到 http://localhost:8081/ 和 http://localhost:8082/ 这两个地址上:
附:访问 /routes 端点
(1)前面说过 spring-cloud-starter-netflix-zuul 内部还添加了 spring-boot-starter-actuator 依赖,并且提供了 /routes 端点来返回当前的所有路由规则。过该端口默认没有暴露出来,如果需要访问的话,可以通过如下配置将所有端点都暴露出来:
management.endpoints.web.exposure.include=*
(2)访问 http://localhost:5555/actuator/routes 边可以显示所有路由信息:
全部评论(0)