SpringCloud之Zuul(微服务网关)

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值