微服务网关spring cloud gateway

文档:
https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.0.2.RELEASE/single/spring-cloud-gateway.html

基本概念

Route

路由器=ID+URI+Predicates+Filters
路由器决定如何处理请求, 当一个请求到来的时候, 跟据匹配条件找到路由器, 再由路由器的过滤器来处理请求.

Predicate

匹配器, 是一个java8的函数,输入是ServerWebChange, 里面包含了ServerHttpRequest, 开发者跟据输入决定是否匹配路由.

Filter

过滤器, 处理请求, 可以修改请求前的数据和返回后的数据, 类似于spring webmvc的web过滤器.

How it works

image.png
spring cloud gateway默认有很多全局过滤器和普通过滤器, 可以通过配置文件配置发挥强大功效.

集成

spring cloud gateway 基于spring webflux, 而不是spring webmvc, 这一点要非常注意,如果classpath包含了spring webmvc那么启动后,网关路由不会生效.

dependencies {
  compile('org.springframework.cloud:spring-cloud-starter')
  compile('org.springframework.cloud:spring-cloud-starter-gateway')
  compile('org.springframework.boot:spring-boot-starter-webflux')
}
configurations {
    all*.exclude group: 'org.springframework','spring-webmvc'
}

启动成功后,应该输出:
INFO org.springframework.boot.web.embedded.netty.NettyWebServer - Netty started on port(s): …

网关功能

微服务网关最重要的几个功能分别是路由, 负载均衡,认证授权, 跨域配置, 日志, 失败重试, 下来一一来配置.

动态路由

通常微服务都是注册中心, 服务都是自动发现的,spring cloud gateway可以基于注册小心动态配置路由, 转发的规则是:
/service_id/path->转发到service_id对应的服务
只需要添加配置:

spring.cloud.gateway.discovery.locator.enabled=true
spring.cloud.gateway.discovery.locator.lowerCaseServiceId=true

就能动态路由.

负载均衡

以lb://开头的请求, 会被全局过滤器RetryLoadBalancerClientFilter拦截并进行负载均衡处理, 所有的动态路由都会自动负载均衡.

认证授权

有一个专门用来做认证授权的服务, 网关需要做的就是自定义一个全局过滤器, 将每一个请求发到授权服务进行认证授权.

@Component
public class AuthFilter implements GlobalFilter, Ordered {
    @Override
    public int getOrder() {
        return Constants.PRE_FILTER_ORDER_AUTH;
    }

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        ServerHttpRequest request = exchange.getRequest();
        try {
            //TODO 调用授权服务进行认证和授权
            return chain.filter(exchange.mutate().request(request).build());
        } catch (Exception e) {
            log.error("auth failed: " + e.getMessage());
            return exchange.getResponse()
                    .writeWith(Flux.just(exchange.getResponse().bufferFactory().wrap("授权失败".getBytes())));
        }
    }

跨域设置

有时候前端需要支持跨域访问, 这里简单配置允许所有域名访问.

spring.cloud.gateway.globalcors.cors-configurations.[/**].allowed-origins=*
spring.cloud.gateway.globalcors.cors-configurations.[/**].allowed-methods=*
spring.cloud.gateway.globalcors.cors-configurations.[/**].allowed-headers=*
spring.cloud.gateway.globalcors.cors-configurations.[/**].allow-credentials=true

日志

日志功能同样是自定义全局过滤器实现, 在请求进入时打印输入日志,返回时打印输出日志, 唯一的问题是在打印请求或返回的body时要处理下,一般情况下请求和响应的body都不能多次读, 需要自定义装饰器封装实现多次读的功能.

#失败重试
这个没有全局过滤器, 需要自己实现.

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值