首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringCloud Gateway使用

SpringCloud Gateway使用

作者头像
zhaozhen
发布2021-08-06 11:11:46
5040
发布2021-08-06 11:11:46
举报

GateWay之路由转发和过滤

在一个Gateway项目(配置了eureka等组件)中进行配置

server:
  port: 9006
spring:
  application:
    name: zhao-service-gateway
  cloud:
    gateway:
      routes:
       - id: service-autodeliver-router
         #uri: http://127.0.0.1:8091
         uri: lb://zhao-service-autodeliver
         predicates:
          - Path= /autodeliver/**
       - id: service-resume-router
         #uri: http://127.0.0.1:8081
         uri: lb://zhao-service-resume
         predicates:
           - Path=/resume/**
         filters:
           - StripPrefix=1

通过第一个服务hao-service-autodeliver的配置形式,使用固定ip和服务名均可正常通过网关项目访问到服务,但是固定ip的方式不太灵活,而 lb://zhao-service-autodeliver可以实现随机的负载均衡,且不用填写固定ip也避免了不要的麻烦

第二个服务配置中 filters:- StripPrefix=1这个配置会过滤掉第一个路径配置,所以我们在最后访问的时候,除了需要加上第一个过滤掉的配置,还需要加上原本的配置。访问形式如下

GateWay断言

上述针对路径的配置即是断言predicates的配置,而Gateway还内置了以下几种断言

基本上上述断言都是基于请求携带的信息进行过滤的,在实际操作过程中可以综合使用这些信息来达到我们想要的操作

GateWay自定义全局过滤器

@Component
@Slf4j
public class BlackListFilter implements GlobalFilter, Ordered{
    private  static final List<String> blackList=new ArrayList<>();
    static {
        blackList.add("0:0:0:0:0:0:0:1");//模拟本机ip地址
    }
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        ServerHttpRequest request = exchange.getRequest();
        ServerHttpResponse response =exchange.getResponse();
        String clientIp = request.getRemoteAddress().getHostString();
        if (blackList.contains(clientIp)){
            response.setStatusCode(HttpStatus.UNAUTHORIZED);
            log.error(clientIp+"在黑名单中,拒绝访问");
            String data = "request be denied";
            DataBuffer wrap = response.bufferFactory().wrap(data.getBytes());
            return response.writeWith(Mono.just(wrap));
        }
        return chain.filter(exchange);
    }

    @Override
    public int getOrder() {
        return 0;
    }
}

通过该过滤器拦截了黑名单中的请求(该操作在实际中可借助mysql或redis等数据存储实现),实现效果

GateWay的高可用

⽹关作为⾮常核⼼的⼀个部件,如果挂掉,那么所有请求都可能⽆法路由处理,因此我们需要做GateWay的⾼可⽤。GateWay的⾼可⽤很简单:可以启动多个GateWay实例来实现⾼可⽤,在GateWay的上游使⽤Nginx等负载均衡设备进⾏负载转发以达到⾼可⽤的⽬的。启动多个GateWay实例(假如说两个,⼀个端⼝9002,⼀个端⼝9003),剩下的就是使⽤Nginx等完成负载代理即可。

代码地址https://github.com/zhendiao/deme-code/tree/main/zp

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-07-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 微瞰技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • GateWay之路由转发和过滤
  • GateWay断言
  • GateWay自定义全局过滤器
  • GateWay的高可用
相关产品与服务
负载均衡
负载均衡(Cloud Load Balancer,CLB)提供安全快捷的流量分发服务,访问流量经由 CLB 可以自动分配到云中的多台后端服务器上,扩展系统的服务能力并消除单点故障。负载均衡支持亿级连接和千万级并发,可轻松应对大流量访问,满足业务需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档