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过滤器正常路由转发

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

SpringCloud2.0 Zuul 网关路由 基础教程(十)的更多相关文章

  1. SpringCloud2.0 Feign 服务发现 基础教程(五)

    1.启动[服务中心]集群,即 Eureka Server 参考 SpringCloud2.0 Eureka Server 服务中心 基础教程(二) 2.启动[服务提供者]集群,即 Eureka Cli ...

  2. SpringCloud2.0 Ribbon 服务发现 基础教程(四)

    1.启动[服务中心]集群,即 Eureka Server 参考 SpringCloud2.0 Eureka Server 服务中心 基础教程(二) 2.启动[服务提供者]集群,即 Eureka Cli ...

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

    1.创建[服务中心],即 Eureka Server 1.1.新建 Spring Boot 工程,工程名称: springcloud-eureka-server 1.2.工程 pom.xml 文件添加 ...

  4. css3基础教程十六变形与动画animation

    前面我们讲过的变形与动画一般都是通过鼠标的单击.获得焦点,被点击或对元素进行一定改变后以后触发效果的,那么有没有像Flash一样自动播放的动画效果呢?答案当然是肯定的,这就是我们今天要讲到的anima ...

  5. Zuul 网关路由

    Zuul 网关路由 路由是微服务架构中不可或缺的一部分,例如:/api/user映射到user服务,/api/shop映射到shop服务. Zuul是一个基于JVM的路由和服务端的负载均衡器.Zuul ...

  6. zuul网关路由作用

    为了方便客户端调用微服务,所以设计出了网关.在微服务实例地址发生改变的情况下,客户端调用服务要能够不受影响. 网关可以完成的功能:路由,反向代理,日志记录,权限控制,限流 在本例子中 Eureka  ...

  7. Spring Cloud(Dalston.SR5)--Zuul 网关-路由配置

    Spring Cloud 在 Zuul 的 routing 阶段实现了几个过滤器,这些过滤器决定如何进行路由工作. 简单路由(SimpleHostRoutingFilter) 该过滤器运行后,会将 H ...

  8. Spring Cloud之Zuul网关路由

    前端请求先通过nginx走到zuul网关服务,zuul负责路由转发.请求过滤等网关接入层的功能,默认和ribbon整合实现了负载均衡 比如说你有20个服务,暴露出去,你的调用方,如果要跟20个服务打交 ...

  9. Spring Cloud之搭建动态Zuul网关路由转发

    传统方式将路由规则配置在配置文件中,如果路由规则发生了改变,需要重启服务器.这时候我们结合上节课内容整合SpringCloud Config分布式配置中心,实现动态路由规则. 将yml的内容粘贴到码云 ...

随机推荐

  1. [LeetCode] 169. Majority Element 多数元素

    Given an array of size n, find the majority element. The majority element is the element that appear ...

  2. [LeetCode] 264. Ugly Number II 丑陋数 II

    Write a program to find the n-th ugly number. Ugly numbers are positive numbers whose prime factors ...

  3. ABP vNext

    一.简要介绍# ABP vNext 是 ABP 框架作者所发起的新项目,截止目前 (2019 年 8 月 20 日) 已经拥有 1400 多个 Star,最新版本号为 v 0.19.0,可以尝试用于生 ...

  4. [05]Go设计模式:建造者模式(Builder Pattern)

    目录 建造者模式 一.简介 二.代码 三:参考资料 建造者模式 一.简介 建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象.这种类型的设计模式属于创建型模式, ...

  5. AOP+Redis锁防止表单重复提交

    确保分布式锁同时满足以下四个条件 1.互斥性.在任意时刻,只有一个客户端能持有锁 2.不会发生死锁.即使有一个客户端在持有锁的期间崩溃而没有主动解锁,也能保证后续其他客户端能加锁 3.具有容错性.只要 ...

  6. int and Integer

    int和Integer的区别 1.Integer是int的包装类,int则是java的一种基本数据类型 2.Integer变量必须实例化后才能使用,而int变量不需要 3.Integer实际是对象的引 ...

  7. CF1090H Linearization 构造、位运算、前缀和

    传送门 有点神仙的题目 首先注意到对于串\(s\),\(b=s_0\)一定会比\(b = s_0 \bigoplus 1\)更优 考虑先分析linear串的性质.注意到位运算考虑按位处理.我们考虑\( ...

  8. [高清·非影印] Docker 容器与容器云(第2版)

    ------ 郑重声明 --------- 资源来自网络,纯粹共享交流, 如果喜欢,请您务必支持正版!! --------------------------------------------- 下 ...

  9. 14-2 SQL语言简介

    1.结构化查询语言(Structured Query Language,SQL),常被读作sequel,最初是由Microsoft.Sybase和Ashton-Tate这3家公司共同开发的. 2.Wi ...

  10. java之单元测试

    这篇主要简单讲下java的单元测试 目录结构如下: 如图,其中1是需要被测试的功能:2是测试模块:3是单元测试需要的引入包: 1. 功能模块1中 Calculator 的代码: package cn. ...