springcloud微服务-gateway
1.引入依赖
2.添加配置项
网关自动路由:
网关+eureka中的服务名称+路劲 例如 localhost:65000/feign-client/sayHi
1.查看路由
2.动态添加路由
3.删除路由
4.修改路由
gateway断言:
1.path断言
2.method断言
3.requestParam断言
4.Header断言
5.cookie断言
6.时间片断言
7.自定义断言
自定义路由规则配置方法:
yml配置
java代码配置
实现自定义filter
1.实现gatewayfilter或者globalfilter和ordered接口
2.添加到filter中
实现用户鉴权的方案:
1.传统session
2.session复制
3.绑定ip后者一致性hash
4.存放在redis的session
5.oauth2.0
6.jwt
1)根据账号名密码生成token
2)验证token有效性,有效则允许访问资源
token包含三部分:header,playload,signature。
tips:一天不练手生脚慢,两天不练功丢一半,三天不练成了门外汉。
gateway配置redis限流:
1.写限流配置类
@Configuration
public class RateLimiterConfiguration {
//hostAddr的key,基于调用方ip的限流
@Bean
@Primary
public KeyResolver remoteAddrKeyResolver(){
return exchange -> Mono.just(
exchange.getRequest()
.getRemoteAddress()
.getAddress()
.getHostAddress()
);
}
@Bean("redisLimiterUser")
@Primary
public RedisRateLimiter redisLimiterUser(){
return new RedisRateLimiter(1,2);
}
@Bean("redisLimiterItem")
public RedisRateLimiter redisLimiterItem(){
return new RedisRateLimiter(20,50);
}
}
2.配置文件添加redis连接信息
redis:
host: localhost
port: 6379
3.在对应路由规则下添加限流过滤器
.route(r->r.path("/address/**","/passport/**","/userInfo/**","/center/**")
.filters(f->f.requestRateLimiter(c->c.setKeyResolver(hostNameKeyResolver)
.setRateLimiter(rateLimiter)
.setStatusCode(HttpStatus.BAD_GATEWAY)))
.uri("lb://FOODIE-USER-SERVICE"))
gateway设置全局跨域,一切前端都和gateway进行交互,所以gateway设置允许跨域即可,其他微服务不需要在单独设置允许跨域。
cloud:
gateway:
globalcors:
cors-configurations:
'[/**]':
# 返回的资源共享给请求来源
allowed-origins:
- "http://localhost:8080"
- "http://shop.z.mukewang.com:8080"
- "http://center.z.mukewang.com:8080"
- "http://shop.z.mukewang.com"
- "http://center.z.mukewang.com"
- "*"
# 比如cookie, authorization之类的认证信息
allow-credentials: true
allowed-headers: "*"
allowed-methods: "*"
expose-headers: "*"
# 表示Options可以在浏览器缓存多长时间
max-age: 600