SpringCloud之Zuul(微服务网关)
在上面我们学习了 Eureka 之后我们知道了服务提供者是消费者通过[Eureka] Server
进行访问的,即[Eureka] Server
是服务提供者的统一入口。那么整个应用中存在那么多消费者需要用户进行调用,这个时候用户该怎样访问这些消费者工程呢?当然可以像之前那样直接访问这些工程。但这种方式没有统一的消费者工程调用入口,不便于访问与管理,而 Zuul 就是这样的一个对于消费者的统一入口。
一.Zull是什么?
Zuul网关是系统的唯一对外的入口,介于客户端和服务器端之间的中间层,处理非业务功能,提供路由请求、鉴权、监控、缓存、限流等功能
//Zuul包含了对请求的路由和过滤两个最主要的功能
1.其中路由能负责将外部请求转发到具体的微服务实例上,是实现外部访问统一的入口的基础,
2.过滤器功能则负责对请求的处理过程进行干预,是实现请求验证、服务聚合等功能的基础
3.Zuul和Eureka进行整合,将Zuul自身注册为Eureka服务治理下的应用,
同时从Eureka中获取其他微服务的信息,也既以后的访问微服务都是通过Zuul跳转后获得
//注意:Zuul服务最终还是会注册进Eureka
主流网关
zuul :Netflix开源的微服务网关,和Eureka,Ribbon,Hystrix等组件配合使用.
kong
nginx+lua
GateWay
二.zuul原理
//核心类:ZuulServlet 是一个servlet
三.自定义Zuul过滤器实现登录鉴权
/**
* 鉴权拦截器:
* 做登录判断, 如果带了token 表示要进行登录鉴权, 没有token表示直接放行
*/
@Component
public class AuthZuulFilter extends ZuulFilter {
//过滤器的类型
@Override
public String filterType() {
return FilterConstants.PRE_TYPE;
}
//过滤器的序号(优先级)
//优先级越小先执行
@Override
public int filterOrder() {
return 1;
}
//是否执行鉴权过滤, true表示当前请求要执行鉴权操作, false表示当前请求不执行鉴权操作
@Override
public boolean shouldFilter() {
//做登录判断, 如果带了token 表示要进行登录鉴权, 没有token表示直接放行
RequestContext requestContext = RequestContext.getCurrentContext();
HttpServletRequest request = requestContext.getRequest();
String token = request.getHeader("token");
return StringUtils.hasLength(token);
}
//鉴权操作逻辑, 执行前提:shouldFilter() 返回true时候
@Override
public Object run() throws ZuulException {
//获取request请求对象
RequestContext requestContext = RequestContext.getCurrentContext();
HttpServletRequest request = requestContext.getRequest();
//执行token鉴权
System.out.println("执行token鉴权........................");
//不放行, 不转发
requestContext.setSendZuulResponse(false);
System.out.println("aaaaa");
//响应状态
requestContext.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value());
try {
//响应内容
requestContext.getResponse().getWriter().write("no unauthorized");
} catch (IOException e) {
e.printStackTrace();
}
//不携带数据
return null;
}
}
四.yml配置(定制路由匹配规则以及携带Cookie)
server:
port: 9000
spring:
application:
name: zuul-server
eureka:
client:
registerWithEureka: true
fetchRegistry: true
serviceUrl:
# 这里只要注册 Eureka 就行了
defaultZone: http://localhost:8761/eureka/
zuul:
sensitiveHeaders: #配了这个就会让cookie进来
#忽略匹配,既: order-server这种格式请求路径忽略掉
ignoredPatterns: /*-server/**
routes:
#定制路由匹配规则
order-server-route:
#凡是请求路径中带有/order前缀的转发到order-server进行处理
#简单的理解:配置前:http://localhost:9000/order-server/orders/get/1/1
# 配置后:http://localhost:9000/order/orders/get/1/1
path: /order/**
serviceId: order-server
product-server-route:
path: /product/**
serviceId: product-serve
启动类
@SpringBootApplication
@EnableZuulProxy //开启网关
public class ZuulMain9000 {
public static void main(String[] args) {
SpringApplication.run(ZuulMain9000.class, args);
}
}
五.小结
1.Zuul网关是系统的唯一对外的入口,介于客户端和服务器端之间的中间层,
处理非业务功能,提供路由请求、鉴权、监控、缓存、限流等功能
2.Zuul包含了对请求的路由和过滤两个最主要的功能
3.Zuul网关默认会过滤掉Cookie与敏感的HTTP头信息(这个需要我们额外配置)
4.访问方式统一通过网关ip端口和要访问的服务名及参数路径和参数
例:http://localhost:9000/order-server/orders/save/1/1