四、Zuul实现微服务统一网关
1. 微服务网关介绍
为什么需要网关?
- 客户端多次请求不同的微服务,增加客户端的复杂性
- 每个服务都需要独立认证,过于复杂
- 存在跨域请求,在特殊场景下处理比较复杂
- 难以重构
Zuul
- 身份认证和安全(如:将token认证暂存到zuul中)
- 审查与监控
- 动态路由
- 静态响应处理
- 弹性负载均衡
2.创建网关服务器进行模拟练习
2.1 创建springboot项目zuul-server,类型选择web。
2.2 pom降版本为1.5.9,导依赖springcloud、Eureka client、zuul server
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR4</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>1.3.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId>
<version>1.3.5.RELEASE</version>
</dependency>
2.3 编写yml配置
添加微服务名称,自定义网关
zuul:
routes:
eureka-consumer-demo: /user/**
2.4 启动类增加注解
@EnableDiscoveryClient
@EnableZuulProxy
@EnableFeignClients
2.5 启动项目,访问网址,成功
3. 网关过滤器
问题产生:
每个服务在处理请求的时候都要判断是否验证token
需要验证token是否有效
问题分析:
效率低
每个请求都需要转发到具体的微服务后再判断,然后将判断的结果回转给网关
问题解决:
在网关转发前就行进过滤处理
3.1 过滤器分类
**过滤器分类**
PRE
请求被路由转发到微服务之前调用的过滤器
ROUTING
请求被路由转发到微服务时调用的过滤器
POST
请求被路由转发到微服务之后调用的过滤器
ERROR
在其他阶段发生错误时调用的过滤器
3.2 添加过滤器的步骤
(1) 创建过滤器类,继承ZuulFilter,重写方法
filterType():过滤器类型
filterOrder():过滤顺序
shouldFilter():是否进行拦截过滤
run():确定需要拦截之后执行的方法
(2) 编辑重写的方法如下:
public class PreFilter extends ZuulFilter {
// filterType():过滤器类型
@Override
public String filterType() {
return "pre";
}
// filterOrder():过滤顺序 0代表第一个
@Override
public int filterOrder() {
return 0;
}
// shouldFilter():是否进行拦截过滤 true:拦截
@Override
public boolean shouldFilter() {
return true;
}
@Override
public Object run() {
System.out.println("测试能否拦截到================");
return null;
}
}
(3)启动类加注解@bean 或 filter类加注解@Component
@Bean
public PreFilter preFilter(){
return new PreFilter();
}
(4)启动项目,刷新请求网址http://localhost:8086/user/login,测试是否有拦截,成功
内容太多了 我做了模块内容分离,springcloud的5个组件:feign、hystrix、ribbon、zuul、config都有博文分别介绍,如有需要请查看:
springcloud组件之一:feign(client)
springcloud组件之二:hystrix(容错&Hystrix处理容错&Feign项目的监控&Hystrix Dashboard可视化监控&Turbine聚合监控)
springcloud组件之三:Ribbon(轮询和随机负载)