7.API网关(gateway)入门实践

目录

核心知识点

API网关诞生背景

市场主流微服务网关

基于API Gateway实现服务的保护和转发

基于API Gateway层面负载均衡的实现

基于API Gateway底层原理实现分析

基于API Gateway中常用谓词(predicates)对象进行实践分析

 Gateway中的网关过滤器

常见问题

为什么要使用网关

 网关入门实现步骤

网关中的负载均衡底层是基于什么实现的

网关中的谓词对象是怎么创建的

常用的谓词对象


核心知识点

API网关诞生背景

服务太多,需要对请求入口进行统一管理

市场主流微服务网关

spring cloud gateway,一代网关zuul...

基于API Gateway实现服务的保护和转发

保护是指基于GatewayFilter的实现类来进行对请求路径的删除(StripPrefixGatewayFilterFactory)来进行保护,此接口的实现类还有很多,都可以对请求的路径进行修改

基于API Gateway层面负载均衡的实现

首先要将gateway注册到nacos

然后修改配置文件将uri: lb://sca-provider

底层在LoadBalancerFilter过滤器内使用Ribbon负载均衡算法实现负载均衡

基于API Gateway底层原理实现分析

客户端向Spring Cloud Gateway发送请求,如果Gateway Handel Mapping 通过谓词predicates的集合与路由(Routers)匹配,则将请求发送到Gateway Web Handler ,Gateway Web Handler基于路由配置调用过滤器链中的过滤器对请求进一步处理

基于API Gateway中常用谓词(predicates)对象进行实践分析

Gateway继承了Predicates接口,GatewayPredicats,此接口有多个实现类,当请求与我们设置的谓词规则匹配时,对应的实现类就返回true,否则返回false,返回false的请求就会报404错误

此接口的实现类设置了一些规则,来对请求进行统一的处理,比如请求的方式,请求的时间,请求的路径

我们也可以通过实现GatewayPredicates自定义谓词对象

 Gateway中的网关过滤器

全局过滤器:GlobelFilter,做用在全部的路由上,其中Gateway负载均衡的实现就在全局过滤器中(LoadBalancerFilter)

我们可以通过实现该接口来添加过滤器,比如设置访问路径的黑白名单

@Component
public class BlackUrlGlobalFilter implements GlobalFilter, Ordered {
    private List<String> blackUrl=new ArrayList<>();
    //添加非法url请求路径
    public BlackUrlGlobalFilter() {
        blackUrl.add("/nacos/provider/echo/9010");
        blackUrl.add("/nacos/provider/echo/9011");
    }


    private List<String> include;
    /**
     * exchange参数用来获取请求和响应对象
     * chain参数 表示过滤链
     * 返回值 Mono对象,本质上是一个(publisher)
     * 这是Spring5.0以后,WebFlux框架中的一个对象
     */
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        //获取请求和响应对象
        ServerHttpRequest request = exchange.getRequest();
        ServerHttpResponse response = exchange.getResponse();
        //获取请求对象的路径(不需要ip和端口号)
        String requestPath = request.getURI().getPath();
        System.out.println(requestPath);
        //判断是否是非法url
        if (include.contains(requestPath)){
            //1.如果该请求为非法请求,则抛出异常
            //throw new RuntimeException("这个请求已被列入黑名单");
            //2.响应一个error消息
            //告诉浏览器响应的数据类型以及什么编码呈现数据
            response.getHeaders().add(HttpHeaders.CONTENT_TYPE,"text/html;charset=UTF-8");
            //封装数据
            DataBuffer data = response.bufferFactory().wrap("当前url不允许访问资源".getBytes(StandardCharsets.UTF_8));
            //将数据加入消息队列
            return response.writeWith(Mono.just(data));
        }
        //继续执行下一个过滤链
        return chain.filter(exchange);
    }

    /**
     * 定义过滤器优先级,数字越小越先执行
     * */
    @Override
    public int getOrder() {

        return 0;
    }
}

局部过滤器:GatewayFilter,作用在单一路由上,其中配置文件中的Filters就是基于此API的实现类对请求路径进行一些操作的

常见问题

为什么要使用网关

对url统一管理,服务保护,统一身份认证,统一跨域设计...

 网关入门实现步骤

1.依赖导入

<!--添加gateway依赖-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

注意:此依赖包含了Spring Boot启动依赖,就不用再导入启动依赖了

2.配置文件修改

server:
  port: 9000
spring:
  application:
    name: sca-gateway2
  cloud:
    gateway:
      routes: #配置网关路由规则
        - id: route01  #路由id,自己指定一个唯一值即可
          uri: http://localhost:8082/ #网关帮我们转发的url
          predicates: ###断言(谓词):匹配请求规则  
            - Path=/nacos/provider/echo/**  #请求路径定义,此路径对应uri中的资源
          filters: ##网关过滤器,用于对谓词中的内容进行判断分析以及处理
            - StripPrefix=1 #转发之前去掉path中第一层路径,例如nacos

 3.添加启动项

@SpringBootApplication

public class GatewayApplication {
    public static void main(String[] args) {
        SpringApplication.run(GatewayApplication.class, args);
    }
}

4.测试

当我们访问9000端口,结果返回sca-provider服务的内容

注意:服务转发不一定要将gateway注册到nacos

网关中的负载均衡底层是基于什么实现的

基于Ribbon,LoadBalancerFilter

网关中的谓词对象是怎么创建的

通过谓词工厂

常用的谓词对象

Path,Method,AfterDatetime,BeforeDatetime....

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值