springcloudAlibaba API网关SpringcloudGateway学习笔记

java1234

共 3888字,需浏览 8分钟

 ·

2020-12-04 15:49

点击上方蓝色字体,选择“标星公众号”

优质文章,第一时间送达

66套java从入门到精通实战课程分享

一、概述

  • 服务发现,让内容中心总能找到与用户中心

  • 内容中心整合ribbon,实现负载均衡

  • 使用feign,让HTTP的远程调用更加优雅

  • 使用sentinel,提升应用的可用性以及容错性

  • 使用spring消息编程模型、stream消息编程模型,实现了基于rocketMQ的通信

下图为小程序直接调用微服务:

  • 认证复杂,登录需要验证,若使用此模式,则需要在内容中心、用户中心上做登录认证

  • 导致客户端难以重构,随着项目迭代,可能需要重新划分微服务,若微服务域名什么都变了,则客户端就要做大量的改动

  • 其他微服务使用了某种浏览器不友好协议,直接访问访问不了

使用服务(API)网关:

  • 可以在API网关做统一认证,再将请求进行转发到后端微服务

  • 采用这样的方式,对外暴露的永远是一个域名,不论内部微服务如何拆分,域名都不会变,这样客户端重构成本大大降低

  • 其他微服务为浏览器不友好协议,可以在网关上边转换为有好的协议,如HTTP、websocket

二、spring cloud gateway

  • 是spring cloud的网关(第二代),未来取代Zuul(第一代)

  • 基于Netty、Reactor以及WebFlux构建
    ① Netty:网络通信框架,可以实现高性能的服务端以及客户端
    ② Reactor:是一个Reactive模型的编程实现

  • 优点:
    ① 性能强劲,是zuul的1.6倍 性能PK
    ② 功能强大,内置了很多实用功能,比如转发、监控、限流等
    ③ 设计优雅,易扩展

  • 缺点:
    ① 依赖Netty与Webflux,不是Servlet编程模型,有一定的学习成本
    ② 不能在Servlet容器中工作,无法构建war包(只能打成jar包),部署到tomcat
    ③ 不支持spring boog 1.x

三、网关搭建

  • 新建spring boot项目

  • 加依赖

 

    org.springframework.cloud
    spring-cloud-starter-gateway


  • 加注解:无

  • 写配置:

server:
  port: 8040

# 应用程序名称
spring:
  application:
    name: gateway
  cloud:
    # 服务发现
    nacos:
      discovery:
        server-addr: localhost:8848
    gateway:
      discovery:
        locator:
          # 让gateway通过服务发现找到其他的微服务
          enabled: true
# actuator
management:
  # 展示详细信息
  endpoint:
    health:
      show-details: always
  # 暴露所有端点
  endpoints:
    web:
      exposure:
        include: '*'

以上,已通过spring cloud gateway实现了对微服务的反向代理,并且还能总结转发规律

四、核心概念

route(路由):spring cloud gateway 基础元素,可简单理解成一条转发规则。包含如下

  • id

  • 目标url

  • predicate(谓词):即java.util.function.predicate,spring cloud gateway使用predicate实现路由的匹配条件

  • filter(过滤器):修改请求即响应

配置示例:

1、架构

  • gateway client:不是严格意义上的客户端,泛指外部请求

  • proxied service:被代理的微服务

  • gateway mapping:会判断请求的路径是否匹配路由的配置

  • gateway Handler:如果mapping匹配成功,Handler会读取这个路由上的所有过滤器,然后把请求交给过滤器处理

2、内置路由谓词工厂详解

(route predicate factories)使用手记

3、自定义路由谓词工厂

  • 写配置

  • 代码示例

@Component
public class TimeBetweenRoutePredicateFactory extends AbstractRoutePredicateFactory {
    public TimeBetweenRoutePredicateFactory() {
        super(TimeBetweenConfig.class);
    }

    @Override
    public Predicate apply(TimeBetweenConfig config) {
        LocalTime start = config.getStart();
        LocalTime end = config.getEnd();
        return serverWebExchange -> {
            LocalTime now = LocalTime.now();
            return now.isAfter(start) && now.isBefore(end);
        };
    }

    @Override
    public List shortcutFieldOrder() {
        return Arrays.asList("start","end");
    }
}

@Data
class TimeBetweenConfig {
    private LocalTime start;
    private LocalTime end;
}

配置不生效问题解决:对 url:lb://user-center 使用理解错误

  • 错误理解是带user-center都会匹配此规则

  • 正确理解是http://localhost:8040将会被转发到http://user-center 通过nacos自动获取地址

4、内置过滤器工厂

Spring Cloud Gateway-过滤器工厂详解(GatewayFilter Factories)

5、自定义过滤器工厂

  • 写配置

  • 代码示例

@Slf4j
@Component
public class PreLogGatewayFilterFactory extends AbstractNameValueGatewayFilterFactory {
    public PreLogGatewayFilterFactory() {
    }

    public GatewayFilter apply(NameValueConfig config) {
        GatewayFilter filter = (((exchange, chain) -> {
            log.info("请求进来了...{}={}",config.getName(),config.getValue());
            ServerHttpRequest modifiedRequest = exchange.getRequest().mutate().build();
            ServerWebExchange modifiedExchange = exchange.mutate().request(modifiedRequest).build();
            return chain.filter(modifiedExchange);
        }));
        return new OrderedGatewayFilter(filter,1000);
    }
}

6、全局过滤器

Spring Cloud Gateway-全局过滤器(Global Filters)

过滤器顺序

  • order越小越靠前执行

  • 局部过滤器的order,会按照配置顺序,按1开始递增

  • 若配置了默认过滤器,会按照配置顺序,按1开始递增,默认过滤器会比局部过滤器优先

  • 如需自行控制order,可返回OrderedGatewayFilter

五、整合容错服务

1、gateway默认整合Hystrix,配置如下

六、监控

Spring Cloud Gateway监控

排错、调试技巧总结

七、限流

Spring Cloud Gateway限流详解

Unable to find GatewayFilterFactory with name RequestRateLimiter报错:

  • 要添加redis依赖

  • 添加了还报错,仔细检查,是否写错位置,写到节点下

八、总结



版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:

https://blog.csdn.net/lzf2284466/article/details/109895210






粉丝福利:实战springboot+CAS单点登录系统视频教程免费领取

???

?长按上方微信二维码 2 秒
即可获取资料



感谢点赞支持下哈 

浏览 49
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报