spring cloud 2.x版本 Zuul路由网关教程

时间:2022-08-31 15:50:24

前言

本文采用Spring cloud本文为2.1.8RELEASE,version=Greenwich.SR3

本文基于前两篇文章eureka-server、eureka-client、eureka-ribbon和eureka-feign的实现。

参考

概念

Zuul的主要功能是路由转发和过滤器。路由功能是微服务的一部分,例如将请求/api/goods转发到商品服务上、/api/order转发到订单服务上等。

Zull默认和Ribbon结合实现了负载均衡功能。

创建Zuul工程

1.1 创建sping boot工程:eureka-zuul

1.2 添加pom.xml相关依赖

<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>

1.3 application添加配置信息

spring:
application:
name: eureka-zuul
server:
port: 8400 eureka:
instance:
hostname: localhost
lease-renewal-interval-in-seconds: 5
lease-expiration-duration-in-seconds: 10
client:
service-url:
defaultZone: http://eureka1.server.com:8701/eureka/,http://eureka2.server.com:8702/eureka/,http://eureka3.server.com:8703/eureka/ zuul:
routes:
eureka-ribbon: #对应服务名称,可以自定义(最好保持一致)
path: /ribbon/*
serviceId: eureka-ribbon #对应服务名称
eureka-feign:
path: /eureka-feign/*
serviceId: eureka-feign #对应服务名称

1.4 启动类EurekaZuulApplication增加注解

package spring.cloud.demo.eurekazuul;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy; @EnableZuulProxy
@SpringBootApplication
public class EurekaZuulApplication { public static void main(String[] args) {
SpringApplication.run(EurekaZuulApplication.class, args);
} }

@EnableZuulProxy:开启Zuul网关注解

1.5 启动eureka-zuul服务

打开浏览器,分别输入http://localhost:8400/ribbon/sayHello,http://localhost:8400/eureka-feign/feign/sayHello,显示结果分别如下:

spring cloud 2.x版本 Zuul路由网关教程

spring cloud 2.x版本 Zuul路由网关教程

可以看到Zuul按照路由转发的配置规则,把/ribbon/的请求转发到eureka-ribbon服务上,把/eureka-feign/的请求转发到eureka-feign的服务上。

至此,一个简单基于Zuul路由网关就搭建完成了。

彩蛋

添加自定义过滤器

Zuul过滤器有四种类型分别是

  • pre 路由前
  • route 路由时
  • post 路由完毕
  • error 发生错误时

创建自定义过滤器filter

package spring.cloud.demo.eurekazuul.fillter;

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; /**
* 简单filter过滤器
* @auther: maomao
* @DateT: 2019-09-17
*/
public class CommonFilter extends ZuulFilter { /**
* 在请求被路由之前调用
* @return
*/
@Override
public String filterType() {
return "pre";
} /**
* filter执行顺序,通过数字指定 ,优先级为0,数字越大,优先级越低
* @return
*/
@Override
public int filterOrder() {
return 0;
} /**
* 是否执行该过滤器,此处为true,说明需要过滤
* @return
*/
@Override
public boolean shouldFilter() {
return true;
} @Override
public Object run() throws ZuulException {
RequestContext requestContext = RequestContext.getCurrentContext();
HttpServletRequest request = requestContext.getRequest(); //获取请求参数
String token = request.getParameter("token"); //校验token是否可以通过
if (StringUtils.isNotBlank(token) && token.equals("maomao")) {
requestContext.setSendZuulResponse(true);
requestContext.setResponseStatusCode(200);
requestContext.set("code", 1);
} else {
requestContext.setSendZuulResponse(false);
requestContext.setResponseStatusCode(401);
HttpServletResponse response = requestContext.getResponse();
response.setHeader("content-type", "text/html;charset=utf-8");
requestContext.setResponseBody("网关认证失败,停止路由");
requestContext.set("code", 0);
}
return null;
}
}

将过滤器加入Bean,增加Config类

package spring.cloud.demo.eurekazuul.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import spring.cloud.demo.eurekazuul.fillter.CommonFilter; /**
* @auther: maomao
* @DateT: 2019-09-17
*/
@Configuration
public class ZuulFilterConfig { @Bean
public CommonFilter commonFilter() {
return new CommonFilter();
}
}

启动工程

在浏览器分别输入http://localhost:8400/ribbon/sayHello,http://localhost:8400/eureka-feign/feign/sayHello,显示结果如下:

spring cloud 2.x版本 Zuul路由网关教程

spring cloud 2.x版本 Zuul路由网关教程

显示结果证明,过滤器已经生效。因为过滤CommonFilter中要求输入参入带token=maomao,所以请求被拦截,Zuul停止转发。

在浏览器中URL中增加token参数,显示如下:

spring cloud 2.x版本 Zuul路由网关教程

spring cloud 2.x版本 Zuul路由网关教程

显示结果证明,在token正确的情况下,Zuul转发成功。

至此,自定义的过滤器就演示完成。

总结

本文要实现了简单的Zuul路由转发应用。

代码地址

gitHub地址


《Srping Cloud 2.X小白教程》目录
  • 写作不易,转载请注明出处,喜欢的小伙伴可以关注公众号查看更多喜欢的文章。
  • 联系方式:4272231@163.com

    spring cloud 2.x版本 Zuul路由网关教程

spring cloud 2.x版本 Zuul路由网关教程的更多相关文章

  1. spring cloud 2&period;x版本 Gateway路由网关教程

    前言 本文采用Spring cloud本文为2.1.8RELEASE,version=Greenwich.SR3 本文基于前两篇文章eureka-server.eureka-client.eureka ...

  2. spring cloud 2&period;x版本 Ribbon服务发现教程&lpar;内含集成Hystrix熔断机制&rpar;

    本文采用Spring cloud本文为2.1.8RELEASE,version=Greenwich.SR3 前言 本文基于前两篇文章eureka-server和eureka-client的实现. 参考 ...

  3. spring cloud 2&period;x版本 Eureka Client服务提供者教程

    本文采用Spring cloud本文为2.1.8RELEASE,version=Greenwich.SR3 1 创建eureka client 1.1 新建Srping boot工程:eureka-c ...

  4. spring cloud 2&period;x版本 Feign服务发现教程&lpar;内含集成Hystrix熔断机制&rpar;

    前言 本文采用Spring cloud本文为2.1.8RELEASE,version=Greenwich.SR3 本文基于前两篇文章eureka-server和eureka-client的实现. 参考 ...

  5. spring cloud 2&period;x版本 Hystrix Dashboard断路器教程

    前言 本文采用Spring cloud本文为2.1.8RELEASE,version=Greenwich.SR3 本文基于前两篇文章eureka-server.eureka-client.eureka ...

  6. spring cloud 2&period;x版本 Config配置中心教程

    前言 本文采用Spring cloud本文为2.1.8RELEASE,version=Greenwich.SR3 本文基于前面的文章eureka-server的实现. 参考 eureka-server ...

  7. spring cloud 2&period;x版本 Gateway自定义过滤器教程

    前言 本文采用Spring cloud本文为2.1.8RELEASE,version=Greenwich.SR3 本文基于前两篇文章eureka-server.eureka-client.eureka ...

  8. Spring Cloud 系列之 Netflix Zuul 服务网关

    什么是 Zuul Zuul 是从设备和网站到应用程序后端的所有请求的前门.作为边缘服务应用程序,Zuul 旨在实现动态路由,监视,弹性和安全性.Zuul 包含了对请求的路由和过滤两个最主要的功能. Z ...

  9. Spring Cloud (4)zool 路由网关

    一:作用: 1.1  转发 1.2  过滤 二.pom 三.启动类 ------------------------------------------------------------------ ...

随机推荐

  1. 分享一款自己改进的皮肤&OpenCurlyDoubleQuote;verdant”&period;

    - -!我总觉得我不应该这个样子了,这是个不好的习惯,面对博客,我每周或者每个月都会有审美疲劳,然后又写一个皮肤模板,不停的循环,至今都写了好多好多了,都记不清了,汗... 下面是我这今天审美疲劳写的 ...

  2. C&num;设计模式——解释器模式&lpar;Interpreter Pattern&rpar;

    一.概述 在软件开发特别是DSL开发中常常需要使用一些相对较复杂的业务语言,如果业务语言使用频率足够高,且使用普通的编程模式来实现会导致非常复杂的变化,那么就可以考虑使用解释器模式构建一个解释器对复杂 ...

  3. JAVA 锁

    JAVA 锁 锁的概念 Java中的锁是控制资源访问的一种方式.它弥补了synchronized的可操作性不强的不足. Java的锁都实现了Lock接口.Lock结构定义了锁的基本操作. 函数 解释 ...

  4. POJ-2955括号匹配问题(区间DP)

    Brackets Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4834   Accepted: 2574 Descript ...

  5. C语言--基本运算符

    一.算术运算符 1. 加法运算符 + * 除了可以进行加法运算外,还可以表示正号:+521 2.减法运算符 — * 除了可以进行减法运算外,还可以表示负号:—741 3.乘法运算法符 * * 请注意符 ...

  6. linux&lowbar;apt-get 使用详解

    安装应用从互联网上下载查询时 用到,今天安装个 mysql 简化流程如下: apt-cache search mysql-server sudo apt-get install mysql-serve ...

  7. 如何解决Retrieving the COM class factory for component with CLSID &lbrace;00024500-0000-0000-C000-000000000046&rcub; failed due to the following error&colon; 8000401a&period; 问题

    在系统中需要把数据导出到excel并且压缩,然后报了这个问题: 我在网站上找到了方法: 地址:https://social.msdn.microsoft.com/Forums/vstudio/en-U ...

  8. Containerpilot 配置文件 之 consul

    Consul ContainerPilot使用Hashicorp的consul在作为服务的容器中注册工作. Watches查询consul找出其他服务的状态. Client configuration ...

  9. 预处理函数在app和蓝图级别的不同使用

    app级别 from flask import Flask from flask_sqlalchemy import SQLAlchemy # SQLAlchemy 类实例对象的创建一定要在引用蓝图之 ...

  10. jquery检测input checked 控件是否被选中的方法

    jquery检测input checked 控件是否被选中 js部分 复制代码代码如下: function tongyianniu(){ var gouxuan=$('input[type=check ...