热门标签 | 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参数,正常获得数据:



推荐阅读
  • 本文详细介绍如何利用已搭建的LAMP(Linux、Apache、MySQL、PHP)环境,快速创建一个基于WordPress的内容管理系统(CMS)。WordPress是一款流行的开源博客平台,适用于个人或小型团队使用。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • XNA 3.0 游戏编程:从 XML 文件加载数据
    本文介绍如何在 XNA 3.0 游戏项目中从 XML 文件加载数据。我们将探讨如何将 XML 数据序列化为二进制文件,并通过内容管道加载到游戏中。此外,还会涉及自定义类型读取器和写入器的实现。 ... [详细]
  • FinOps 与 Serverless 的结合:破解云成本难题
    本文探讨了如何通过 FinOps 实践优化 Serverless 应用的成本管理,提出了首个 Serverless 函数总成本估计模型,并分享了多种有效的成本优化策略。 ... [详细]
  • 2018-2019学年第六周《Java数据结构与算法》学习总结
    本文总结了2018-2019学年第六周在《Java数据结构与算法》课程中的学习内容,重点介绍了非线性数据结构——树的相关知识及其应用。 ... [详细]
  • JavaScript中的数组是数据集合的核心结构之一,内置了多种实用的方法。掌握这些方法不仅能提高开发效率,还能显著提升代码的质量和可读性。本文将详细介绍数组的创建方式及常见操作方法。 ... [详细]
  • 本文介绍如何在Grafana配置面板时,使用JSONNet获取数组中特定元素的位置,并将其应用于动态服务查询。 ... [详细]
  • 本文档汇总了Python编程的基础与高级面试题目,涵盖语言特性、数据结构、算法以及Web开发等多个方面,旨在帮助开发者全面掌握Python核心知识。 ... [详细]
  • 本文详细探讨了在微服务架构中,使用Feign进行远程调用时出现的请求头丢失问题,并提供了具体的解决方案。重点讨论了单线程和异步调用两种场景下的处理方法。 ... [详细]
  • 本文详细记录了在基于Debian的Deepin 20操作系统上安装MySQL 5.7的具体步骤,包括软件包的选择、依赖项的处理及远程访问权限的配置。 ... [详细]
  • 本文探讨了 RESTful API 和传统接口之间的关键差异,解释了为什么 RESTful API 在设计和实现上具有独特的优势。 ... [详细]
  • 本文详细介绍了如何使用Spring Boot进行高效开发,涵盖了配置、实例化容器以及核心注解的使用方法。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • Python自动化处理:从Word文档提取内容并生成带水印的PDF
    本文介绍如何利用Python实现从特定网站下载Word文档,去除水印并添加自定义水印,最终将文档转换为PDF格式。该方法适用于批量处理和自动化需求。 ... [详细]
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社区 版权所有