前言

“网关(Gateway)又称网间连接器、协议转换器。网关在网络层以上实现网络互连,是复杂的网络互连设备,仅用于两个高层协议不同的网络互连。

那么在微服务架构体系中,服务的粒度往往被分得很细,这样各个服务模块之间可以被独立地设计、开发、测试、部署以及管理。各个独立部署单元可以用不同的开发测试团队维护,可以使用不同的编程语言和技术平台进行设计,那么这时候就需要使用一种语言和平台无关的服务协议作为各个单元间的通讯方式。这就是微服务架构体系中的网关。

什么是服务网关

服务网关可以统一服务的入口,可方便实现对平台众多服务接口进行管控,对访问服务进行身份校验、防报文重发以及数据的篡改,响应数据的脱敏、流量的并发控制以及基于API调用的计量或者计费、 实现请求路由转发以及请求过程的负载均衡等等场景。可以将服务网关理解为路由器和过滤器的组合。

所以总结下网关可以实现请求的路由转发以及对于服务器的统一管理,对于大部分冗余或者通用代码的处理(比如权限、流量监控、限流等等)。

网关组件在微服务架构中的 使用如下:

springcloud gateway管理界面(SpringCloud系列服务网关组件Gateway)(1)

常见的服务网关组件

常见的服务网关组件有很多,比如:Nginx Lua、Traefik、Kong、spring cloud Netflix Zuul、Spring Cloud Gateway。其中Zuul和GeteWay则是目前使用较多的网关组件。

Zuul 是 Netflix 开源的一个API网关组件,SpringCloud对其进行二次基于SpringBoot注解式封装做到开箱即用,并且它融合于SpringCloud 完整生态,可以和 Eureka、Ribbon、Hystrix 等组件配合使用。所以是构建微服务体系前置网关服务的最佳选型之一。Zuul是从设备和网站到Netflix流媒体应用程序后端所有请求的前门,作为一个边缘服务的应用,zuul被构建为支持动态路由、监视、弹性和安全性。

目前zuul组件已经更新到了2.0版本,并且2.0版本开始支持异步调用模式,但是作为springcloud官方虽然依然支持2.0,但是不再推荐使用2.0版本。

Spring Cloud Gateway是Spring Cloud的一个全新的API网关项目,它基于Spring5.0 SpringBoot2.0 WebFlux(基于⾼性能的Reactor模式响应式通信框架Netty,异步⾮阻塞模型)等技术开发,性能⾼于Zuul,官⽅测试,Spring Cloud GateWay是Zuul的1.6倍,它作为Spring Cloud生态系统中的网关,它的目标是替代Zuul,其不仅是提供统一的路由方式,并且还基于Filter链的方式提供了网关的基本功能。spring cloud geteway目的是提供一种简单有效的方法来路由到API,并为api提供横切关注点,比如安全性、监控、度量、弹性。

Spring Cloud Gateway可以与Spring Cloud Discovery Client(如Eureka)、Ribbon、Hystrix等组件配合使用,实现路由转发、负载均衡、熔断、鉴权、路径重写、⽇志监控等,并且Gateway还内置了限流过滤器,实现了限流的功能。

Gateway网关的使用

使用gateway网关首先需要和其他的项目一样,创建一个简单的springboot应用,并且引入需要用到的相关依赖。创建了对应的项目之后,需要引入的具体依赖如下,除了常见的依赖,这里需要额外引入的是gateway依赖:

<dependencies> <!--引入consul依赖,用于服务注册发现--> <!--Consul Discovery--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-consul-discovery</artifactId> </dependency> <!--引入健康检查的依赖,用于健康检查监控--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!-- 引入gateway依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> </dependencies>

项目入口类型如下:

@SpringBootApplication @EnableDiscoveryClient public class GatewayApplication { public static void main(String[] args) { SpringApplication.run(GatewayApplication.class,args); } }

启动两个对应的springboot项目,这时候如果调用对应的接口,浏览器地址如下:

springcloud gateway管理界面(SpringCloud系列服务网关组件Gateway)(2)

springcloud gateway管理界面(SpringCloud系列服务网关组件Gateway)(3)

如果使用gateway进行路由转发,则只需要在配置文件中配置对应的路由规则即可,路由配置如下:

server: port: 9010 spring: application: name: gateway cloud: consul: host: localhost port: 8500 gateway: routes: - id: product_router #路由对象唯一标识 uri: http://localhost:8087 #用来类别服务地址 http://localhost:8087/product predicates: #断言 用来配置路由规则 - Path=/product - id: customer_router #路由对象唯一标识 uri: http://localhost:8085 #用来类别服务地址 http://localhost:8087/customer predicates: #断言 用来配置路由规则 - Path=/customer

这时候无论调用什么接口,则统一的端口号都是gateway配置中的9010即可:

springcloud gateway管理界面(SpringCloud系列服务网关组件Gateway)(4)

springcloud gateway管理界面(SpringCloud系列服务网关组件Gateway)(5)

总结

以上就是微服务中服务网关的简单介绍以及gateway服务网关的使用。gateway相当于所有服务的门户,将客户端请求与服务端应用相分离,客户端请求通过gateway后由定义的路由和断言进行转发,路由代表需要转发请求的地址,断言相当于请求这些地址时所满足的条件,只有同时符合路由和断言才给予转发。

后续将对gateway使用的细节以及一些使用中的注意事项进行学习分享

,