JAVA springboot ssm b2b2c多用户商城系统源码(十):服务网关zuul初级篇

news/2024/11/6 13:28:04

为什么需要API Gateway

1、简化客户端调用复杂度

在微服务架构模式下后端服务的实例数一般是动态的,对于客户端而言很难发现动态改变的服务实例的访问地址信息。因此在基于微服务的项目中为了简化前端的调用逻辑,通常会引入API Gateway作为轻量级网关,同时API Gateway中也会实现相关的认证逻辑从而简化内部服务之间相互调用的复杂度。

2、数据裁剪以及聚合

通常而言不同的客户端对于显示时对于数据的需求是不一致的,比如手机端或者Web端又或者在低延迟的网络环境或者高延迟的网络环境。

因此为了优化客户端的使用体验,API Gateway可以对通用性的响应数据进行裁剪以适应不同客户端的使用需求。同时还可以将多个API调用逻辑进行聚合,从而减少客户端的请求数,优化客户端用户体验

3、多渠道支持

当然我们还可以针对不同的渠道和客户端提供不同的API Gateway,对于该模式的使用由另外一个大家熟知的方式叫Backend for front-end, 在Backend for front-end模式当中,我们可以针对不同的客户端分别创建其BFF

4、遗留系统的微服务化改造

对于系统而言进行微服务改造通常是由于原有的系统存在或多或少的问题,比如技术债务,代码质量,可维护性,可扩展性等等。API Gateway的模式同样适用于这一类遗留系统的改造,通过微服务化的改造逐步实现对原有系统中的问题的修复,从而提升对于原有业务响应力的提升。通过引入抽象层,逐步使用新的实现替换旧的实现。

在Spring Cloud体系中, Spring Cloud Zuul就是提供负载均衡、反向代理、权限认证的一个API gateway。

Spring Cloud Zuul

Spring Cloud Zuul路由是微服务架构的不可或缺的一部分,提供动态路由,监控,弹性,安全等的边缘服务。Zuul是Netflix出品的一个基于JVM路由和服务端的负载均衡器。

下面我们通过代码来了解Zuul是如何工作的

简单使用

1、添加依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-zuul</artifactId>
</dependency>复制代码

引入spring-cloud-starter-zuul

2、配置文件

spring.application.name=gateway-service-zuul
server.port=8888

#这里的配置表示,访问/it/** 直接重定向到http://www.ityouknow.com/**
zuul.routes.baidu.path=/it/**
zuul.routes.baidu.url=http://www.ityouknow.com/复制代码

3、启动类

@SpringBootApplication
@EnableZuulProxy
public class GatewayServiceZuulApplication {

    public static void main(String[] args) {
        SpringApplication.run(GatewayServiceZuulApplication.class, args);
    }
}复制代码

启动类添加@EnableZuulProxy,支持网关路由。

史上最简单的zuul案例就配置完了

整体架构如下:

服务化

通过url映射的方式来实现zull的转发有局限性,比如每增加一个服务就需要配置一条内容,另外后端的服务如果是动态来提供,就不能采用这种方案来配置了。实际上在实现微服务架构时,服务名与服务实例地址的关系在eureka server中已经存在了,所以只需要将Zuul注册到eureka server上去发现其他服务,就可以实现对serviceId的映射。

我们结合示例来说明,在上面示例项目gateway-service-zuul-simple的基础上来改造。

1、添加依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>复制代码

增加spring-cloud-starter-eureka包,添加对eureka的支持。

2、配置文件

配置修改为:

spring.application.name=gateway-service-zuul
server.port=8888

zuul.routes.api-a.path=/producer/**
zuul.routes.api-a.serviceId=spring-cloud-producer

eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/复制代码

3、测试

依次启动 spring-cloud-eurekaspring-cloud-producergateway-service-zuul-eureka,访问:http://localhost:8888/producer/hello?name=%E5%B0%8F%E6%98%8E,返回:hello 小明,this is first messge

说明访问gateway-service-zuul-eureka的请求自动转发到了spring-cloud-producer,并且将结果返回。

为了更好的模拟服务集群,我们复制spring-cloud-producer项目改为spring-cloud-producer-2,修改spring-cloud-producer-2项目端口为9001,controller代码修改如下:

@RestController
public class HelloController {
    
    @RequestMapping("/hello")
    public String index(@RequestParam String name) {
        return "hello "+name+",this is two messge";
    }
}复制代码

修改完成后启动spring-cloud-producer-2,重启gateway-service-zuul-eureka。测试多次访问http://localhost:8888/producer/hello?name=%E5%B0%8F%E6%98%8E,依次返回:

hello 小明,this is first messge
hello 小明,this is two messge
hello 小明,this is first messge
hello 小明,this is two messge
...复制代码

说明通过zuul成功调用了producer服务并且做了均衡负载。

网关的默认路由规则

但是如果后端服务多达十几个的时候,每一个都这样配置也挺麻烦的,spring cloud zuul已经帮我们做了默认配置。默认情况下,Zuul会代理所有注册到Eureka Server的微服务,并且Zuul的路由规则如下:http://ZUUL_HOST:ZUUL_PORT/微服务在Eureka上的serviceId/**会被转发到serviceId对应的微服务。

我们注销掉gateway-service-zuul-eureka项目中关于路由的配置:

#zuul.routes.api-a.path=/producer/**
#zuul.routes.api-a.serviceId=spring-cloud-producer复制代码

重新启动后,访问http://localhost:8888/spring-cloud-producer/hello?name=%E5%B0%8F%E6%98%8E,测试返回结果和上述示例相同,说明Spring cloud zuul默认已经提供了转发功能。

到此zuul的基本使用我们就介绍完了。关于zuul更高级使用,我们下篇再来介绍。

完整项目的源码来源

Spring Cloud大型企业分布式微服务云构建的B2B2C电子商务平台源码请加企鹅求求:一零三八七七四六二六


转载于:https://juejin.im/post/5c6629f66fb9a049a97a39b7


http://www.niftyadmin.cn/n/987200.html

相关文章

Linux格式化分区命令mkfs

1、mkfs简介[rootlocalhost /]# whatis mkfs mkfs (8) - build a Linux filesystem #构建一个Linux文件系统mkfs命令格式化创建文件系统。2、mkfs语法mkfs [选项] [参数]3、mkfs常用选项选项说明-h查看帮助信息-t <文件系统类型>指定要创建的文件系统类型-…

ubuntu 内核升级过程中常见错误以及解决方法汇总

经过一天的ubuntu16.04内核升级&#xff0c;并增加系统内核调用程序。以Linux-source-4.4.0版本为基础。常见错误汇总如下&#xff1a;内核编译过程出错&#xff1a;1、如图 taogetaoge:/usr/src/linux-headers-4.15.0-29$ sudo apt-get install libelf-dev2、如图修改当前目录…

PHP5.5安装

1. install Development Environment &#xff08;安装开发环境&#xff09;yum install make gcc gcc-c -y2. install library&#xff08;安装php依赖库&#xff09;a) install jpegsrc&#xff08;安装jpeg库&#xff0c;使php支持jpg、jpeg等图片格式&#xff09;…

第1篇 Linux操作系统

第1篇 Linux操作系统 Alice->Bob: Hello Bob, how are you? Note right of Bob: Bob thinks Bob-->Alice: I am good thanks! 转载于:https://www.cnblogs.com/cenon/p/10696796.html

视频+书签 Powerpiont2010可以这样玩

昨天谈了Powerpiont2010和视频相关的三个问题&#xff08;http://bannerpei.blog.51cto.com/66697/247674&#xff09;&#xff0c;感谢诸多朋友的捧场。今天说一下&#xff0c;PowerPoint2010中视频&#xff0b;书签混合起来&#xff0c;作为事件触发器来使用。&#xff08;晚…

DOM类型值:Document类型

Document节点具有以下特征&#xff1a; nodeType —— 9nodeName —— #documentnodeValue —— null parentNode —— null ownerDocument —— null 其子节点可能是一个Document&#xff08;最多一个&#xff09;、Element&#xff08;最多一个&#xff09;、rocessingInstru…

PHP获取系统信息的函数方法

原帖&#xff1a;https://blog.csdn.net/qq_37682202/article/details/77932387 获取系统类型及版本号&#xff1a; php_uname() 只获取系统类型&#xff1a; php_uname(s) 只获取系统版本号&#xff1a; php_uname(r) 获取PHP运行方式&#xff1a; php_sapi_name() 获取前进…

LNMP安装与配置之Python3

环境 我们是在CentOS7下安装python3&#xff0c;但CentOS已经默认安装了Python2&#xff0c;而 Yum 等工具依赖原来的Python2。所以我们需要稍作配置让Python2与Python3可以共存。当然我们也可以使用Python虚拟环境&#xff0c;在这里我们就不做过多介绍了。下面进入主题。 安装…