上图中服务A和服务B两个服务均为集群部署,每个服务部署三个,Open Service对外服务,外部调用方可通过Nginx负载均衡设备调用Open Service服务
问题来了!
1.如果微服务中很多独立服务都要对外提供服务,那么如何管理这些接口?项目非常大的情况下如何管理?
2.微服务中一个独立系统被拆分成多个独立服务,为确保安全统一添加权限验证代码,那工作量太大了,而且维护不便,怎么办?
Zuul网关的由来?
在这种严峻的形势下,API网关的概念出现了,就像安监站一样,所有外部请求都要经过他的调度与过滤,由它来实现请求路由,负载均衡,权限验证等功能
SpringCloud一站式微服务开发实现了 SpringCloud-Zuul,所以我们有福了,通过SpringCloud-Zuul就可以实现一套API网关服务
Zuul是netflix开源的一个API Gateway 服务器, 本质上是一个web servlet应用。
Zuul的核心是一系列的filters, 其作用可以类比Servlet框架的Filter,或者AOP。
了解了Zuul,如何应用呢?
1.创建Zuul工程,添加依赖
<!--导入Eureka服务的依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--zuul网关依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-netflix-zuul</artifactId>
</dependency>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/libs-milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
2.启动类开启网关服务
3.添加配置文件如下
4.启动feign,提供者,eureka,zuul,此时注册中心如下图
访问网关测试,成功页面如下图
Zuul请求过滤
1.定义一个过滤器实现ZuulFilter,并注入到容器中
2.启动eureka,zuul,feign,provider测试
带token时
不带token时
路由规则
路由规则1
路由规则2
路由规则3
路由规则4
? :匹配单个字符 /api-fn/a; /api-fn/b; /api-fn/c
* : 匹配任意数量字符 /api-fn/aaa; /api-fn/bbb
** :匹配任意数量多个字符 /api-fn/a/b/c/cc
Zuul的自我业务处理
API网关只是作为各个微服务入口,当我想在自己本身做一些业务逻辑处理,怎么找到自己的服务入口呢?
我们可以让请求到达API网关之后,转发给自己,做法如下
1.定义controller,如下
2.添加配置文件
3.访问测试
Zuul的异常处理
异常处理方式1
1.配置文件添加如下内容禁用掉默认错误过滤器
2.自定义错误过滤器
3.手动设置一个异常,访问测试
异常处理方式1
测试前把第一种方式的痕迹清除掉(1.注释掉禁用默认错误过滤器的配置2.注释掉错误过滤器代码)