Spring Cloud浅谈个人尝鲜------Zuul 服务网关(五)

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-eurekatest-producergateway-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默认已经提供了转发功能。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NotFoundObject.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值