SpringCloud2.0 Zuul 网关路由 基础教程(十)

摘要:
#默认值为90秒#如果该值太大,则在转发流量时,该实例很可能无法生存#如果该设置太小,则可能会由于临时网络抖动而删除该实例。

1、启动基础工程

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

参考 SpringCloud2.0 Eureka Server 服务中心 基础教程(二)

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

参考 SpringCloud2.0 Eureka Client 服务注册 基础教程(三)

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

参考 SpringCloud2.0 Hystrix Ribbon 基于Ribbon实现断路器 基础教程(六)

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

参考 SpringCloud2.0 Hystrix Feign 基于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

SpringCloud2.0 Zuul 网关路由 基础教程(十)第1张

SpringCloud2.0 Zuul 网关路由 基础教程(十)第2张

【路由网关】按照路由转发规则,把 /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

SpringCloud2.0 Zuul 网关路由 基础教程(十)第3张

SpringCloud2.0 Zuul 网关路由 基础教程(十)第4张

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

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

SpringCloud2.0 Zuul 网关路由 基础教程(十)第5张

 SpringCloud2.0 Zuul 网关路由 基础教程(十)第6张

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

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

免责声明:文章转载自《SpringCloud2.0 Zuul 网关路由 基础教程(十)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇基于 Istio 的全链路灰度方案探索和实践pgloader 学习(六) 加载csv 数据下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Springcloud之Zuul网关入门

Spring Cloud实现微服务的架构基本成型:   使用Spring Cloud Netflix中的Eureka实现了服务注册中心以及服务注册与发现;而服务间通过Ribbon或Feign实现服务的消费以及均衡负载。   为了使得服务集群更为健壮,使用Hystrix的融断机制来避免在微服务架构中个别服务出现异常时引起的故障蔓延。 Zuul是Netflix...

zuul隔离机制

文章转载自:https://blog.csdn.net/farsight1/article/details/80078099 ZuulException REJECTED_SEMAPHORE_EXECUTION 是一个最近在性能测试中经常遇到的异常。查询资料发现是因为zuul默认每个路由直接用信号量做隔离,并且默认值是100,也就是当一个路由请求的信号量高...

SpringCloud学习(3)——Eureka服务注册中心及服务发现

Eureka概述Eureka是Netflix的一个子模块, 也是核心模块之一。Eureka是一个基于REST的服务, 用于定位服务, 以实现云端中间层服务发现和故障转移。服务注册与发现对于微服务框架来说非常重要, 有了服务注册和发现, 只需要使用服务的标识符,就可以访问到服务,而不需要修改服务调用的配置文件了。功能类似于Dubbo的注册中心, 比如Zook...

注册中心EUREKA(二)--配置列表

Eureka包含四个部分的配置 instance:当前Eureka Instance实例信息配置 client:Eureka Client客户端特性配置 server:Eureka Server注册中心特性配置 dashboard:Eureka Server注册中心仪表盘配置 Eureka Instance实例信息配置 Eureka Instance的...

【Eureka篇三】Eureka集群配置(5)

1. 新建子模块microservicecloud-eureka-7002(后面简称7002) 和 microservicecloud-eureka-7003(后面简称为7003),packaging均是jar模式,以microservicecloud-eureka-7001(后面简称为7001)的pom.xml为模板配置。 2. 将7001的Eureka...

SpringCloud系列之 openfeign

简介 openfeign 是一个服务调用的组件,用来实现两个服务之间的相互调用,Feign是一个声明式的Web服务客户端,让编写Web服务客户端变得非常容易,只需创建一个接口并在接口上申明注解。使用起来比传统的RestTemplate 更加简单。 使用 使用前阅读 由于openfeign 是只是服务调用,需要注册中心的先注册服务在可以被调用,本文注册中心使...