Spring Cloud入门之Zuul

2024-06-10 02:18
文章标签 java 入门 spring cloud zuul

本文主要是介绍Spring Cloud入门之Zuul,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原文链接:http://www.dubby.cn/detail.html?id=9009

网关(Gateway)

首先需要考虑,为什么会有网关这个东西呢?他是个什么东西?

经过之前的学习,我们脑海中复现的整个Spring Cloud大概是有服务注册中心(Eureka Server),服务(Eureka Client,Ribbon,Feign,Hystrix等),其中服务之间互相调用,呈网状结构,大致如下图所示:

我们先考虑一下负载均衡这一层,一般这一层都会是一些硬件负载均衡或者软件负载均衡组成,常见的有F5、Nginx(或者Openresty,支持Lua扩展)等。这有一个缺点,就是路由需要手动配置,或者是写个扩展,提供一个管理后台来配置路由关系,其实本质是一样的。这个到后期往往比较难以维护(并不是不可维护,其实这种方式我所知道的很多公司都是这么做的)。

再考虑一个问题,如果你的系统需要用户登录才可以访问某些服务,那么用户的登录状态解析该由谁来负责呢?你的请求希望加密,这种逻辑该由谁来做呢?我们可以在每个服务里做,用户登录态解析,做请求加密。不过,缺点很明显,不统一以后逻辑改变,或者升级难度太大,需要每个服务来配合(这点笔者深有体会)。

为了解决上述问题,API网关应运而生。这是一个景点的Facade模式,是整个微服务系统的门面。他是怎么解决的这些问题的呢?

  • 和Eureka结合,自动维护服务信息,减少手工配置
  • 对于签名,安全校验等,可以使用Zuul提供的Filter机制实现

快速入门

搭建项目

前提是你已经在本地运行起来eureka-server,demo-service,ribbon-consumer或者feign-consumer。

名字就叫Zuul吧,依赖如下:

    <dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-zuul</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-eureka</artifactId></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Brixton.SR5</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement>

在启动类上修饰:

@EnableZuulProxy
@SpringCloudApplication
public class Application {public static void main(String[] args) {new SpringApplicationBuilder(Application.class).web(true).run(args);}
}

创建application.properties:

spring.application.name=api-gateway
server.port=5555zuul.routes.a.path=/a/**
zuul.routes.a.url=ribbon-consumerzuul.routes.b.path=/b/**
zuul.routes.b.url=feign-consumereureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/

然后启动。

面向服务的路由

你访问http:localhost:5555/a/hello的时候,这个URL符合/a/**的规则,所以被转发给ribbon-consumer,这个服务实例的信息会从eureka-server上获取,不需要自己配置服务信息。

通过这种方式,我们极大的减少配置信息,让维护变得简单。

请求过滤

@Component
public class AccessFilter extends ZuulFilter {private static final Logger logger = LoggerFactory.getLogger(AccessFilter.class);@Overridepublic String filterType() {return "pre";}@Overridepublic int filterOrder() {return 0;}@Overridepublic boolean shouldFilter() {return true;}@Overridepublic Object run() {logger.info("AccessFilter run");RequestContext requestContext = RequestContext.getCurrentContext();HttpServletRequest httpServletRequest = requestContext.getRequest();logger.info(httpServletRequest.getRequestURI());Object accessToken = httpServletRequest.getParameter("accessToken");if (accessToken == null) {requestContext.setSendZuulResponse(false);requestContext.setResponseStatusCode(401);return null;} else {}logger.info("access token ok");return null;}
}

简单解释一下上面的代码:

  • filterType:过滤器的类型,pre代表请求在被路由之前执行
  • filterOrder:过滤器的执行顺序,根据这个返回值来依次执行
  • shouldFilter:判断是否需要被过滤
  • run:过滤的具体逻辑,这里通过requestContext.setSendZuulResponse(false);来过滤请求,不对骑进行路由,通过requestContext.setResponseStatusCode(401);设置返回状态码,也可以通过requestContext.setResponseBody(body);来设置内容

这样的话,你需要访问http:localhost:5555/a/hello?token=abc才能正确返回,不然的话,只能得到一个401的错误码。

再谈服务路由

忽略服务

上文提过的,面向服务的路由可以这么配置:

zuul.routes.a.path=/a/**
zuul.routes.a.url=ribbon-consumerzuul.routes.b.path=/b/**
zuul.routes.b.url=feign-consumer

但是,其实服务的serviceId,Zuul是可以通过eureka-server拿到的,服务信息也是可以拿到的,所以Zuul提供了另一种更为方便的路由规则,也就是path的前缀使用serviceId,假设serviceId为hello-service:

zuul.routes.hello-service.path=/hello-service/**
zuul.routes.hello-service.url=hello-service

对于这样的配置,其实就是Zuul默认的路由规则,也就是说我们根本不需要配置这一条,Zuul也可以帮我们实现。

这样会有个问题,有部分服务不希望对外开放,也就是不希望被路由到,那么我们可以选择忽略他,zuul.ignored-services=*的意思是忽略所有的路由,也就是禁用了Zuul帮你自动路由,也可以配置serviceId,多个用逗号隔开。

服务路径匹配

上面用的一直都是zuul.routes.hello-service.path=/hello-service/**这种形式的路径,那么这个代表什么意思呢?

通配符说明
?匹配任意单个字符
*匹配任意数量的字符
**匹配任意数量的字符,支持多及目录

忽略表达式

还可以设置一个被路由忽略的表达式,也就是不被路由,那就是zuul.ignored-patterns

如果你不希望/hello被路由,你可以这么设置:

zuul.ignored-patterns=/**/hello/**

这个配置是会对所有的路由生效的,所以不要忽略了不该忽略的URL。

这篇关于Spring Cloud入门之Zuul的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1046958

相关文章

SpringBoot使用Apache Tika检测敏感信息

《SpringBoot使用ApacheTika检测敏感信息》ApacheTika是一个功能强大的内容分析工具,它能够从多种文件格式中提取文本、元数据以及其他结构化信息,下面我们来看看如何使用Ap... 目录Tika 主要特性1. 多格式支持2. 自动文件类型检测3. 文本和元数据提取4. 支持 OCR(光学

Java内存泄漏问题的排查、优化与最佳实践

《Java内存泄漏问题的排查、优化与最佳实践》在Java开发中,内存泄漏是一个常见且令人头疼的问题,内存泄漏指的是程序在运行过程中,已经不再使用的对象没有被及时释放,从而导致内存占用不断增加,最终... 目录引言1. 什么是内存泄漏?常见的内存泄漏情况2. 如何排查 Java 中的内存泄漏?2.1 使用 J

JAVA系统中Spring Boot应用程序的配置文件application.yml使用详解

《JAVA系统中SpringBoot应用程序的配置文件application.yml使用详解》:本文主要介绍JAVA系统中SpringBoot应用程序的配置文件application.yml的... 目录文件路径文件内容解释1. Server 配置2. Spring 配置3. Logging 配置4. Ma

Java 字符数组转字符串的常用方法

《Java字符数组转字符串的常用方法》文章总结了在Java中将字符数组转换为字符串的几种常用方法,包括使用String构造函数、String.valueOf()方法、StringBuilder以及A... 目录1. 使用String构造函数1.1 基本转换方法1.2 注意事项2. 使用String.valu

java脚本使用不同版本jdk的说明介绍

《java脚本使用不同版本jdk的说明介绍》本文介绍了在Java中执行JavaScript脚本的几种方式,包括使用ScriptEngine、Nashorn和GraalVM,ScriptEngine适用... 目录Java脚本使用不同版本jdk的说明1.使用ScriptEngine执行javascript2.

Spring MVC如何设置响应

《SpringMVC如何设置响应》本文介绍了如何在Spring框架中设置响应,并通过不同的注解返回静态页面、HTML片段和JSON数据,此外,还讲解了如何设置响应的状态码和Header... 目录1. 返回静态页面1.1 Spring 默认扫描路径1.2 @RestController2. 返回 html2

Spring常见错误之Web嵌套对象校验失效解决办法

《Spring常见错误之Web嵌套对象校验失效解决办法》:本文主要介绍Spring常见错误之Web嵌套对象校验失效解决的相关资料,通过在Phone对象上添加@Valid注解,问题得以解决,需要的朋... 目录问题复现案例解析问题修正总结  问题复现当开发一个学籍管理系统时,我们会提供了一个 API 接口去

Java操作ElasticSearch的实例详解

《Java操作ElasticSearch的实例详解》Elasticsearch是一个分布式的搜索和分析引擎,广泛用于全文搜索、日志分析等场景,本文将介绍如何在Java应用中使用Elastics... 目录简介环境准备1. 安装 Elasticsearch2. 添加依赖连接 Elasticsearch1. 创

Spring核心思想之浅谈IoC容器与依赖倒置(DI)

《Spring核心思想之浅谈IoC容器与依赖倒置(DI)》文章介绍了Spring的IoC和DI机制,以及MyBatis的动态代理,通过注解和反射,Spring能够自动管理对象的创建和依赖注入,而MyB... 目录一、控制反转 IoC二、依赖倒置 DI1. 详细概念2. Spring 中 DI 的实现原理三、

SpringBoot 整合 Grizzly的过程

《SpringBoot整合Grizzly的过程》Grizzly是一个高性能的、异步的、非阻塞的HTTP服务器框架,它可以与SpringBoot一起提供比传统的Tomcat或Jet... 目录为什么选择 Grizzly?Spring Boot + Grizzly 整合的优势添加依赖自定义 Grizzly 作为