• springCloud zuul网关(五)


    zuul 是什么?
         作为微服务的网关,管理所有微服务的路由,用户只访问zuul,再通过zuul 分发路由调用不同的微服务接口。
    为什么用好处什么?
         监控请求,请求的鉴权,使用过滤器过滤大流量访问保证服务可用,分发路由负载均衡等等
    怎么用?
         步骤1、POM文件增加依赖
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
    </dependency>
    <!--由于zuul 也是微服务所以应该属于euaeka的客户端,所以需要引入这个-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
         步骤2:启动类增加注解
    /*
    * zuul 的第一个功能就是路由转发功能,所有的请求访问第一个访问是通过zuul
    * */
    @EnableZuulProxy //用这个会提供很多过滤器,@EnableZuulServer 会减少很多功能
    @SpringCloudApplication
    public class GetWayApplication {
        public static void main(String[] args) {
            SpringApplication.run(GetWayApplication.class);
        }
    }
         步骤3:application.yml路由配置:
    server:
      port: 10010
    eureka:
      client:
        service-url:
          defaultZone: http://127.0.0.1:10086/eureka,http://127.0.0.1:10087/eureka
        registry-fetch-interval-seconds: 50 #客户端拉取注册中心的服务列表
    spring:
      application:
        name: getway
    zuul:
      routes:
        USER-SERVICE: /user-service/**
        #haha:
          #path: /user/**
          # 第一步简化:这里是写死的地址,所以应该通过Eureka 来获取对应的服务器 所以应该配置serviceId
          #url: 127.0.0.1:8982
          #serviceId: USER-SERVICE
    #第二步简化:由于haha 这个名字随便起 而重要的只有path 和serviceId 所以简化配置 serviceId: path配置即可
    #第三部简化: zuul 其实默认配置了serviceId: path 这种配置所以你可以什么都不配置 但如果你想忽略一些微服务不暴露出来需要配值ignor-xxx请百度
    Zuul作为网关的其中一个重要功能,就是实现请求的鉴权。而这个动作我们往往是通过Zuul提供的过滤器来实现的。
       过滤器生命周期:
    正常流程:
         请求到达首先会经过pre类型过滤器,而后到达routing类型,进行路由,请求就到达真正的服务提供者,执行请求,返回结果后,会到达post过滤器。而后返回响应。
    异常流程:
          整个过程中,pre或者routing过滤器出现异常,都会直接进入error过滤器,再error处理完毕后,会将请求交给POST过滤器,最后返回给用户。
         如果是error过滤器自己出现异常,最终也会进入POST过滤器,而后返回。    
         如果是POST过滤器出现异常,会跳转到error过滤器,但是与pre和routing不同的时,请求不会再到达POST过滤器了。

    场景非常多:

         请求鉴权:一般放在pre类型,如果发现没有访问权限,直接就拦截了
         异常处理:一般会在error类型和post类型过滤器中结合来处理。
         服务调用时长统计:pre和post结合使用。
     
    实现:以下模拟用户请求如果请求中不带access-token参数则返回403没权限
    @Component
    public class LoginFiter extends ZuulFilter {
        /*
        - pre:请求在被路由之前执行
        - routing:在路由请求时调用
        - post:在routing和errror过滤器之后调用
        - error:处理请求时发生错误调用
        */
        @Override
        public String filterType() {
            return FilterConstants.PRE_TYPE;
        }
            /*通过返回的int值来定义过滤器的执行顺序,数字越小优先级越高。*/
        @Override
        public int filterOrder() {
            return FilterConstants.PRE_DECORATION_FILTER_ORDER-1;
        }
    
        @Override //是否开启此过滤器
        public boolean shouldFilter() {
            return true;
        }
    
        @Override  //执行逻辑
        public Object run() throws ZuulException {
            //获取request
            RequestContext ctx = RequestContext.getCurrentContext();
            HttpServletRequest request = ctx.getRequest();
            //判断是否带有access-token 参数
            String token = request.getParameter("access-token");
            if(StringUtils.isEmpty(token)){
                //没有就返回无权限403
                 ctx.setSendZuulResponse(false);
                 ctx.setResponseStatusCode(HttpStatus.SC_FORBIDDEN);
            }
            //如果有就默认返回true  由于默认就不需要处理了返回null即可
            return null;
        }
    }
    https://files.cnblogs.com/files/lanSeGeDiao/springCloud-demo.zip 
    以上是springCloud的DEMO例子 请自行复制路径到浏览器
  • 相关阅读:
    【安装软件的点点滴滴】
    【自然语言处理】LDA
    【sklearn】数据预处理 sklearn.preprocessing
    【sklearn】中文文档
    【MySql】update用法
    DotNet Core
    ASP.NET MVC
    ADO.NET
    RESTful API
    C#
  • 原文地址:https://www.cnblogs.com/lanSeGeDiao/p/10828137.html
Copyright © 2020-2023  润新知