Springcloud-alibaba整合gateway
每天多学一点点~
话不多说,这就开始吧…
文章目录
1.前言
之前学习了nacos,sentinel,并对sentinel进行了持久化改造。现在轮到了gateway了
2. gateWay简介
Spring Cloud Gateway是Spring Cloud官方推出的第二代网关框架,取代Zuul 网关。网关作为流量的,在微服务系统中有着非常作用。据说性能是第一代网关 zuul的1.5倍。(基于Netty,WebFlux)。
注:由于不是Sevlet容器,所以他不能打成war包, 只支持SpringBoot2.X不 支持1.x
网关作用:
路由转发、权限校验、限流控制等作用
没有网关:
使用网关:
2. 搭建SpringCloudGateWay
- 添加依赖
<!--gateway依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!--nacos依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
- yml文件
#规划GateWay的服务端口
server:
port: 8888
##规划gateWay注册到到nacos上的服务应用名称
spring:
application:
name: api-gateway
cloud:
nacos:
discovery:
#gateway工程注册到nacos上的地址
server-addr: localhost:8848
gateway:
discovery:
locator:
#开启gateway从nacos上获取服务列表
enabled: false
profiles:
active: xxxxx # 具体的gateway配置
#开启acutor端点
management:
endpoints:
web:
exposure:
include: '*'
endpoint:
health:
#打开端点详情
show-details: always
- 写注解
@SpringBootApplication
@EnableDiscoveryClient
public class GatewayDemo{
public static void main(String[] args) {
SpringApplication.run(GatewayDemo.class, args);
}
}
gateway没有注解。。。
3. gateway转发规则
4. GateWay的核心概念
- 路由
网关的基本构建模块,它是由ID、目标URl、断言集合和过滤器集合定义, 如果集合断言为真,则匹配路由。 - Predicate(断言)
这是java 8的一个函数式接口predicate,可以用于lambda表 达式和方法引用,输入类型是:Spring Framework ServerWebExchange,允许开发人员匹配来自HTTP请求的任何内容,例如请求头headers和参数paramers - Filter(过滤器)
这些是使用特定工厂构建的Spring Framework GatewayFilter 实例,这里可以在发送下游请求之前或之后修改请求和响应
5. 路由断言工厂
类名必须以 RoutePredicateFactory 结尾,下面有个例子
具体请看gateway官网,都有
6. 自定义谓词工厂
这里以时间举个例子
- 书写一个配置类,用于接受配置
/**
* Created by zjq on 2020/06/05.
*/
@Data
public class MyTimeBetweenConfig {
private LocalTime startTime;
private LocalTime endTime;
}
- 写一个自定义谓词工厂,类名必须要以RoutePredicateFactory结尾然后继承AbstractRoutePredicateFactory
/**
* Created by zjq on 2020/06/05.
*/
@Component
@Slf4j
public class MyBetweenRoutePredicateFactory extends AbstractRoutePredicateFactory<MyTimeBetweenConfig> {
public MyBetweenRoutePredicateFactory() {
super(MyTimeBetweenConfig.class);
}
@Override
public Predicate<ServerWebExchange> apply(MyTimeBetweenConfig config) {
LocalTime startTime = config.getStartTime();
LocalTime endTime = config.getEndTime();
return new Predicate<ServerWebExchange>(){
@Override
public boolean test(ServerWebExchange serverWebExchange) {
LocalTime now = LocalTime.now();
// 判断当前时间是否在在配置的时间范围类
return now.isAfter(startTime) && now.isBefore(endTime);
}
};
}
public List<String> shortcutFieldOrder() {
return Arrays.asList("startTime", "endTime");
}
}
- yml配置
# 加上 2 中springcloud搭建gateway的yml文件 spring.profiles.active: 这个文件
spring:
cloud:
gateway:
routes:
- id: my-timeBetween #id必须要唯一
uri: lb://product-center # 任意一个微服务工程
predicates:
#当前请求的时间必须在早上7点到 晚上11点 http://localhost:8888/selectProductInfoById/1
#才会被转发 到http://product-center/selectProductInfoById/1
- MyTimeBetween=上午7:00,下午11:00
gateway还有很很多,官网都有啦。下面就是sentinel集成gateway了。
7.结语
世上无难事,只怕有心人,每天积累一点点,fighting!!!