SpringCloud之Zuul(微服务网关)

tech2026-08-11  3

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
最新回复(0)