Spring Cloud学习笔记第五章:Zuul

Spring Cloud——路由网关Zuul 网关是一个网络整体系统中的前置门户入口,请求首先通过网关,进行路径的路由,定位到具体的服务节点上。(1)Zuul是一个微服务网关,也是会在Eureka注册中心中进行服务的注册和发现,请求应该通过Zull来进行路由。(2)Zuul网关不是必要的,是推荐使用的,一般在微服务数量较多(多于10个)的时候推荐使用,对服务的管理有严格要求的时候推荐使用,当微服务权限要求严格的时候推荐使用。(3)Zuul包含了对请求的路由和过滤路由功能:负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础。 阅读详情

在微服务架构中,需要几个基础的服务治理组件,包括服务注册与发现、服务消费、负载均衡、断路器、智能路由、配置管理等,由这几个基础组件相互协作,共同组建了一个简单的微服务系统。一个简答的微服务系统如下图:

Azure (1).png注意:A服务和B服务是可以相互调用的,作图的时候忘记了。并且配置服务也是注册到服务注册中心的。

在Spring Cloud微服务系统中,一种常见的负载均衡方式是,客户端的请求首先经过负载均衡(zuul、Ngnix),再到达服务网关(zuul集群),然后再到具体的服。,服务统一注册到高可用的服务注册中心集群,服务的所有的配置文件由配置服务管理(下一篇文章讲述),配置服务的配置文件放在git仓库,方便开发人员随时改配置。

一、Zuul简介

Zuul的主要功能是路由转发和过滤器。路由功能是微服务的一部分,比如/api/user转发到到user服务,/api/shop转发到到shop服务。zuul默认和Ribbon结合实现了负载均衡的功能。

zuul有以下功能:

  • Authentication
  • Insights
  • Stress Testing
  • Canary Testing
  • Dynamic Routing
  • Service Migration
  • Load Shedding
  • Security
  • Static Response handling
  • Active/Active traffic management

二、准备工作

继续使用上一节的工程。在原有的工程上,创建一个新的工程。

三、创建service-zuul工程

其pom.xml文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.forezp</groupId>
    <artifactId>serice-zuul</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>serice-zuul</name>
    <packaging>jar</packaging>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Dalston.RC1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

    <repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>

</project>

在其入口applicaton类加上注解@EnableZuulProxy,开启zuul的功能:

package com.forezp.sericezuul;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;

@SpringBootApplication
@EnableZuulProxy
//@EnableEurekaClient
public class SericeZuulApplication {

    public static void main(String[] args) {
        SpringApplication.run(SericeZuulApplication.class, args);
    }

}

注意:Zuul服务只需要@EnableZuulProxy这个注解就可以注册到Eureka,不需要@EnableEurekaClient

加上配置文件application.yml加上以下的配置代码:

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
server:
  port: 8769
spring:
  application:
    name: service-zuul

 注意:zuul服务启动默认代理eureka里的所有服务

例如:在启动service-hi服务,可以通过zuul来访问service-hi服务,地址是zuul服务的地址/service-hi/hi?name=forezp

service-hi是service-hi服务的spring.application.name

访问service-hi地址http://localhost:8769/service-hi/hi?name=forezp

 

如果想给代理的服务起别名则zuul服务的application.yml加上以下的配置代码:

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
server:
  port: 8769
spring:
  application:
    name: service-zuul
zuul:
  routes:
    api-a:
      path: /api-a/**
      serviceId: ribbon
    api-b:
      path: /api-b/**
      serviceId: serice-feign

如果想不代理某一些服务则加入:ignoredServices: '*' 

 

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
server:
  port: 8769
spring:
  application:
    name: service-zuul
zuul:
  ignoredServices: '*' ##. *代表所有都不代理,如果想不代理具体的服务,则用服务名用多个逗号隔开
  routes:
    api-a:
      path: /api-a/**
      serviceId: ribbon
    api-b:
      path: /api-b/**
      serviceId: serice-feign

首先指定服务注册中心的地址为http://localhost:8761/eureka/,服务的端口为8769,服务名为service-zuul;以/api-a/ 开头的请求都转发给ribbon服务;以/api-b/开头的请求都转发给serice-feign服务;

依次运行这五个工程;打开浏览器访问:http://localhost:8769/api-a/hi?name=forezp ;浏览器显示:

hi forezp,i am from port:8762

打开浏览器访问:http://localhost:8769/api-b/hi?name=forezp ;浏览器显示:

hi forezp,i am from port:8762

这说明zuul起到了路由的作用

四、服务过滤

zuul不仅只是路由,并且还能过滤,做一些安全验证。继续改造工程;

package com.forezp.sericezuul.service;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;

@Component
public class MyFilter extends ZuulFilter {
    private static Logger log = LoggerFactory.getLogger(MyFilter.class);



    /**
     *     返回一个字符串代表过滤器的类型,在zuul中定义了四种不同生命周期的过滤器类型,具体如下:
     *     pre:路由之前
     *     routing:路由之时
     *     post: 路由之后
     *     error:发送错误调用
     * @return
     */
    @Override
    public String filterType() {
        return "pre";
    }

    /**
     * 过滤的顺序
     * @return
     */
    @Override
    public int filterOrder() {
        return 0;
    }

    /**
     * 这里可以写逻辑判断,是否要过滤,本文true,永远过滤。
     * @return
     */
    @Override
    public boolean shouldFilter() {
        return true;
    }

    /**
     * 过滤器的具体逻辑。可用很复杂,包括查sql,nosql去判断该请求到底有没有权限访问。
     * @return
     */
    @Override
    public Object run() {
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        log.info(String.format("%s >>> %s", request.getMethod(), request.getRequestURL().toString()));
        Object accessToken = request.getParameter("token");
        if(accessToken == null) {
            log.warn("token is empty");
            ctx.setSendZuulResponse(false);
            ctx.setResponseStatusCode(401);
            try {
                ctx.getResponse().getWriter().write("token is empty");
            }catch (Exception e){}

            return null;
        }
        log.info("ok");
        return null;
    }
}
  • filterType:返回一个字符串代表过滤器的类型,在zuul中定义了四种不同生命周期的过滤器类型,具体如下:
    • pre:路由之前
    • routing:路由之时
    • post: 路由之后
    • error:发送错误调用
  • filterOrder:过滤的顺序
  • shouldFilter:这里可以写逻辑判断,是否要过滤,本文true,永远过滤。
  • run:过滤器的具体逻辑。可用很复杂,包括查sql,nosql去判断该请求到底有没有权限访问。

这时访问:http://localhost:8769/api-a/hi?name=forezp ;网页显示:

token is empty

访问 http://localhost:8769/api-a/hi?name=forezp&token=22 ; 网页显示:

hi forezp,i am from port:8762

spring cloud : 网关Zuul(过滤:安全、监控、限流、路由) 单点搭建注意:蓝色虚线代表注册;绿色虚线代表调用、红色虚线代表心跳1.     添加依赖创建项目tcloud-gateway-zuulserver , pom.xml内容如下&lt;project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    ... 阅读详情

相关推荐

Spring Cloud Zuul防DDOS攻击

前一段时间,公司的短信服务经常收到预警,当时初步猜测我们的短信服务受到了攻击,于是想到了两种实现方案。 方案一: 采用nginx防止DDOS(网上有很多案例可以借鉴) 方案二: 采用Spring Cloud Zuul(网关)层实现防DDOS 因考虑如果使用nginx层进行防DDOS拦截,会导致线上的其他服务受到影响,并且使用nginx拦截无法像Z...

shendixiong的专栏 4400

史上最简单的SpringCloud教程 | 第五篇: 路由网关(zuul)

转载请标明出处: https://www.fangzhipeng.com/springcloud/2017/07/12/sc05-zuul/ 本文出自方志朋的博客 最新Finchley版本,请访问: https://www.fangzhipeng.com/springcloud/2018/08/30/sc-f5-zuul/ 或者 htt...

weixin_30449453的博客 5016

Spring Cloud Zuul微服务网关的API限流

API限流微服务开发中有时需要对API做限流保护,防止网络攻击,比如做一个短信验证码API,限制客户端的请求速率能在一定程度上抵御短信轰炸攻击,降低损失。微服务网关是每个请求的必经入口,非常适合做一些API限流、认证之类的操作,这里有一个基于zuul微服务网关的API限流库: https://github.com/marcosbarbero/spring-cloud-zuul-ratelimit使

云中采薇 1万+

spring cloud之zuul

本篇文章仅作为近日参考其他文章后,自己实践的记录和总结,场景到细节尚有很多不足,有待补充和修正。Zuul使用一系列不同类型的过滤器,使我们能够快速灵活地将功能应用于我们的边缘服务。这些过滤器可帮助我们执行以下功能身份验证和安全-识别每个资源的身份验证要求,并拒绝不满足他们的请求。洞察和监测-跟踪边缘的有意义的数据和统计数据,以便我们准确地了解生产情况。动态路由-根据需要将请求动态路由到不同的后端集群。压力测试-逐渐增加到集群的流量,以衡量性能。方法说明。...

qq_35913663的博客 3065

SpringCloud07—API网关服务:Spring Cloud Zuul

将指定路由的敏感头信息设置为空zuul.routes..sensitiveHeaders=[这里设置要过滤的敏感头]7.5 对于HyStrix和Ribbon的设置Zuul天生就拥有线程隔离和断路器的自我保护功能,以及对服务调用的客户端负载均衡功能。但是需要注意,当使用path与ur1的映射关系来配置路由规则的时候,对于路由转发的请求不会采用HystrixCommand来包装,所以这类路由请求没有线程隔离和断路器的保护,并且也不会有负载均衡的能力。

2401_84009579的博客 733

【智能机器人开发全流程:硬件选型、软件架构与ROS实战,打造高效机器人系统】

通过模块化设计与ROS框架的灵活扩展,可快速搭建适应不同场景的机器人系统。实际开发中需重点关注。

dally2的博客 6045

微服务教程5:spring-cloud 的Zuul 官网 的用法

今天,来记录Zuul ,spring cloud 的网关组件的使用方法 Zuul 的使用场景,就是api的一个入口,当某些权限验证,以及过滤器 等 ,都在此处做处理; 1, 先创建 Zuul 的项目 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

weixin_39285027的博客 2万+

Ubuntu升级遇到grub-efi-amd64-signed报错?3步搞定这个烦人的EFI目录问题

本文详细解析了Ubuntu系统升级时遇到的“grub-efi-amd64-signed”报错及“cannot find EFI directory”问题。通过剖析UEFI启动机制与EFI系统分区原理,提供了从诊断到修复的三步解决方案,帮助用户快速解决因EFI目录未挂载导致的升级中断,确保系统引导正常。

assembly8low的博客 585

Zuul2代码详解

说明: 1 前面加星号,需要重点掌握 2 zuul2命名规则: 带sync的就是同步,同样的名称不带sync的就是异步 BaseServerStartup只为我们提供了基础的server,这是个抽象类,需要使用者自己来实现。 同理2种InboundFilter、2种OutboundFilter、1种Endpoint也都是抽象类,需要使用者自己来实现。 io.netty | b...

咖啡男孩之SRE之路 2250

gcc/g++ 链接库的编译与链接

gcc/g++ 链接库的编译与链接 surgewong@gmail.com http://blog.youkuaiyun.com/surgewong       程序编译一般需要经预处理、编译、汇编和链接几个步骤。在实际应用中,有些公共代码需要反复使用,就把这些代码编译成为“库”文件。在链接步骤中,连接器将从库文件取得所需的代码,复制到生成的可执行文件中,这种库称为静态(链接)库,其特点是可

Surge 4万+

智能网联汽车电子电气架构(下)

从资产的表现形式, 可以分为数据、 软件、 硬件、 服务等, 而从需要保护的业务过程和活动、 所关注信息的角度, 资产类型可包括基于 ECU 的控制功能、 与特定车辆相关的信息、 车辆状态信息、 用户信息、 配置信息、 特定的软件、 内容等。面向新一代 EEA 的安全需求, 基于芯片提供的 OTP, 或SHE\HSM 的安全存储能力, 实现系统关键数据(身份、 密钥等关键信息) 的安全存储, 保证系统的关键数据不被盗取、 破坏、 改写。结合攻击者的动机与识别出的系统用例, 分析对汽车电子系统可能的攻击。

m0_58838529的博客 1473

微服务实战 微服务网关Zuul入门与实战_让服务请求全走网关

简化客户端调用的复杂度,统一处理外部请求。数据的裁剪和聚合,根据不同的接口需求,对数据加工后对外提供接口多平台的支持,对不同的客户端提供不同的网关支持。遗留系统的微服务化改造,可以作为新老系统的中转组件。统一处理调用过程中的安全、权限问题。网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注大数据)一个人可以走的很快,但一群人才能走的更远!

m0_75012421的博客 456

DeiT详解:知识蒸馏的Transformer

DeiT模型(8600万参数)仅用一台 GPU 服务器在 53 hours train,20 hours finetune,仅使用 ImageNet 就达到了 84.2 top-1 准确性,而无需使用任何外部数据进行训练,性能与最先进的卷积神经网络(CNN)可以抗衡。其核心是提出了针对 ViT 的教师-学生蒸馏训练策略,并提出了方法,使得在视觉领域训练得又快又好。

走在深度学习前沿的小宋 2637

spring cloud-zuul的Filter详解

在前面我们使用zuul搭建了网关http://blog.youkuaiyun.com/liuchuanhong1/article/details/59056278 关于网关的作用,这里就不再次赘述了,我们今天的重点是zuul的Filter。通过Filter,我们可以实现安全控制的,比如,只有请求参数中有用户名和密码的客户端才能访问服务端的资源。那么如果来实现Filter了? 要想实现Filter,需要

牛奋lch 7万+

2026 Claude Code 标准化前端UI SKILL——Frontend Design

是 Anthropic 官方开源的技能包,在 Claude 官方插件站中排名第一,超过 52k 的下载量。场景推荐方案快速体验批量安装官方 Skills深度设计策略叠加完整打磨流程集成终端跑claude一句话总结:Frontend Design 不是给 AI 加新能力,而是给 AI 加审美标准。它让 AI 从“能画”变成“会设计”——先想清楚风格,再动手写代码。

十年老程序猿,AI 疯狂研究专家,前沿硬核知识分享 3614

Python爬虫博客:如何抓取时事新闻信息 —— 从各大新闻网站获取实时新闻数据

发送请求:向目标新闻网站发送 HTTP 请求,获取网页内容。解析网页:使用解析库(如)从网页中提取新闻标题、摘要、内容、发布时间等。绕过反爬虫机制:使用代理、设置请求头、模拟浏览器行为等策略绕过反爬虫技术。数据存储与清洗:将抓取的数据保存到本地文件或数据库中,并进行清洗,确保数据的可用性。在抓取过程中,我们还会面对很多实际问题,比如反爬虫技术、分页抓取、动态加载的内容等。接下来,我们将逐步介绍如何使用不同技术抓取静态和动态网页,并对抓取的内容进行处理。Scrapy。

2201_76125261的博客 2135

java基础:深入剖析Spring Cloud Zuul

Spring Cloud Zuul是基于Netty和Servlet构建的API网关组件,提供动态路由请求过滤负载均衡和服务发现等核心能力。它作为微服务架构的统一入口,负责接收所有客户端请求,根据预设规则路由至相应服务,并在请求生命周期的不同阶段执行过滤逻辑(如认证授权、日志记录、限流熔断等)。与Spring Cloud生态无缝集成(Eureka、Config等)基于过滤器模式的可扩展架构支持动态配置路由规则提供丰富的监控与指标采集。

weixin_43290370的博客 999

Qt C++ HTTP 调用通义千问大模型 X 学术论文润色工具(SCI 格式适配)

请求地址:`https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation`;| Windows | 打包时携带 `Qt6Network.dll`/`libcrypto-1_1-x64.dll` 等依赖;| Linux | 安装 `libssl-dev` 和 `libcurl4-openssl-dev`;| API 调用失败 | 检查 API-KEY 是否有效;

寒寒豆豆软件公司的博客 104

Spring Cloud Gateway 、Zuul、EdgeService性能对比

关键字:网关,Zuul,Gateway,Spring Cloud, ServiceComb,Edge Service性能测试,微服务 作者 | 李昂 导读 本文对几种流行的 API 网关以关键指标 RPS 为依据,利用 wrk 做出性能测评并且给出结论。本文所有使用的软件、命令、以及代码均在文中注明,以便读者搭建本地环境进行测试。注意性能测试的数据在不同的运行环境中差别较大,但总体上来...

微服务技术与实践专栏 4996

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

第五章 spring cloud zuul

1. 服务路由 将zuul自身注册为eureka服务,和eureka结合使用,eureka自动维护服务实例 2.path+serviceId及路径+服务名的方式实现路由 spring.application.name=mis_zuul_server_1 server.port=端口 ##生产环境 #zuul.routes.mis_dingding_consumer.path=/mis_di...

西瓜 330

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Gatsby 站点接入 TypeScript 全指南:gatsby-plugin-typescript 的配置、使用与编译原理剖析

本篇指南围绕当前仓库 [plugins/gatsby-plugin-typescript](https://link.gitcode.com/i/3790ab212102c598a91cdff86240c80b) 插件展开,讲解如何在 Gatsby 站点中一键开启 TypeScript / TSX 支持:从安装依赖、在 `gatsby-config.js` 中注册插件、在根目录编写 `tsconf

gitblog_00720的博客 1011

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Spring Cloud Zuul

一、zuul是什么 Zuul是spring cloud中的微服务网关。 网关: 是一个网络整体系统中的前置门户入口。请求首先通过网关,进行路径的路由,定位到具体的服务节点上。 Zuul是一个微服务网关,首先是一个微服务。也是会在Eureka、nacos等注册中心中进行服务的注册和发现。也是一个网关,请求应该通过Zuul来进行路由。 Zuul网关不是必要的。是推荐使用的。 使用Zuul,一般在微服务数量较多(多于10个)的时候推荐使用,对服务的管理有严格要求的时候推荐使用,当微服务权限要求

CodingAnHour 462

抖音下载器 douyin-downloader 完整指南:从去水印单条到整站主页批量归档

你盯上一个持续更新的美食博主,想把他 200 条视频按发布时间完整存下来?录屏存不了音画完整的一条,手动点下载更是没完没了。douyin-downloader 就是为此设计的抖音批量下载工具:粘贴链接,无水印、按原画质抓完视频、图集、合集和音乐,还带进度条、失败重试和数据库去重。 它的价值可以压缩成三条: - **无水印 + 画质自选**:自动挑无水印源,默认取最高转码档,也能指定"原画"探测

gitblog_01113的博客 949

Spring Cloud 之Zuul初使用

Spring Cloud 之Zuul初使用 介绍 在微服务架构中,通常会有多个服务提供者。设想一个电商系统,可能会有商品、订单、支付、用户等多个类型的服务,而每个类型的服务数量也会随着整个系统体量的增大也会随之增长和变更。作为UI端,在展示页面时可能需要从多个微服务中聚合数据,而且服务的划分位置结构可能会有所改变。网关就可以对外暴露聚合API,屏蔽内部微服务的微小变动,保持整个系统的稳定性。 当然这只是网关众多功能中的一部分,它还可以做负载均衡,统一鉴权,协议转换,监控监测等一系列功能。 Zuul是Spri

kaven 1092
上一篇: Spring Cloud学习笔记第六章:config
下一篇: Spring Could学习笔记第四章:Hystri
阿偶灬
博客等级 码龄12年 2粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值