1-服务网关Gateway
学习笔记(2020.3.30)
前言:
最近项目需要使用到的网关是
Gateway
而不是zuul
。 所以来学习下。首先
Gateway
网关和zuul
有什么区别, 为什么大佬选择使用Gateway
主要区别, 在网上找了个比较好的说明 Spring Cloud Gateway VS Zuul , 个人感觉上
Gateway
性能更好,非阻塞, 不过好像2.1版本的zuul
也修改为非阻塞了。Spring Cloud Gateway旨在提供一种简单而有效的方法来路由到
API
,并为它们提供跨领域的关注点,例如:安全性,监视/指标和弹性。相关概念:
- Route(路由):这是网关的基本构建块。它由一个 ID,一个目标 URI,一组断言和一组过滤器定义。如果断言为真,则路由匹配。
- Predicate(断言):这是一个 Java 8 的 Predicate。输入类型是一个
ServerWebExchange
。我们可以使用它来匹配来自 HTTP 请求的任何内容,例如headers
或参数。 - Filter(过滤器):这是
org.springframework.cloud.gateway.filter.GatewayFilter
的实例,我们可以使用它修改请求和响应。
工作原理和其他点击上面官网进行了解。
1. 快速入门
Spring Cloud Gateway 网关路由有两种配置方式:
- 在配置文件
yml
中配置 - 通过
@Bean
自定义RouteLocator
,在启动主类 Application 中配置
1.1 创建gateway
项目引入依赖:
<dependencies>
<!-- 网关注册服务,调用其他微服使用 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- Gateway网关依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
</dependencies>
1.2 启动类
@SpringBootApplication
@EnableEurekaClient
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class,args);
}
}
1.3 编写application.yml
先来定义一个最简单的路由转发。
如果用过
nginx
配置反向代理, 那么可能会有点熟悉的感觉。
server:
port: 8080
spring:
application:
name: gateway
cloud:
gateway:
routes:
- id: my_route #自定义路由ID, 保持唯一
uri: https://www.baidu.com #目标服务地址
predicates: #路由条件,Predicate 接受一个输入参数,返回一个布尔值结果。该接口包含多种默认方法来将 Predicate 组合成其他复杂的逻辑(比如:与,或,非)。
- Path=/Test/**
filters: #过滤规则
- StripPrefix=1 #去掉/Test前缀
然后启动项目进行访问
http://localhost:8080/Test
, 会重定向访问百度首页
1.4 也可以使用注册@bean
代码方式配置路由
@Bean
public RouteLocator routeLocator(RouteLocatorBuilder builder){
RouteLocator build = builder.routes().route("my_route", predicate ->
predicate.path("/Test/**")
.filters(gatewayFilterSpec -> gatewayFilterSpec.stripPrefix(1))
.uri("https://www.baidu.com")
).build();
return build;
}
2. 转发到自己项目,使用注册中心的服务地址
上面我们试了了转发到百度。 实际上我们配置路由肯定上转发回我们自己的项目其他微服务的。
2.1修改application.yml
spring:
application:
name: gateway
cloud:
gateway:
routes:
- id: my_route
uri: lb://eureka-client #目标注册中心服务名, lb表示从注册中心获取服务
predicates:
- Path=/Test/**
filters:
- StripPrefix=1
#注册
eureka:
client:
serviceUrl: #Eureka客户端与Eureka服务端进行交互的地址
defaultZone: http://127.0.0.1:8761/eureka/
instance:
prefer-ip-address: true
这样我们访问
http://localhost:8080/Test/get
会去eureka-client
微服里面找Api
接口了。
1