上一篇笔记中已经学习到了服务降级,服务注册等内容,接下来学习服务网关。
一、Gateway (一)Gateway是什么 1、概念可以看看zuul:https://github.com/Netflix/zuul/wiki
- 路由(router)路由信息的组成:由一个ID、一个目的URL、一组断言工厂、一组Fliter组成。如果路由断言为真,说明请求URL和配置路由匹配
- 断言(Predicate)Spring Cloud GateWay中的断言函数输入类型是Spring5.0框架中的ServerWebExchange。Spring Cloud GateWay的断言函数允许开发者迁移定义匹配来自于HttpRequest中任何信息比如请求头和参数。
- 过滤器(Filter)一个标准的SpringWebFilter。Spring Cloud GateWay中的Fliter分为两种类型的Filter,分别是Gateway Filter和Global Filter。过滤器Filter将会对请求和响应进行修改处理。
- zuul
- Gateway
- 两者的区别
- 传统的servlet2.X
- Gateway是采用WebFlux
- 路由(router)路由信息的组成
- 断言(Predicate)
- 过滤器(Filter)
总体流程
- 看看官网的
- 将model
- 导依赖
org.springframework.cloud
spring-cloud-starter-gateway
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
cn.mldn
cloud-api-commons
1.0-SNAPSHOT
org.springframework.boot
spring-boot-devtools
runtime
true
org.projectlombok
lombok
true
org.springframework.boot
spring-boot-starter-test
test
仔细看这次是没有web的依赖和actuator依赖的,因为我们的Gateway不用这个。
- 写yml
server:
port: 9527
spring:
application:
name: cloud-gateway
eureka:
instance:
hostname: cloud-gateway-service
instance-id: gateway9527
#服务提供者provider注册进Eureka服务列表
client:
service-url:
register-with-eureka: true
fethc-registry: true
defaultZone: http://localhost:7001/eureka,http://localhost:7002/eureka
- 主启动
- 只有在路由,断言,过滤器为true后则转发过去。
只要别人想攻击你,外面有一层挡着的。
配置9527新增网关
server:
port: 9527
spring:
application:
name: cloud-gateway
cloud:
gateway:
routes:
- id: payment_routh # payment_routh 路由的ID,没有固定规则但要求唯一,建议配置服务器
uri: http://localhost:8001
predicates:
- Path=/payment/get/** # 断言,路径相匹配的进行路由
- id: payment_routh2 # payment_routh2路由id,没有固定规则但要求唯一,建服务器名
uri: http://localhost:8001
predicates:
- Path=/payment/create/** #断言,匹配相路径匹配的进行匹配
eureka:
instance:
hostname: cloud-gateway-service
instance-id: gateway9527
#服务提供者provider注册进Eureka服务列表
client:
service-url:
register-with-eureka: true
fethc-registry: true
defaultZone: http://localhost:7001/eureka,http://localhost:7002/eureka
routes:就是我们这次配置的。
(4)启动测试
- 用9527测试
其实感觉说到了配置路由我又感觉我在学习Vue框架了
- 这里添加也是可以的,但是要用其他测试
就刚刚学习的那种。
(2)用Bean方式配置@Configuration
public class GatewayConfig {
@Bean
public RouteLocator customerRouteLocator(RouteLocatorBuilder builder) {
RouteLocatorBuilder.Builder builder1 = builder.routes();
builder1.route("path_routh_id",r -> r.path("/hello").uri("https://www.baidu.com")).build();
builder1.route("path_routh_id2",r -> r.path("/hello2").uri("http://localhost:8001/payment/get/2")).build();
return builder1.build();
}
}
4)Gateway配置动态路由
(1)存在的问题分析
上面配置方式中存在的问题在现实中是不可能应用的,因为我们给写死了,肯定要动态变化的才可能。【我们之前的是负载均衡,要是我们的微服务很多的话,手动配置不太现实】
- 首先启动这几个8001,8002,9527,7001
- 配置9527yml
- 启动9527就会发现这个
其实就是和mysql查询的差不多的作用。
-
在什么什么之后
-
获取当前时间
我们的目的是在多少多少时间后访问这个请求才可以放行 -
进行配置
这个就不用讲了吧
(3)Between Route Predicate逗号隔开即可。
-
就是带cookie允许你访问【而且还可以要求带什么样子的cookie可以访问】
逗号后面是要什么样子的cookie -
先看看配置内容
比如这里就要带username这个key,zzyy这个value。 -
这里使用cur模拟cookie进行处理
这样访问是会报404
带上cookie
- 要带一个http的请求头
- 进行测试
要用的时候再学习。
- 单一的有31种
- 全局的有10个
具体的可以去官网看看,这个不是最重要的,下面自定义的才是最重要的。
-
首先实现如下接口
-
能干嘛:统一网关啊,全局日志。
-
案例
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatus;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
import java.util.Date;
@Configuration
@Slf4j
public class MyLogGatewayFilter implements GlobalFilter, Ordered {
@Override
public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
log.info("全局过滤器执行" + new Date());
String uname = exchange.getRequest().getQueryParams().getFirst("uname");
if (uname == null ) {
log.info("有问题");
exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);
return exchange.getResponse().setComplete();
}
//让他继续走下去
return chain.filter(exchange);
}
@Override
public int getOrder() {
return 0;
}
}
- 过滤器还是很好理解的,比较简单。
只要你带上这个uname就可以,其他的就不行。
由于暂时时间也比较紧张,暂时就把Zuul放一放,有需要的朋友可以自己去找资源学习。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)