搭建微服务框架(服务网关处理)
本篇来进行介绍微服务网关集成的使用操作,基于 SpringCloudGateway。
本文源地址:搭建微服务框架(服务网关处理)
Github 地址:SQuid
Spring-Cloud-Gateway
由于 SpringCloud-Netflix 的 Zuul 组件不再维护,而 Spring 官方推出了 Gateway 的新组件,并且支持了 SringCloud2.0 的版本,所以在选型方面,直接就选择了 Spring 官方的 Gateway。
介绍 Gateway,不得不将它与 Zuul 进行比较。
的确,Zuul 的网关处理流程很一目了然,基于一个 ZuulFilter
,而后可以定义 preRoute()
route()
postRoute()
error()
,类似于 Spring 的前置通知,后置通知,环绕通知,算得上是不错的网关处理组件,
比较可惜的是,SpringCloud-Netfilx 的停止更新,使得 SpringCloud 的网关处理选择为了 Spring-Cloud-Gateway
。
众所周知,Zuul 是基于 Serverlet,而 Gateway 是基于 Netty,两个谁更优秀,这个目前也是进行不了一个定义,广义上来说也是传统的 Http 和 TCP
的比较。
下面介绍 Gateway 的使用,?
使用 Spring-Cloud-Gateway
首先贴一下工程截图:
很简单的一个例子,先新建一个 squid-gateway
的工程,引入如下依赖:
pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>io.projectreactor</groupId>
<artifactId>reactor-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-gateway-core</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
<dependency>
<groupId>org.isomorphism</groupId>
<artifactId>token-bucket</artifactId>
<version>1.7</version>
</dependency>
GatewayApplication
@SpringBootApplication
@EnableDiscoveryClient
public class GateWayApplication {public static void main(String[] args) {SpringApplication.run(GateWayApplication.class, args);
}
}
application.yaml
最主要的就是 application.yaml 文件了,里面可以配置路由转发规则,当然也可以直接在 GatewayApplication.java
文件中写 java 代码来进行转发,不过我总认为这样不太直观,下面来看一下文件:
server:
port: 8006
spring:
application:
name: squid-gateway
cloud:
nacos:
discovery:
server-addr: yanzhenyidai.com:8848
gateway:
# default-filters:
# - PrefixPath=/gateway
# - AddResponseHeader=X-Response-Default-Foo, Default-Bar
routes:
- id: squid-example-dubbo-provider
uri: lb://squid-example-dubbo-provider
predicates:
- Path=/dubbo/**
filters:
- StripPrefix=1
- id: squid-oauth2
uri: lb://squid-oauth2
predicates:
- Path=/oauth/**
关键的两点:
- Nacos
Nacos 不用多说,之前介绍的本次使用的注册服务中心,配置好 Nacos 的信息,在 routes 下转发会直接发现到注册好的实例 ID 服务,进行请求访问并返回处理结果信息。
- Gateway-routes
routes 中配置的信息大致如下:
- id 为唯一值,可以使用项目模块名配置。
- uri 为路径,lb 代表
loadblance
的意思,后续跟随的可以为 IP 请求地址,也可以为注册中心中的示例 ID 名称。 - predicates 代表正则匹配规则。
- Path 为请求时的简写路径。
- StripPrefix 请求过滤的地方,1 则表示过滤简称的第一项。
总结
当然 Gateway 远远不止以上这么多的配置信息,因为目前对 Gateway 还是处于了解中,并没有深入的读它的设计理念。
对于 Gateway,个人觉得,如果服务器上已经有了 Nginx,并且工程中外部的请求没有很多需要特别逻辑处理,直接用 Nginx 做网关就可以了,而这个也正是我没有深入去了解 Gateway 的原因。?
参考资料:
Spring-Cloud-Gateway 2.2.2.RELEASE(WIKI)
Spring-Cloud-Gateway (GITHUB)
Spring-Cloud-Gateway (Spring.io)
BAELDUNG.com (GateWay)