java基础巩固-宇宙第一AiYWM:为了维持生计,架构知识+分布式微服务+高并发高可用高性能知识序幕就此拉开(二:网关组件:Zuul、Spring Cloud Gateway、Kong...)~整起

上集,在架构知识+分布式微服务+高并发高可用高性能知识序幕就此拉开(一:总览篇)中,说到了 当用户请求过来时,这个请求或者说URL先到服务调用端【咱们之前的项目中的Controller其实就算是一个服务调用方,用来接受请求】,当然啦,由于咱们的需求不同,咱们可以把controller放到不同的服务器中作为单独的节点

  • 其实上一个开篇文章主要的说白了就是,为了解决请求量大,搞了横向扩展分布式集群,并用负载均衡均匀请求量,但是由于同一应用不同模块访问量不一样,又做模块拆分【拆分后也可以由于访问量做分布式集群】或者叫服务拆分,拆分后就产生了四个问题【会产生四个问题,本质就是网络不可靠】,就出现了解决这四个问题的三种方案:Spring Cloud Netflix、Spring Cloud Alibaba、Apache Dubbo Zookeeper三种
    • 微服务架构是一种架构风格,提倡将单一应用程序划分为一组小的服务,也就是一个又一个用SpringBoot开发的一个又一个jar包,每个服务运行在其独立的自己的进程内,每个服务能够被独立部署在生产环境中【微服务可以理解为咱们IDEA中的一个个module】。每个服务可以用不同语言实现,数据也可以以不同形式存储等
    • 服务拆分后,只要导入对应服务的依赖,我就可以调用那个服务中的资源们了
      java基础巩固-宇宙第一AiYWM:为了维持生计,架构知识+分布式微服务+高并发高可用高性能知识序幕就此拉开(二:网关组件:Zuul、Spring Cloud Gateway、Kong...)~整起_第1张图片
    • 不管是这里的网关组件,还是注册中心组件、配置中心组件…。一般Spring Cloud这里的中间组件使用思路都是
      • 1.pom.xml导依赖,需要啥你导啥,注意版本兼容性
      • 2.写application.xml配置:端口号、服务名称、你要干的中间件的地址或者说你要被哪个中间件管理,你把人家地址写到自己配置文件中【你要注册就把注册中心地址写上】
      • 3.@EnableXxx启动这个中间件

PART1:网关

  • 网关:其实网关主要的任务就是一件事:请求过滤。所有的服务都有他来路由【把来的URL,拦截住URL请求映射到服务调用端中的哪个Controller中】
    java基础巩固-宇宙第一AiYWM:为了维持生计,架构知识+分布式微服务+高并发高可用高性能知识序幕就此拉开(二:网关组件:Zuul、Spring Cloud Gateway、Kong...)~整起_第2张图片
    • 没有网关也行,但是有网关之后,咱们可以统一管理请求,对请求进行 路由转发和过滤【有些请求就不应该过来访问我】。但是找个网关其实感觉就是找个大门口的保安,我不需要所有的客户都来前台进行处理,把处理压力都给到前台工作人员这里,一些闹事的不是诚心来消费的就可以让门口保安帮我过滤掉,
      java基础巩固-宇宙第一AiYWM:为了维持生计,架构知识+分布式微服务+高并发高可用高性能知识序幕就此拉开(二:网关组件:Zuul、Spring Cloud Gateway、Kong...)~整起_第3张图片
    • 我们不管是直接上手微服务项目,还是把原来的老旧项目拆分为微服务项目,里面肯定免不了要涉及到很多服务,就拿XXX高速项目举例。这个XXX高速项目可以拆分为数据管理【历史数据、实时数据、预测数据】、视频监控、预警管理等。假设有很多个高速都会有这三个模块,没有网关的话,我们就需要在每个服务中单独实现这三个,这使得我们做了 很多重复的事情并且没有一个全局的视图 来统一管理这些功能。
      • 再比如现阶段常见的一些开源项目中的常见功能,请求转发、安全认证(身份/权限认证)、流量控制、负载均衡、降级熔断、日志、监控,网关可以拦截一切请求,所以没必要为每个用户都准备一个权限认证。在网关这个服务中做一个统一的权限认证,就让我网关拦截住就行,其实是一个道理。
    • 常见的网关服务:
      • Netflix Zuul:Zuul 是 Netflix 开发的一款提供动态路由、监控、弹性、安全的网关服务
        java基础巩固-宇宙第一AiYWM:为了维持生计,架构知识+分布式微服务+高并发高可用高性能知识序幕就此拉开(二:网关组件:Zuul、Spring Cloud Gateway、Kong...)~整起_第4张图片
        • 学习地址:
          • Github 地址 : https://github.com/Netflix/zuul
          • 官方 Wiki : https://github.com/Netflix/zuul/wiki
        • 网关是系统唯一对外的入口,介于客户端与服务器端之间,用于对请求进行鉴权、限流、 路由、监控等功能。【网关有的功能,Zuul 基本都有。而 Zuul 中最关键的就是 路由和过滤器了
          java基础巩固-宇宙第一AiYWM:为了维持生计,架构知识+分布式微服务+高并发高可用高性能知识序幕就此拉开(二:网关组件:Zuul、Spring Cloud Gateway、Kong...)~整起_第5张图片
          • Zuul 主要通过过滤器(类似于 AOP)来过滤请求,从而实现网关必备的各种功能
            • Zuul 是从设备和 web 站点到 Netflix 流应用后端的所有请求的前门它还具有根据情况将请求路由到多个 Amazon Auto Scaling Groups(亚马逊自动缩放组,亚马逊的一种云计算方式) 的能力。Eureka等服务注册与发现那里我们可以看到,服务提供者是 消费者通过 Eureka Server 进行访问的【也就是Eureka Server 是 服务提供者的统一入口。】。那么整个应用中存在那么多 消费者 需要用户进行调用,这个时候用户该怎样访问这些 消费者工程 呢?当然可以像之前那样直接访问这些工程。但这种方式没有统一的消费者工程调用入口,不便于访问与管理,而 Zuul 就是这样的一个对于 消费者 的统一入口。
          • Zuul 作为网关肯定也存在 单点问题 ,如果我们要保证 Zuul 的高可用,我们就需要进行 Zuul 的集群配置,这个时候可以借助额外的一些负载均衡器比如 Nginx
        • 三种跨域解决方案:使用httpclient,不依赖浏览器、在控制层加入允许跨域的注解 @CrossOrigin、使用网关 Gateway
          • 因为浏览器的同源政策,就会产生跨域。比如说发送的异步请求是不同的两个源,就比如是不同的的两个端口或者不同的两个协议或者不同的域名。由于浏览器为了安全考虑,就会产生一个同源政策,不是同一个地方出来的是不允许进行交互的。
        • Zuul 的路由功能:
          java基础巩固-宇宙第一AiYWM:为了维持生计,架构知识+分布式微服务+高并发高可用高性能知识序幕就此拉开(二:网关组件:Zuul、Spring Cloud Gateway、Kong...)~整起_第6张图片
          • 前面说了,SpringCloud这里的组件都是导依赖+写配置+写controller、加注解【写配置类、写主程序类】。
            • Zuul 主要配置信息如下:
              java基础巩固-宇宙第一AiYWM:为了维持生计,架构知识+分布式微服务+高并发高可用高性能知识序幕就此拉开(二:网关组件:Zuul、Spring Cloud Gateway、Kong...)~整起_第7张图片
            • 统一前缀:我们可以在前面加一个统一的前缀,比如我们刚刚调用的是 localhost:9000/consumer1/studentInfo/update,这个时候我们在 yaml 配置文件中添加如下。
              java基础巩固-宇宙第一AiYWM:为了维持生计,架构知识+分布式微服务+高并发高可用高性能知识序幕就此拉开(二:网关组件:Zuul、Spring Cloud Gateway、Kong...)~整起_第8张图片
            • 路由策略配置:前面的访问方式(直接使用服务名),需要将微服务名称暴露给用户,会存在安全性问题。所以,可以自定义路径来替代微服务名称,即自定义路由策略。
              java基础巩固-宇宙第一AiYWM:为了维持生计,架构知识+分布式微服务+高并发高可用高性能知识序幕就此拉开(二:网关组件:Zuul、Spring Cloud Gateway、Kong...)~整起_第9张图片
            • 服务名屏蔽:配置完路由策略之后使用微服务名称还是可以访问的,这个时候你需要将服务名屏蔽。
              在这里插入图片描述
            • 路径屏蔽:Zuul 还可以指定屏蔽掉的路径 URI,即只要用户请求中包含指定的 URI 路径,那么该请求将无法访问到指定的服务。通过该方式可以限制用户的权限。
              java基础巩固-宇宙第一AiYWM:为了维持生计,架构知识+分布式微服务+高并发高可用高性能知识序幕就此拉开(二:网关组件:Zuul、Spring Cloud Gateway、Kong...)~整起_第10张图片
            • 敏感请求头屏蔽:默认情况下,像 Cookie、Set-Cookie 等敏感请求头信息会被 zuul 屏蔽掉,我们可以将这些默认屏蔽去掉,当然,也可以添加要屏蔽的请求头
        • Zuul的过滤功能:所有请求都经过网关(Zuul),那么我们可以进行各种过滤,这样我们就能实现 限流,灰度发布,权限控制 等等。【我们可以自定义过滤器来处理请求,并且,Zuul 生态本身就有很多现成的过滤器供我们使用】。Zuul 1.x 基于同步 IO,性能较差。Zuul 2.x 基于 Netty 实现了异步 IO,性能得到了大幅改进
          • 要实现自己定义的 Filter 我们只需要继承 ZuulFilter 然后将这个过滤器类以 @Component 注解加入 Spring 容器中就行了。
            java基础巩固-宇宙第一AiYWM:为了维持生计,架构知识+分布式微服务+高并发高可用高性能知识序幕就此拉开(二:网关组件:Zuul、Spring Cloud Gateway、Kong...)~整起_第11张图片
        • 令牌桶限流:Zuul 只要是限流的活它都能干
          java基础巩固-宇宙第一AiYWM:为了维持生计,架构知识+分布式微服务+高并发高可用高性能知识序幕就此拉开(二:网关组件:Zuul、Spring Cloud Gateway、Kong...)~整起_第12张图片
      • Spring Cloud Gateway
        • SpringCloud Gateway 属于 Spring Cloud 生态系统中的网关,其诞生的目标是为了 替代 老牌网关 Zuul。准确点来说,应该是 Zuul 1.x。SpringCloud Gateway 起步要比 Zuul 2.x 【Spring Cloud Gateway 和 Zuul 2.x 的差别不大,也 是通过过滤器来处理请求。不过,目前更加推荐使用 Spring Cloud Gateway 而非 Zuul,Spring Cloud 生态对其支持更加友好。】更早。【为了提升网关的性能,SpringCloud Gateway 基于 Spring WebFlux 。Spring WebFlux 使用 Reactor 库来实现响应式编程模型,底层基于 Netty 实现异步 IO。Spring Cloud Gateway 的目标,不仅提供统一的路由方式,并且基于 Filter 链的方式提供了网关基本的功能,例如:安全,监控/指标,和限流。】
          • Spring 5 与响应式编程:Spring 5 中内嵌了与数据管理相关的响应式数据访问、与系统集成相关的响应式消息通信以及与 Web 服务相关的响应式 Web 框架等多种响应式组件,从而极大地简化了响应式应用程序的开发过程和开发难度
            java基础巩固-宇宙第一AiYWM:为了维持生计,架构知识+分布式微服务+高并发高可用高性能知识序幕就此拉开(二:网关组件:Zuul、Spring Cloud Gateway、Kong...)~整起_第13张图片
          • Spring MVC 和 Spring WebFlux 之间的区别和联系:
            java基础巩固-宇宙第一AiYWM:为了维持生计,架构知识+分布式微服务+高并发高可用高性能知识序幕就此拉开(二:网关组件:Zuul、Spring Cloud Gateway、Kong...)~整起_第14张图片
      • Kong
        • 一款基于 OpenResty 【OpenResty 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关】的高性能、云原生、可扩展的网关系统。
        • 芋道源码老师有对网关系统设计的模板通用思路:网关【连接两个不同的网络都可以叫网关(工作在数据链路层,在不同或相同类型的LAN之间存储并转发数据帧,必要时进行链路层上的协议转换)、网关所管理的服务粒度可粗可细、网管需要具备的功能【请求路由、服务注册、负载均衡、安全方面】、网关设计思路(网关设计重点主要是三个, 高性能、高可用、高扩展)】与网桥、常见网关对比,用到时可以好好看看
      • APISIX:一款基于 Nginx 和 etcd【etcd是使用 Go 语言开发的一个开源的、高可用的分布式 key-value 存储系统,使用 Raft 协议做分布式共识。】 的高性能、云原生、可扩展的网关系统。与传统 API 网关相比**,APISIX 具有动态路由和插件热加载,特别适合微服务系统下的 API 管理。并且,APISIX 与 SkyWalking(分布式链路追踪系统)、Zipkin(分布式链路追踪系统)、Prometheus(监控系统) 等 DevOps 生态工具对接都十分方便**。
      • Shenyu:一款基于 WebFlux 的可扩展、高性能、响应式网关,Apache 顶级开源项目。Shenyu 通过插件扩展功能,插件是 ShenYu 的灵魂,并且插件也是可扩展和热插拔的。不同的插件实现不同的功能。Shenyu 自带了诸如限流、熔断、转发 、重写、重定向、和路由监控等插件

未完待续…

巨人的肩膀:
Spring Cloud中文文档:https://www.apiref.com/spring-cloud-zh/dalston/#_router_and_filter_zuul
javaGuide
B战各位老师
分布式服务框架原理与实践_李林锋著
芋道源码

你可能感兴趣的:(java,微服务,架构,网关)