7-Spring cloud之路由网关zuul
- 1. 前言
- 2. 关于zuul
- 2.1 zuul基本原理
- 2.2 为什么要使用zuul
- 3. 搭建zuul
- 3.1 项目结构
- 3.2 基本配置
- 3.2.1 pom文件
- 3.2.2 yml文件
- 3.3.3 启动类
- 3.3 测试看效果
- 3.3.1 演示
- 3.3.1 架构图
- 4. zuul路由访问映射规则
- 4.1 映射服务提供者的服务名
- 4.2 访问加前缀
- 5.
1. 前言
- 本文又是续接前文,所以下面有些集群或服务都不在介绍,比如Eureka集群还是在前面的基础上启动的,关于前面几篇文章的介绍如下:
- 1-Eureka服务注册与发现以及Eureka集群搭建(实操型).
- 2-Spring cloud之Eureka快速剔除失效服务
- 3-Spring cloud之搭建Ribbon负载均衡——服务器上实操(上)
- 4-Spring cloud之搭建Ribbon负载均衡——服务器上实操(下)
- 5-Spring cloud之Feign的使用——服务器上实操.
- 6-Spring cloud之Hystrix容错处理.
2. 关于zuul
2.1 zuul基本原理
-
网关(Zuul) —— 本质核心就是过滤器 ( 就这样一句话其实就够了)
这些过滤器可以完成以下功能:
- 身份认证与安全:识别每个资源的验证要求,并拒绝那些与要求不符的请求。
- 审查与监控:在边缘位置追踪有意义的数据和统计结果,从而带来精确的生成视图。
- 动态路由:动态地将请求路由到不同的后端集群。
- 压力测试:逐渐增加执行集群的流量,以了解性能。
- 负载分配:为每一种负载类型分配对应容量,并弃用超出限定值得请求。
- 静态响应处理:在边缘位置直接建立部分响应,从而避免其转发到内部集群。
- 多区域弹性:跨越AWS Region进行请求路由,旨在实现ELB(Elastic Load Balancing)使用的多样化,以及让系统的边缘更贴近系统的使用者。
- 在实现了请求路由功能后,我们的微服务应用提供的接口就可以通过统一的API网关入口被客户端访问到了。但是,每个客户端用户请求为服务器应用提供的接口时,它们的访问权限往往都有一定的限制,系统并不会将所有的微服务接口都对它们开放。
- 在完成了服务路由之后,我们对外开放服务还需要一些安全措施来保护客户端只能访问它应该访问到的资源。所以我们需要利用Zuul的过滤器来实现我们对外服务的安全控制。
-
在服务网关中定义过滤器只需要继承ZuulFilter抽象类实现其定义的四个抽象函数就可对请求进行拦截与过滤。
-
更多讲解参考下面的文章:
微服务:网关(zuul) —— 基本原理、配置、鉴权、限制IP、限流.
2.2 为什么要使用zuul
- 可以参考下面的文章
Zuul入门实战(完整版).
3. 搭建zuul
3.1 项目结构
- 如下:
3.2 基本配置
3.2.1 pom文件
-
如下:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.liu.susu</groupId> <artifactId>dog-cloud-parent</artifactId> <version>1.0-SNAPSHOT</version> </parent> <artifactId>dog-gateway-zuul-8090</artifactId> <packaging>jar</packaging> <name>dog-gateway-zuul-8090</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>com.liu.susu</groupId> <artifactId>dog-api</artifactId> <version>${project.version}</version> </dependency> <!--zuul相关的--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zuul</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <!--actuator监控--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!--容错hystrix--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-hystrix</artifactId> </dependency> <!--下面这几个,版本同${spring-boot.version}--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> </project>
3.2.2 yml文件
-
如下:
server: port: 8090 # #网关的端口号 spring: application: name: dog-gateway-zuul # #网关在注册中心的唯一名称 eureka: client: # 客户端注册进eureka服务列表内 register-with-eureka: true # false表示不向注册中心注册自己 service-url: defaultZone: http://62.234.14.112:2886/eureka/,http://58.87.88.142:2886/eureka,http://154.8.150.175:2886/eureka/ instance: instance-id: dog-gateway-zuul-8090 # prefer-ip-address: true
3.3.3 启动类
-
如下:
@SpringBootApplication @EnableEurekaClient @EnableZuulProxy
3.3 测试看效果
3.3.1 演示
- 首先,启动Eureka集群,和服务提供者,然后启动zuul,我这里Eureka集群和服务提供者一直在服务器上没有停过,所以直接启动本地zuul,如下:
- 再确保直接访问服务提供者是通的,如下:
- 然后通过zuul访问,zuul还自带了负载均衡,如下:
// http://zuul_host:zuul_port/微服务在Eureka 注册中心上的服务提供者(对应的application.name)/接口映射地址 // 本地的话,如下3种访问均可 http://localhost:8090/dog-provider/dog/getDogByNum/1 http://127.0.0.1:8090/dog-provider/dog/getDogByNum/1 http://192.168.1.101:8090/dog-provider/dog/getDogByNum/1
3.3.1 架构图
- 简单架构,如下
4. zuul路由访问映射规则
4.1 映射服务提供者的服务名
-
配置如下:
zuul: routes: zuulDog.serviceId: dog-provider # dog-provider 是服务提供者的服务名 zuulDog.path: /myDog/** # ignored-services: dog-provider #禁止通过此服务名访问,即 http://localhost:8090/dog-provider/dog/getDogByNum/1 不再可访问 ignored-services: "*" # 忽略多个微服务的情况
-
访问效果如下:
// http://localhost:8090/dog-provider/dog/getDogByNum/1 没映射前的访问,暴漏了服务提供者名 http://localhost:8090/myDog/dog/getDogByNum/1 //myDog 随便映射
4.2 访问加前缀
- 如下:
zuul:
routes:
zuulDog.serviceId: dog-provider # dog-provider 是服务提供者的服务名
zuulDog.path: /myDog/**
# ignored-services: dog-provider #禁止通过此服务名访问,即 http://localhost:8090/dog-provider/dog/getDogByNum/1 不再可访问
ignored-services: "*" # 忽略多个微服务的情况
prefix: /susu # 加前缀