Spring Cloud浅谈个人尝鲜------Zuul 服务网关(五)
前面几篇文章我们学习了Eureka用于服务的注册于发现,Feign支持服务的调用以及均衡负载,Hystrix处理服务的熔断防止故障扩散。
我们还是少考虑了一个问题,外部的应用如何来访问内部各种各样的微服务呢?在微服务架构中,后端服务往往不直接开放给调用端,而是通过一个API网关根据请求的url,路由到相应的服务。当添加API网关后,在第三方调用端和服务提供方之间就创建了一面墙,这面墙直接与调用方通信进行权限控制,后将请求均衡分发给后台服务端。
1.网关名称解释
网关(Gateway)又称网间连接器、协议转换器。网关在网络层以上实现网络互连,是最复杂的网络互连设备,仅用于两个高层协议不同的网络互连。网关既可以用于广域网互连,也可以用于局域网互连。 网关是一种充当转换重任的计算机系统或设备。使用在不同的通信协议、数据格式或语言,甚至体系结构完全不同的两种系统之间,网关是一个翻译器。
2.API网关名词解释
API Gateway(API GW / API 网关),顾名思义,是出现在系统边界上的一个面向API的、串行集中式的强管控服务,这里的边界是企业IT系统的边界。
在微服务流行之前,API GW的实体就已经诞生了,这时的主要应用场景是OpenAPI,也就是开放平台,面向的是企业外部合作伙伴,对于这个应用场景,相信接触的人会比较多。当在微服务概念流行起来之后,API网关似乎成了在上层应用层集成的标配组件。
3.Spring Cloud Zuul 简介
Zuul 是Netflix 提供的一个开源组件,致力于在云平台上提供动态路由,监控,弹性,安全等边缘服务的框架。也有很多公司使用它来作为网关的重要组成部分。Spring Cloud 体系收录的该模块,主要用于提供动态路由、监控、安全控制、限流配额等,可以将内部微服务API统一暴露。
4. 微服务下的的网关模式
在spring cloud 体系当中,我们将内部的服务全部进行隐藏,对外只有一个对外暴露的机制,这就是spring cloud zuul 网关。架构图如下所示:
5.项目应用
5.1 简单使用
5.1.1 添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
5.1.2 配置文件
spring.application.name=gateway-service-zuul
server.port=8005
#这里的配置表示,访问/it/** 直接重定向到http://www.csdn.com/
zuul.routes.baidu.path=/it/**
zuul.routes.baidu.url=http://www.csdn.com/
5.1.3 启动类
@SpringBootApplication
@EnableZuulProxy
public class GatewayServiceZuulApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayServiceZuulApplication.class, args);
}
}
启动类添加@EnableZuulProxy
,支持网关路由。
最简单的zuul案例就配置完了。
5.1.4 测试
启动gateway-service-zuul-simple
项目,在浏览器中访问:http://localhost:8005/it
,看到页面返回了:
看到页面返回了:http://www.csdn.com/
页面的信息,
5.1.5 测试重定向
在配置文件中添加:
zuul.routes.hello.path=/test/**
zuul.routes.hello.url=http://localhost:8003/
启动test-producer
,重新启动gateway-service-zuul-simple
,访问:http://localhost:8005/test/test/getString
,返回:祝您 2019 猪年大吉,'猪'事如意!
说明访问gateway-service-zuul-simple
的请求自动转发到了test-producer
,并且将结果返回。
5.2 服务化
通过url映射的方式来实现zuul的转发有局限性,比如每增加一个服务就需要配置一条内容,另外后端的服务如果是动态来提供,就不能采用这种方案来配置了。实际上在实现微服务架构时,服务名与服务实例地址的关系在eureka server中已经存在了,所以只需要将Zuul注册到eureka server上去发现其他服务,就可以实现对serviceId的映射。
我们结合示例来说明,在上面示例项目gateway-service-zuul-simple
的基础上来改造。
5.2.1 添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>1.3.1.RELEASE</version>
</dependency>
5.2.2 修改配置文件
spring.application.name=gateway-service-zuul
server.port=8005
#这里的配置表示,访问/it/** 直接重定向到http://www.mobiletrain.org/
#zuul.routes.baidu.path=/it/**
#zuul.routes.baidu.url=http://www.mobiletrain.org/
#zuul.routes.hello.path=/test/**
#zuul.routes.hello.url=http://localhost:8003/
zuul.routes.api-a.path=/producer/**
zuul.routes.api-a.serviceId=spring-cloud-producer
eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/
5.2.3 测试
依次启动 openapi-eureka
、 test-producer
、gateway-service-zuul
,访问:http://localhost:8005/producer/producer/getString
,返回:`祝您 2019 猪年大吉,'猪’事如意!
说明访问gateway-service-zuul-eureka
的请求自动转发到了client1
,并且将结果返回。
为了更好的模拟服务集群,我们使用tomcat再来启动一个client1将端口号更改为8001 并且将controller层的bug注释掉,重新请求,通过zuul成功调用了producer服务并且做了均衡负载。
5.3 网关的默认路由规则
但是如果后端服务多达十几个的时候,每一个都这样配置也挺麻烦的,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=test-producer
重新启动后,访问http://localhost:8005/test-producer/producer/getString
,测试返回结果和上述示例相同,说明spirng cloud zuul默认已经提供了转发功能。