zoukankan      html  css  js  c++  java
  • SpringCloud2.0 Zuul 网关路由 基础教程(十)

    1、启动基础工程

    1.1、启动【服务注册中心】,工程名称:springcloud-eureka-server

    1.2、启动【服务提供者】,工程名称:springcloud-eureka-client

    1.3、启动【服务消费者】,工程名称:springcloud-eureka-ribbon

    1.4、启动【服务消费者】,工程名称:springcloud-eureka-feign

    2、创建【网关路由】,即 Eureka Zuul

    2.1、新建 Spring Boot 工程,工程名称:springcloud-eureka-zuul

    2.2、工程pom.xml文件添加如下依赖:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
    </dependency>
    

    2.3、在工程启动类中,添加注解 @EnableZuulProxy

    package com.miniooc.eurekazuul;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
    
    /**
     * EurekaZuulApplication
     *
     * @author 宋陆
     * @version 1.0.0
     */
    @EnableZuulProxy
    @SpringBootApplication
    public class EurekaZuulApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(EurekaZuulApplication.class, args);
        }
    
    }
    

    2.4、创建工程配置文件application.yml,添加如下配置:

    server:
      port: 8080
    
    spring:
      application:
        name: eureka-gateway
    
    eureka:
      instance:
        hostname: localhost
        # 表示eureka client间隔多久去拉取服务注册信息,默认为30秒,如果要迅速获取服务注册状态,可以缩小该值
        lease-renewal-interval-in-seconds: 5
        # 表示eureka server至上一次收到client的心跳之后,等待下一次心跳的超时时间,在这个时间内若没收到下一次心跳,则将移除该instance。
        # 默认为90秒
        # 如果该值太大,则很可能将流量转发过去的时候,该instance已经不存活了。
        # 如果该值设置太小了,则instance则很可能因为临时的网络抖动而被摘除掉。
        # 该值至少应该大于 leaseRenewalIntervalInSeconds
        lease-expiration-duration-in-seconds: 10
      client:
        serviceUrl:
          defaultZone: http://localhost:9527/eureka/,http://localhost:9528/eureka/,http://localhost:9529/eureka/
    
    zuul:
      routes:
        api-ribbon:
          path: /ribbon/*
          serviceId: eureka-discovery-ribbon
        api-feign:
          path: /feign/*
          serviceId: eureka-discovery-feign
    

    2.5、启动工程

    2.6、打开浏览器,分别访问 http://localhost:8080/ribbon/ribbonInfo , http://localhost:8080/feign/feignInfo

    【路由网关】按照路由转发规则,把 /ribbon/* 的请求,转发到了 eureka-discovery-ribbon 服务,把 /feign/* 的请求,转发到了 eureka-discovery-feign

    3、为【网关路由】添加自定义过滤器

    zuul过滤器有四种类型分别是:pre 路由前,route 路由时,post 路由完毕,error 发生错误时。

    3.1、创建自定义过滤器 AuthFilter

    package com.miniooc.eurekazuul.filter;
    
    import com.netflix.zuul.ZuulFilter;
    import com.netflix.zuul.context.RequestContext;
    import com.netflix.zuul.exception.ZuulException;
    import org.apache.commons.lang.StringUtils;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    /**
     * EurekaZuulApplication
     *
     * @author 宋陆
     * @version 1.0.0
     */
    public class AuthFilter extends ZuulFilter {
    
        @Override
        public String filterType() {
            return "pre"; // 在请求被路由之前调用
        }
    
        @Override
        public int filterOrder() {
            return 0; // filter执行顺序,通过数字指定 ,优先级为0,数字越大,优先级越低
        }
    
        @Override
        public boolean shouldFilter() {
            return true; // 是否执行该过滤器,此处为true,说明需要过滤
        }
    
        @Override
        public Object run() throws ZuulException {
            RequestContext ctx = RequestContext.getCurrentContext();
            HttpServletRequest request = ctx.getRequest();
    
            String token = request.getParameter("token");// 获取请求的参数
    
            // 如果有token参数并且token值为miniooc,才进行路由
            if (StringUtils.isNotBlank(token) && token.equals("miniooc")) {
                ctx.setSendZuulResponse(true); //对请求进行路由
                ctx.setResponseStatusCode(200);
                ctx.set("code", 1);
            } else {
                ctx.setSendZuulResponse(false); //不对其进行路由
                ctx.setResponseStatusCode(401);
                HttpServletResponse response = ctx.getResponse();
                response.setHeader("content-type", "text/html;charset=utf8");
                ctx.setResponseBody("网关认证失败,停止路由");
                ctx.set("code", 0);
            }
            return null;
        }
    }
    

    3.2、创建应用配置类 EurekaZuulConfig

    package com.miniooc.eurekazuul.config;
    
    import com.miniooc.eurekazuul.filter.AuthFilter;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    /**
     * EurekaZuulConfig
     * 应用配置类,初始化 Bean和配置信息
     *
     * @author 宋陆
     * @version 1.0.0
     */
    @Configuration
    public class EurekaZuulConfig {
    
        @Bean
        public AuthFilter authFilter(){
            return new AuthFilter();
        }
    }
    

    3.3、重新启动工程

    3.4、打开浏览器,分别访问 http://localhost:8080/ribbon/ribbonInfo , http://localhost:8080/feign/feignInfo

    没有通过校验,zuul过滤器停止路由转发

    3.5、打开浏览器,分别访问 http://localhost:8080/ribbon/ribbonInfo?token=miniooc,http://localhost:8080/feign/feignInfo?token=miniooc

     

    通过校验,zuul过滤器正常路由转发

    至此,一个简单的【网关路由】搭建完成。

  • 相关阅读:
    celery完成简单的定时任务
    看直播软件源码,如何实现直播系统业务以及技术注意点分析
    直播后台开发,php直播源码这样选择才不会出错
    直播平台源代码的基础功能和首屏优化,小白必看点
    开发短视频软件,短视频源码具有无限的开发潜力
    直播带货源码的安全稳定性到底有多重要?
    搭建直播平台,选对视频直播系统源码有多重要?
    提升短视频应用体验,短视频源码要做哪些完善?
    全世界都在用的编程语言,php直播源码你还不知道就out了
    直播带货系统源码如何举稳直播带货风潮下的大旗
  • 原文地址:https://www.cnblogs.com/songlu/p/9979777.html
Copyright © 2011-2022 走看看