在微服务架构中,后端服务往往不直接开放给调用端,而是通过一个API网关根据请求的url,路由到相应的服务。当添加API网关后,在第三方调用端和服务提供方之间就创建了一面墙,这面墙直接与调用方通信进行权限控制,后将请求均衡分发给后台服务端。
一个简单的微服务架构已经跃然纸面:
在Spring Cloud微服务系统中,一种常见的负载均衡方式是,客户端的请求首先经过负载均衡(zuul、Ngnix、F5),再到达服务网关(zuul集群),然后再到具体的服务,服务统一注册到高可用的服务注册中心集群,服务的所有的配置文件由配置服务管理,配置服务的配置文件放在git仓库,方便开发人员随时改配置。
1. 为什么需要API Gateway?
1.1 简化客户端调用复杂度
在微服务架构模式下后端服务的实例数一般是动态的,对于客户端而言很难发现动态改变的服务实例的访问地址信息。因此在基于微服务的项目中为了简化前端的调用逻辑,通常会引入API Gateway作为轻量级网关,同时API Gateway中也会实现相关的认证逻辑从而简化内部服务之间相互调用的复杂度。
1.2 数据裁剪以及聚合
通常而言不同的客户端对于显示时对于数据的需求是不一致的,比如手机端或者Web端又或者在低延迟的网络环境或者高延迟的网络环境。
因此为了优化客户端的使用体验,API Gateway可以对通用性的响应数据进行裁剪以适应不同客户端的使用需求。同时还可以将多个API调用逻辑进行聚合,从而减少客户端的请求数,优化客户端用户体验
1.3 多渠道支持
当然我们还可以针对不同的渠道和客户端提供不同的API Gateway,对于该模式的使用由另外一个大家熟知的方式叫Backend for front-end, 在Backend for front-end模式当中,我们可以针对不同的客户端分别创建其BFF。
1.4 遗留系统的微服务化改造
对于系统而言进行微服务改造通常是由于原有的系统存在或多或少的问题,比如技术债务,代码质量,可维护性,可扩展性等等。API Gateway的模式同样适用于这一类遗留系统的改造,通过微服务化的改造逐步实现对原有系统中的问题的修复,从而提升对于原有业务响应力的提升。通过引入抽象层,逐步使用新的实现替换旧的实现。
在Spring Cloud体系中, Spring Cloud Zuul就是提供负载均衡、反向代理、权限认证的一个API gateway。
在开始聊Zuul如何使用之前,先讲一个比较有意思的事情,就是在springcloud组件中,服务网关这个组件,springcloud提供了两种选择,一个是netflix公司开源的Zuul,还有一个是springcloud自己开源的Spring Cloud Gateway。
2. Spring Cloud Zuul
2.1 简单使用
Spring Cloud Zuul路由是微服务架构的不可或缺的一部分,提供动态路由,监控,弹性,安全等的边缘服务。Zuul是Netflix出品的一个基于JVM路由和服务端的负载均衡器。
下面我们来看一下Zuul最简单的使用方式,创建zuul-simple工程
2.1 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 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.6.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.springcloud</groupId> <artifactId>zuul-simple</artifactId> <version>0.0.1-SNAPSHOT</version> <name>zuul-simple</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> <spring-cloud.version>Greenwich.SR1</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-zuul</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>${spring-cloud.version}</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> </project>
引入spring-cloud-starter-netflix-zuul包
2.2 配置文件application.yml
server: port: 8080 spring: application: name: spring-cloud-zuul zuul: routes: baidu: path: /baidu/** url: https://www.baidu.com/
这里的配置表示,访问/baidu/ 直接重定向到https://www.baidu.com/
如果直接访问http://localhost:8080/baidu,则会直接跳转到https://www.baidu.com/。
2.3 启动类
package com.springcloud.zuulsimple; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.zuul.EnableZuulProxy; @SpringBootApplication @EnableZuulProxy public class ZuulSimpleApplication { public static void main(String[] args) { SpringApplication.run(ZuulSimpleApplication.class, args); } }
启动类添加@EnableZuulProxy,支持网关路由。
史上最简单的zuul案例就配置完了
2.4 测试
启动项目,在浏览器访问http://localhost:8080/baidu/,我们可以看到页面已经跳转到百度首页。
再尝试访问http://localhost:8080/baidu/aa,我们可以看到页面跳转至:https://www.baidu.com/search/error.html, 因为https://www.baidu.com/aa 这个链接不存在, 所以百度帮我们跳转到的error页面。
至此,Zuul简单使用已经介绍完毕,下面我们来聊一下服务化的方式。
2.2 服务化
通过url映射的方式来实现Zuul的转发有局限性,比如每增加一个服务就需要配置一条内容,另外后端的服务如果是动态来提供,就不能采用这种方案来配置了。实际上在实现微服务架构时,服务名与服务实例地址的关系在eureka server中已经存在了,所以只需要将Zuul注册到eureka server上去发现其他服务,就可以实现对serviceId的映射。
我们结合示例来说明,在上面示例项目基础上来进行改造
2.2.1 添加依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
增加spring-cloud-starter-netflix-eureka-client包,添加对eureka的支持。
2.2.2 配置文件application.yml
server: port: 8080 spring: application: name: spring-cloud-zuul zuul: routes: api-producer: path: /producer/** serviceId: spring-cloud-producer eureka: client: service-url: defaultZone: http://localhost:8761/eureka/
在这里我们增加了对服务的支持,这里的Zuul配置的含义为访问/producer/**,转向到eureka上面serviceId为spring-cloud-producer的服务。
2.2.3 测试
先从上一篇的项目中copy Eureka到本篇的文件夹中,再从第五篇的项目中copy一个producer到本篇的文件夹中。
依次启动eureka,producer和Zuul.
我们打开浏览器访问:http://localhost:8080/producer/hello?name=spring, 可以看到页面正常显示producer的响应:hello spring,producer is ready。说明通过zuul成功调用了producer服务。
这里producer可以启动两个服务,多次刷新http://localhost:8080/producer/hello?name=spring, 可以看到Zuul对服务的调用是负载均衡的。
2.3 网关的默认路由
但是如果后端服务多达十几个的时候,每一个都这样配置也挺麻烦的,spring cloud zuul已经帮我们做了默认配置。默认情况下,Zuul会代理所有注册到Eureka Server的微服务,并且Zuul的路由规则如下:http://ZUUL_HOST:ZUUL_PORT/微服务在Eureka上的serviceId/**会被转发到serviceId对应的微服务。
我们注销掉zuul-simple配置文件中有关路由的配置。
#zuul: # routes: # api-producer: # path: /producer/** # serviceId: spring-cloud-producer
再次启动Zuul。
我们在浏览器中访问http://localhost:8080/spring-cloud-producer/hello?name=spring,可以看到和上面一样的返回结果,说明Spring cloud zuul默认已经提供了转发功能。
到此zuul的基本使用我们就聊完了。
相关推荐
史上最简单的SpringCloud教程 | 第九篇: 服务链路追踪(Spring Cloud Sleuth)(Finchley版本) 史上最简单的SpringCloud教程 | 第十篇: 高可用的服务注册中心(Finchley版本) 史上最简单的SpringCloud教程 | 第十二篇: ...
在本教程中,我们将深入探讨Spring Cloud的基础概念,并专注于如何创建一个服务消费者,利用RESTful API和Ribbon组件。Spring Cloud是微服务架构中的一个重要工具集,它简化了配置和服务发现,使得开发者能够轻松地...
springcloud入门代码基于Spring Cloud实现的服务网关Zuul源代码 安装教程 Zuul pom.xml <groupId>org.springframework.cloud <artifactId>spring-cloud-starter-netflix-zuul application.yml server:...
Spring Cloud Zuul:API网关服务详解 Spring Cloud Zuul 是 Spring Cloud Netflix 子项目的核心组件之一,可以作为微服务架构中的 API 网关使用,支持动态路由与过滤功能。API 网关为微服务架构中的服务提供了统一...
SpringCloud Zuul是基于Spring Cloud框架的一个核心组件,它扮演着API网关的角色,负责路由转发、过滤器处理以及安全控制等任务。Zuul的主要功能包括动态路由、过滤器机制、安全控制、负载均衡、健康检查等。下面将...
Spring Cloud 是一个基于 Spring Boot 实现的云应用开发工具包,它为开发者提供了在分布式系统(如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话、集群状态)...
第九课: 服务链路追踪(Spring Cloud Sleuth) 第十课: 高可用的服务注册中心 第十一课:docker部署spring cloud项目 第十二课: 断路器监控(Hystrix Dashboard) 第十三课: 断路器聚合监控(Hystrix Turbine) 第十...
SpringCloud Zuul Gateway 服务网关是Spring Cloud生态系统中的一个重要组件,它主要负责微服务架构中的路由转发和过滤器功能。Zuul是Netflix开源的一个边缘服务,而Gateway则是Spring Cloud针对Zuul进行的升级版,...
Spring Cloud 使用 Zuul 实现 API 网关服务问题 在本文中,我们将主要介绍如何使用 Spring Cloud 的 Zuul 组件来实现 API 网关服务问题。 Zuul 是一个基于 Netflix Zuul 的 API 网关组件,它可以解决路由规则和服务...
gateway-service-zuul:Spring Cloud Zuul使用初级篇 网关 均衡负载 spring-cloud-zuul:Spring Cloud Zuul使用高级篇 Filter 鉴权 熔断 重试 spring-cloud-sleuth-zipkin: 利用Sleuth、Zipkin对Spring Cloud应用...
Spring Cloud Zuul网关 Spring Cloud Zuul网关是微服务架构中的一种网关解决方案,主要用于解决微服务之间的调用和路由问题。在本章节中,我们将了解Zuul网关的基本概念和使用方法,以及如何将其应用于微服务架构...
首先,我们需要了解SpringCloud的基础架构,它由多个子项目组成,如Eureka(服务注册与发现)、Zuul(边缘服务/API网关)、Hystrix(断路器)、Feign(声明式客户端)等。这些组件共同构建了一个完整的微服务生态...
在微服务架构中,Spring Cloud Zuul 是一个重要的组件,它作为边缘服务或者说是路由网关,承担着请求分发、过滤以及安全控制等职责。本文将深入探讨Spring Cloud Zuul 的核心概念、功能和使用方法。 首先,Zuul 是 ...
《Spring Cloud Zuul:构建微服务的路由网关》 Spring Cloud Zuul 是一个基于 Netflix Zuul 的微服务网关,它提供了动态路由、过滤器以及面向服务的路由功能,是构建分布式系统的重要组件。在Spring Cloud生态中,...
《Spring Cloud实战教程》是一本全面且深入的指南,旨在帮助开发者从初识到精通Spring Cloud,从而在微服务架构领域建立起坚实的基础。Spring Cloud作为Java领域的热门框架,为构建分布式系统提供了丰富的工具集,...
SpringCloud Zuul是Spring Cloud生态系统中的一个边缘服务和API网关组件。它的主要功能是作为微服务架构中的统一入口,负责路由转发、过滤器处理、负载均衡以及安全控制等任务。Zuul允许开发者在微服务架构中实现...
Spring Cloud微服务架构中,Zuul作为路由网关起着至关重要的作用。Zuul网关是Netflix开源的Java编写的API网关服务,它能够帮助我们实现路由转发、过滤器功能,简化了服务的动态路由、监控、弹性、安全性的处理。在...
springcloud:Zuul动态网关demo源码案例演示
gateway-service-zuul:Spring Cloud Zuul使用初级篇 网关 均衡负载 spring-cloud-zuul:Spring Cloud Zuul使用高级篇 Filter 鉴权 熔断 重试 spring-cloud-sleuth-zipkin: 利用Sleuth、Zipkin对Spring Cloud应用...
在本篇学习笔记中,我们将深入探讨Spring Cloud框架中的一个重要组件——Spring Cloud Zuul,它是一个强大的路由网关。Zuul的主要职责是为微服务架构提供统一的入口,进行请求过滤、路由转发等操作,使得后端服务对...