SpringCloud -- zuul
什么是API网关
在微服务架构中,通常会有多个服务提供者。设想一个电商系统,可能会有商品、订单、支付、用户等多个类型的服务,而每个类型的服务数量也会随着整个系统体量的增大也会随之增长和变更。作为UI端,在展示页面时可能需要从多个微服务中聚合数据,而且服务的划分位置结构可能会有所改变。网关就可以对外暴露聚合API,屏蔽内部微服务的微小变动,保持整个系统的稳定性。当然这只是网关众多功能中的一部分,它还可以做负载均衡,统一鉴权,协议转换,监控监测等一系列功能。
什么是Zuul
Zuul是Spring Cloud全家桶中的微服务API网关。
所有从设备或网站来的请求都会经过Zuul到达后端的Netflix应用程序。作为一个边界性质的应用程序,Zuul提供了动态路由、监控、弹性负载和安全功能。Zuul底层利用各种filter实现如下功能:
- 认证和安全 识别每个需要认证的资源,拒绝不符合要求的请求。
- 性能监测 在服务边界追踪并统计数据,提供精确的生产视图。
- 动态路由 根据需要将请求动态路由到后端集群。
- 压力测试 逐渐增加对集群的流量以了解其性能。
- 负载卸载 预先为每种类型的请求分配容量,当请求超过容量时自动丢弃。
- 静态资源处理 直接在边界返回某些响应
过滤器类型
- 在请求路由之前被调用的pre Filter
- 构建发送给微服务的请求 routing filters
- 在请求路之后被调用的 post filter (添加响应的头 收集统计信息和指标)
- error filters 在其他请求的阶段发生的错误 执行的过滤器
- 自定义 过滤器 custom filters
创建服务网关
创建maven 模块如下,pom.xml文件如下
<artifactId>hompage-zuul</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <!-- 模块名及描述信息 --> <name>homepage-gateway</name> <description>Spring Cloud Gateway</description> <dependencies> <!-- Eureka 客户端, 客户端向 Eureka Server 注册的时候会提供一系列的元数据信息, 例如: 主机, 端口, 健康检查url等 Eureka Server 接受每个客户端发送的心跳信息, 如果在某个配置的超时时间内未接收到心跳信息, 实例会被从注册列表中移除 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <!-- 服务网关 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-zuul</artifactId> </dependency> <!-- apache 工具类 --> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>1.3.2</version> </dependency> </dependencies> <!-- SpringBoot的Maven插件, 能够以Maven的方式为应用提供SpringBoot的支持,可以将 SpringBoot应用打包为可执行的jar或war文件, 然后以通常的方式运行SpringBoot应用 --> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
程序入口配置
/** * 网关应用程序 * EnableZuulProxy 标识当前是 zuul server * SpringCloudApplication 组合注解配置 标识它是springboot项目,Eurake 客户端,打开断路器等 */ @EnableZuulProxy @SpringCloudApplication public class ZuulGatewayApplicatiom { public static void main(String[] args) { SpringApplication.run(ZuulGatewayApplicatiom.class,args); } }
配置文件
server: port: 9000 spring: application: name: homepage-zuul eureka: client: service-url: defaultZone: http://server1:8000/eureka/ # 网关配置 zuul: prefix: /imooc routes: course: path: /homepage-course/** serviceId: eureka-client-homepage-course strip-prefix: false user: path: /homepage-user/** serviceId: eureka-client-homepage-user strip-prefix: false
strip-prefix:false 代表是否去掉 请求的前缀即 path的内容