SpringCloudGateway网关功能介绍与使用
一、什么是API网关
API网关作用就是把各个服务对外提供的API汇聚起来,让外界看起来是一个统一的接口。同时也可在网关中提供额外的功能。
总结:网关就是所有项目的一个统一入口。
二、基本使用
1.准备Eureka注册中心
2.准备一个微服务工程
3.搭建Gateway网关微服务
(1)导入依赖
<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>
</dependency>
</dependencies>
(2)编写配置文件
server:
port: 9999
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
# 自动发现工具的本地路由规则是:
# 请求路径 - http://网关IP:网关端口/微服务的服务名/要访问的具体地址
# gateway自动解析,把请求地址中的'微服务的服务名'截取,从Eureka Client发现的服务列表中查看,如果有同名服务,则开始转发。
spring:
application:
name: cloud-gateway
cloud: # spring cloud相关配置的常用前缀
gateway: # 网关技术配置前缀
discovery: # 自动发现工具
locator: # 本地逻辑
enabled: true # 开启自动发现工具的本地路由逻辑
lower-case-service-id: true # 把从EurekaServer上发现的服务名称,转换成全小写
(3)编写启动类
@SpringBootApplication
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class,args);
}
}
三、谓词
谓词:当满足条件在进行路由转发。
在Spring Cloud Gateway中谓词实现GatewayPredicate接口。其中类名符合:XXXRoutePredicateFactory,其中XXX就是在配置文件中谓词名称。
所有的谓词都设置在predicates属性中,当设置多个谓词时取逻辑与条件,且一个谓词只能设置一组条件,如果需要有个多条件,添加多个相同谓词。
(1)Path
用于匹配路由地址规则的谓词。
spring:
application:
name: cloud-gateway
cloud:
gateway:
discovery:
locator:
enabled: false # 关闭自动发现工具的本地路由逻辑
lower-case-service-id: true
routes: # 配置多路由策略的属性,类型是List。配置方案是:回车 + 缩进 + - + 空格。集合中的每个对象的属性,对齐多行配置
- id: application-service # 路由的唯一名称
uri: lb://application-service # 规则满足后,转发到的地址。lb是spring cloud gateway支持的一种协议名
predicates: # 谓词
- Path=/service @Component public class MyKeyResolver implements KeyResolver { @Override public Mono<String> resolve(ServerWebExchange exchange) { String ip = exchange.getRequest() // 获取请求对象 .getRemoteAddress() // 获取客户端地址对象 InetSocketAddress .getAddress() // 获取客户端地址对象 InetAddress .getHostAddress(); // 获取客户端的主机地址(IP或唯一的主机名) return Mono.just(ip); // 创建返回结果对象 } }
(3)编写配置文件
server:
port: 9999
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
spring:
application:
name: cloud-gateway
cloud:
gateway:
discovery:
locator:
enabled: false
lower-case-service-id: true
routes:
- id: rateLimiter
uri: lb://application-service
predicates:
- Path=/limiter @Controller public class FallbackController { @RequestMapping(value = "/fallback", produces = {"text/html; charset=UTF-8"}) @ResponseBody public String fallback(){ return "<div style='color:red; text-align: center'>服务器忙,请稍后重试!</div>"; } }