前言
最近,了解了一下,目前的一些api网关的常用技术,配置了一下spring cloud gateway。做一下记录吧,毕竟时间长了,容易忘。
- zuul1.x
- zuul2.x
- spirng cloud gateway
- nginx + lua(openresty ,kong)
- envoy
上边这几种都是可以作为网关使用的,其他的几种,后边有时间,再做详细的介绍,今天我们一起来看下spring cloud gateway的使用吧。
前置
版本
JDK版本:1.8
springboot版本:2.3.10.RELEASE
springlcoud版本:Hoxton.SR12
依赖
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR12</spring-cloud.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>2.2.9.RELEASE</version>
</dependency>
</dependencies>
就用到这个两个starter依赖,还是比较简单的。
application.yml配置(重点)
第一种:手动配置路由
spring:
cloud:
gateway:
routes:
- id: route01 # 就是一个唯一的id,用于api的分组(如:这个是订单服务,下边的route02是库存服务)
predicates: # 断言
- Path=/api/order/** # Path路径匹配,P必须大写,否则会报错。此时的意思是在访问localhost:8888/api/order/xxx 时,会被路由到下边配置的uri地址上。
filters: # 过滤器
- StripPrefix= 2 # 此处StripPrefix必须首字母大写,而且后边紧跟=,否则也会报错。此配置的作用是,将路由的时候,将api/order去掉,变成localhost:8080/xxx 值2表示去掉两级。若值为1的话,则为localhost:8080/order/** 但是此时路由路径不对了,订单服务访问404
uri: http://localhost:8080
- id: route02
uri: http://localhost:8081
predicates:
- Path=/api/stock/**
filters:
- StripPrefix= 2
application:
name: myGateWay
server:
port: 8888
第二种:动态路由
spring:
cloud:
gateway:
discovery:
locator:
enabled: true
application:
name: myGateWay
server:
port: 8888
eureka:
client:
service-url:
defaultZone: http://localhost:9999/eureka/
使用动态路由,需要再pom.xml中添加eureka客户端的依赖,开启服务发现。所谓动态路由,就是当我们访问网关的时候,网关自动从注册中心中拿到一个服务的地址,然后自动路由过去。我们不在需要对url进行配置。
【注意】
配置好之后,我们就可以使用localhost:8888/服务名/接口具体url
进行访问,服务名在eureka的web管理页面中可以看是全大写的,此处请求的时候也必须服务名大写才可以。
此时,大家估计就有疑问了,大写的服务名在url路径中,多不美观,其次要是服务名又很长,岂不是url很长,多不雅观,接下来,我们来解决这个问题。
spring:
cloud:
gateway:
discovery:
locator:
enabled: true
routes:
- id: order-service # 起一个唯一的名字
predicates:
- Path=/order/**
filters:
- StripPrefix= 1 # 过滤掉/order
uri: lb://ORDER-SERVICE # 假如我们的订单服务名叫 ORDER-SERVICE
application:
name: myGateWay
server:
port: 8888
eureka:
client:
service-url:
defaultZone: http://localhost:9999/eureka/
上边这样,进行一个routes的配置,此时就可以指定访问的路径了,之前的访问url为:localhost:8888/ORDER-SERVICE/findAll
,此时的访问路径则为:localhost:8888/order/findAll
这两个url此时都可以访问到后端的订单微服务。这样就更加灵活的指定一个服务的访问路劲了。
总结
本文为spring cloud gateway的一个快速入门,后边更高阶的功能在慢慢记录吧