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



推荐阅读
  • 优化SQL Server批量数据插入存储过程的实现
    本文介绍了一种改进的SQL Server存储过程,用于生成批量插入语句。该方法不仅提高了性能,还支持单行和多行模式,适用于SQL Server 2005及以上版本。 ... [详细]
  • Spring Cloud学习指南:深入理解微服务架构
    本文介绍了微服务架构的基本概念及其在Spring Cloud中的实现。讨论了微服务架构的主要优势,如简化开发和维护、快速启动、灵活的技术栈选择以及按需扩展的能力。同时,也探讨了微服务架构面临的挑战,包括较高的运维要求、分布式系统的复杂性、接口调整的成本等问题。最后,文章提出了实施微服务时应遵循的设计原则。 ... [详细]
  • Spring Cloud Config 使用 Vault 作为配置存储
    本文探讨了如何在Spring Cloud Config中集成HashiCorp Vault作为配置存储解决方案,基于Spring Cloud Hoxton.RELEASE及Spring Boot 2.2.1.RELEASE版本。文章还提供了详细的配置示例和实践建议。 ... [详细]
  • 本文介绍如何使用 Angular 6 的 HttpClient 模块来获取 HTTP 响应头,包括代码示例和常见问题的解决方案。 ... [详细]
  • Nginx 反向代理与负载均衡实验
    本实验旨在通过配置 Nginx 实现反向代理和负载均衡,确保从北京本地代理服务器访问上海的 Web 服务器时,能够依次显示红、黄、绿三种颜色页面以验证负载均衡效果。 ... [详细]
  • 本文介绍了如何使用JavaScript的Fetch API与Express服务器进行交互,涵盖了GET、POST、PUT和DELETE请求的实现,并展示了如何处理JSON响应。 ... [详细]
  • 使用Nginx反向代理实现多域名端口映射
    本文介绍如何通过配置本地hosts文件和Nginx反向代理,实现多个虚拟域名的端口映射,使用户可以通过标准HTTP端口80访问不同后端服务。 ... [详细]
  • 并发编程 12—— 任务取消与关闭 之 shutdownNow 的局限性
    Java并发编程实践目录并发编程01——ThreadLocal并发编程02——ConcurrentHashMap并发编程03——阻塞队列和生产者-消费者模式并发编程04——闭锁Co ... [详细]
  • 程序员如何优雅应对35岁职业转型?这里有深度解析
    本文探讨了程序员在职业生涯中如何通过不断学习和技能提升,优雅地应对35岁左右的职业转型挑战。我们将深入分析当前热门技术趋势,并提供实用的学习路径。 ... [详细]
  • 本文详细介绍了如何在 Android 中使用值动画(ValueAnimator)来动态调整 ImageView 的高度,并探讨了相关的关键属性和方法,包括图片填充后的高度、原始图片高度、动画变化因子以及布局重置等。 ... [详细]
  • 深入解析Spring Cloud微服务架构与分布式系统实战
    本文详细介绍了Spring Cloud在微服务架构和分布式系统中的应用,结合实际案例和最新技术,帮助读者全面掌握微服务的实现与优化。 ... [详细]
  • 最新计算机专业原创毕业设计参考选题都有源码+数据库是近期作品ling取参考你的选题刚好在下面有,有时间看到机会给您发1ssm资源循环利用2springboot校园考勤系统3ssm防 ... [详细]
  • 本文探讨了2019年前端技术的发展趋势,包括工具化、配置化和泛前端化等方面,并提供了详细的学习路线和职业规划建议。 ... [详细]
  • 本文详细介绍了JSP(Java Server Pages)的九大内置对象及其功能,探讨了JSP与Servlet之间的关系及差异,并提供了实际编码示例。此外,还讨论了网页开发中常见的编码转换问题以及JSP的两种页面跳转方式。 ... [详细]
  • Barbican 是 OpenStack 社区的核心项目之一,旨在为各种环境下的云服务提供全面的密钥管理解决方案。 ... [详细]
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社区 版权所有