热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SpringCloud路由网关深度解析:Zuul的核心功能与应用场景

本文深入解析了SpringCloud路由网关Zuul的核心功能及其典型应用场景。通过对方志朋老师教材的学习和实践,详细探讨了Zuul在微服务架构中的重要作用,包括请求路由、过滤器链管理以及服务动态扩展等关键特性。同时,结合实际案例,展示了Zuul在高并发和复杂业务场景下的应用优势,为读者提供了全面的技术参考。

此文章是看了方志朋老师的教材自己写的框架demo:

学习spring cloud推荐大家看下方志朋老师的史上最简单的 SpringCloud 教程 | 终章,地址如下:

   https://blog.csdn.net/forezp/article/details/70148833 

1.简介与作用

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

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

 

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

2.代码实现(路由)

2.1 创建maven项目




2.2 pom.xml添加依赖

<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">

  <modelVersion>4.0.0modelVersion>

  <groupId>com.immogroupId>

  <artifactId>immo-zuulartifactId>

  <version>0.0.1-SNAPSHOTversion>

   

  <parent>

        <groupId>org.springframework.bootgroupId>

        <artifactId>spring-boot-starter-parentartifactId>

        <version>1.5.2.RELEASEversion>

        <relativePath/> 

   parent>

   

   

   <properties>

        <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>

        <project.reporting.outputEncoding>UTF-8project.reporting.outputEncoding>

        <java.version>1.7java.version>

    properties>

    

    <dependencies>

    

        <dependency>

            <groupId>org.springframework.cloudgroupId>

            <artifactId>spring-cloud-starter-eurekaartifactId>

            <version>1.3.4.RELEASEversion>

        dependency>

        

        

        <dependency>

            org.springframework.cloud

            spring-cloud-starter-zuul

            1.3.4.RELEASE

        dependency>

        

        

        <dependency>

            <groupId>org.springframework.bootgroupId>

            <artifactId>spring-boot-starter-webartifactId>

        dependency>

 

    dependencies>

project>

 

2.3 添加启动类

src/main/java 下新建包 com.immo  创建 ZuulApplication.java

src/main/resources 下新建 application.properties


编写ZuulApplication.java

@EnableZuulProxy,开启zuul的功能

package com.immo;

 

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;

 

@EnableZuulProxy

@EnableEurekaClient

@SpringBootApplication

public class ZuulApplication {

 public static void main(String[] args) {

        SpringApplication.run(ZuulApplication.class,args);

 }

}

 

 

编写application.properties

#发布到的eureka地址

eureka.client.serviceUrl.defaultZOne=http://localhost:9000/eureka/

#端口

server.port=8080

#此项目的服务名称

spring.application.name=immo-zuul

#路由配置

zuul.routes.api-a.path= /api-a/**

zuul.routes.api-a.serviceId: immo-feign

#路由配置

zuul.routes.api-b.path: /api-b/**

zuul.routes.api-b.serviceId: immo-client

 

注:如果没有设置路由配置也可以通过 localhost:8080/服务名/** 来访问

2.4测试(路由)

先后启动immo-eurekaimmo-clientimmo-feignimmo-zuul这四个项目:


访问 http://localhost:8080/api-a/getServerName 


访问 http://localhost:8080/api-b/getServerName 


证明路由起作用了

注:如果没有设置路由配置也可以通过 localhost:8080/服务名/** 来访问




3.代码实现(过滤)

zuul不仅只是路由,并且还能过滤,做一些安全验证。继续改造工程创建包com.immo.filter,在包下创建MyFilter.java

编写MyFilter.java

filterType:返回一个字符串代表过滤器的类型,在zuul中定义了四种不同生命周期的过滤器类型,具体如下:

· pre:路由之前

· routing:路由之时

· post: 路由之后

· error:发送错误调用

· filterOrder:过滤的顺序

· shouldFilter:这里可以写逻辑判断,是否要过滤,本文true,永远过滤。

· run:过滤器的具体逻辑。可用很复杂,包括查sqlnosql去判断该请求到底有没有权限访问

package com.immo.filter;

 

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Component;

import com.netflix.zuul.ZuulFilter;

import com.netflix.zuul.context.RequestContext;

 

@Component

public class MyFilter extends ZuulFilter{

 

    @Override

    public String filterType() {

        return "pre";

    }

 

    @Override

    public int filterOrder() {

        return 0;

    }

 

    @Override

    public boolean shouldFilter() {

        return true;

    }

 

    @Override

    public Object run() {

        RequestContext ctx = RequestContext.getCurrentContext();

        HttpServletRequest request = ctx.getRequest();

        Object accessToken = request.getParameter("param");

        if(accessToken == null) {

            ctx.setSendZuulResponse(false);

            ctx.setResponseStatusCode(401);

            try {

            HttpServletResponse response = ctx.getResponse();

            response.setCharacterEncoding("utf-8");

            response.getWriter().write("沒有携带参数,拦截!");

            }catch (Exception e){

            e.printStackTrace();

            }

            return null;

        }

        return null;

    }

}

 

 

 

 

测试,先后启动immo-eurekaimmo-clientimmo-feignimmo-zuul这四个项目:

访问刚刚访问过的接口,因为没有携带param接口给我们返回了提示信息,证明过滤了:

再次访问,携带param参数,正常获得数据:



推荐阅读
  • 2019年后蚂蚁集团与拼多多面试经验详述与深度剖析
    2019年后蚂蚁集团与拼多多面试经验详述与深度剖析 ... [详细]
  • 如果程序使用Go语言编写并涉及单向或双向TLS认证,可能会遭受CPU拒绝服务攻击(DoS)。本文深入分析了CVE-2018-16875漏洞,探讨其成因、影响及防范措施,为开发者提供全面的安全指导。 ... [详细]
  • 分布式开源任务调度框架 TBSchedule 深度解析与应用实践
    本文深入解析了分布式开源任务调度框架 TBSchedule 的核心原理与应用场景,并通过实际案例详细介绍了其部署与使用方法。首先,从源码下载开始,详细阐述了 TBSchedule 的安装步骤和配置要点。接着,探讨了该框架在大规模分布式环境中的性能优化策略,以及如何通过灵活的任务调度机制提升系统效率。最后,结合具体实例,展示了 TBSchedule 在实际项目中的应用效果,为开发者提供了宝贵的实践经验。 ... [详细]
  • IIS配置大全:从基础到高级的全面指南
    IIS配置详解:从基础到高级的全面指南IIS前端配置与web.config文件紧密相关,相互影响。本文详细介绍了如何设置允许通过的HTTP请求方法,包括HEAD、POST、GET、TRACE和OPTIONS。提供了两种主要的配置方法,并探讨了它们在实际应用中的优缺点。此外,还深入讲解了其他高级配置选项,帮助读者全面提升IIS服务器的性能和安全性。 ... [详细]
  • 本文深入探讨了 Spring Cloud 微服务架构中 Gateway 组件的应用,详细介绍了其在实现高效请求路由与过滤方面的关键作用。文章首先从基本配置入手,逐步讲解了如何通过静态路由和动态路由实现灵活的服务访问控制。此外,还特别介绍了如何配置 Gateway 以自动从 Nacos 服务注册中心拉取服务列表,进一步提升系统的可维护性和扩展性。 ... [详细]
  • 黄聪:MySQL主从复制配置,实现高效读写分离
    大型网站为应对高并发访问,不仅需要在前端实现分布式负载均衡,还需在数据业务和访问层采取有效措施。采用传统的数据结构已无法满足需求,通过配置MySQL主从复制,可实现高效的读写分离,显著提升系统性能和稳定性。 ... [详细]
  • 设计实战 | 10个Kotlin项目深度解析:首页模块开发详解
    设计实战 | 10个Kotlin项目深度解析:首页模块开发详解 ... [详细]
  • 本文探讨了利用Java实现WebSocket实时消息推送技术的方法。与传统的轮询、长连接或短连接等方案相比,WebSocket提供了一种更为高效和低延迟的双向通信机制。通过建立持久连接,服务器能够主动向客户端推送数据,从而实现真正的实时消息传递。此外,本文还介绍了WebSocket在实际应用中的优势和应用场景,并提供了详细的实现步骤和技术细节。 ... [详细]
  • Java中处理NullPointerException:getStackTrace()方法详解与实例代码 ... [详细]
  • RxJava 中 Observable.singleElement() 方法详解与实例代码分析 ... [详细]
  • Android 图像色彩处理技术详解
    本文详细探讨了 Android 平台上的图像色彩处理技术,重点介绍了如何通过模仿美图秀秀的交互方式,利用 SeekBar 实现对图片颜色的精细调整。文章展示了具体的布局设计和代码实现,帮助开发者更好地理解和应用图像处理技术。 ... [详细]
  • 本课程详细介绍了如何使用Python Flask框架从零开始构建鱼书应用,涵盖高级编程技巧和实战项目。通过视频教学,学员将学习到Flask的高效用法,包括数据库事务处理和书籍交易模型的实现。特别感谢AI资源网提供的课程下载支持。 ... [详细]
  • IIS 7及7.5版本中应用程序池的最佳配置策略与实践
    在IIS 7及7.5版本中,优化应用程序池的配置是提升Web站点性能的关键步骤。具体操作包括:首先定位到目标Web站点的应用程序池,然后通过“应用程序池”菜单找到对应的池,右键选择“高级设置”。在一般优化方案中,建议调整以下几个关键参数:1. **基本设置**: - **队列长度**:默认值为1000,可根据实际需求调整队列长度,以提高处理请求的能力。此外,还可以进一步优化其他参数,如处理器使用限制、回收策略等,以确保应用程序池的高效运行。这些优化措施有助于提升系统的稳定性和响应速度。 ... [详细]
  • 如何在主服务器响应变慢时,自动切换至备用服务器地址以确保服务连续性
    在主服务器响应速度下降时,如何通过编程实现自动切换至备用服务器地址,以确保服务的连续性和稳定性。本文将介绍一种基于PHP和MySQL的解决方案,通过监测主服务器的响应时间,当检测到延迟过高时,自动切换至备用服务器接口,从而保障系统的高可用性。 ... [详细]
  • Zuul过滤器:深入解析与应用优化
    在服务网关中实现过滤器,只需继承抽象类并实现其定义的四个关键方法,即可对请求进行拦截和处理。过滤器具有两大核心功能:一是路由功能,负责将外部请求转发至具体的微服务实例,实现外部访问的统一入口;二是过滤功能,用于对请求进行预处理和后处理,增强系统的安全性和性能。通过合理配置和优化过滤器,可以显著提升服务网关的整体效能。 ... [详细]
author-avatar
讨厌上学的-彭志超-_354
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有