Spring Cloud Zuul路由器(收藏了)

作者 : 开心源码 本文共3315个字,预计阅读时间需要9分钟 发布时间: 2022-05-12 共77人阅读

服务网关是微服务架构中一个不可或者缺的部分。通过服务网关统一向外系统提供REST API的过程中,除了具有服务路由、均衡负载功能之外,它还具有了权限控制等功能。Spring Cloud Netflix中的Zuul就担任了这样的一个角色,为微服务架构提供了前门保护的作使用,同时将权限控制这些较重的非业务逻辑内容迁移到服务路由层面,使得服务集群主体能够具有更高的可复使用性和可测试性。

路由在微服务体系结构的一个组成部分。例如,/可以映射到您的Web应使用程序,/api/users映射到使用户服务,并将/api/shop映射到商店服务。Zuul是Netflix的基于JVM的路由器和服务器端负载均衡器。

Netflix用Zuul进行以下操作:

  • 认证
  • 洞察
  • 压力测试
  • 金丝雀测试
  • 动态路由
  • 服务迁移
  • 负载脱落
  • 安全
  • 静态响应解决
  • 主动/主动流量管理

Zuul的规则引擎允许基本上写任何JVM语言编写规则和过滤器,内置Java和Groovy。

什么是服务网关

服务网关 = 路由转发 + 过滤器

1、路由转发:接收一切外界请求,转发到后台的微服务上去;

2、过滤器:在服务网关中可以完成一系列的横切功能,例如权限校验、限流以及监控等,这些都可以通过过滤器完成(其实路由转发也是通过过滤器实现的)。

为什么需要服务网关

上述所说的横切功能(以权限校验为例)可以写在三个位置:

  • 每个服务自己实现一遍
  • 写到一个公共的服务中,而后其余所有服务都依赖这个服务
  • 写到服务网关的前置过滤器中,所有请求过来进行权限校验

第一种,缺点太显著,基本不使用;

第二种,相较于第一点好很多,代码开发不会冗余,但是有两个缺点:

  • 因为每个服务引入了这个公共服务,那么相当于在每个服务中都引入了相同的权限校验的代码,使得每个服务的jar包大小无故添加了少量,尤其是对于用docker镜像进行部署的场景,jar越小越好;
  • 因为每个服务都引入了这个公共服务,那么我们后续更新这个服务可能就比较困难,而且公共服务的功能越多,更新就越难,而且假设我们改变了公共服务中的权限校验的方式,想让所有的服务都去用新的权限校验方式,我们就需要将之前所有的服务都重新引包,编译部署。

而服务网关刚好可以处理这样的问题:

  • 将权限校验的逻辑写在网关的过滤器中,后台服务不需要关注权限校验的代码,所以服务的jar包中也不会引入权限校验的逻辑,不会添加jar包大小;
  • 假如想修改权限校验的逻辑,只要要修改网关中的权限校验过滤器就可,而不需要更新所有已存在的微服务。

所以,需要服务网关!!!

服务网关技术选型

引入服务网关后的微服务架构如上,总体包含三部分:服务网关、open-service和service。

1、总体流程:

  • 服务网关、open-service和service启动时注册到注册中心上去;
  • 使用户请求时直接请求网关,网关做智能路由转发(包括服务发现,负载均衡)到open-service,这其中包含权限校验、监控、限流等操作
  • open-service聚合内部service响应,返回给网关,网关再返回给使用户

2、引入网关的注意点

  • 添加了网关,多了一层转发(本来使用户请求直接访问open-service就可),性能会下降少量(但是下降不大,通常,网关机器性能会很好,而且网关与open-service的访问通常是内网访问,速度很快);
  • 网关的单点问题:在整个网络调使用过程中,肯定会有一个单点,可能是网关、nginx、dns服务器等。防止网关单点,可以在网关层前边再挂一台nginx,nginx的性能极高,基本不会挂,这样之后,网关服务即可以不断的增加机器。但是这样一个请求就转发了两次,所以最好的方式是网关单点服务部署在一台牛逼的机器上(通过压测来估算机器的配置),而且nginx与zuul的性能比较,根据国外的一个哥们儿做的试验来看,其实相差不大,zuul是netflix开源的一个使用来做网关的开源框架;
  • 网关要尽量轻。

3、服务网关基本功能

  • 智能路由:接收外部一切请求,并转发到后台的对外服务open-service上去;
  • 注意:我们只转发外部请求,服务之间的请求不走网关,这就表示全链路追踪、内部服务API监控、内部服务之间调使用的容错、智能路由不能在网关完成;当然,也可以将所有的服务调使用都走网关,那么几乎所有的功能都可以集成到网关中,但是这样的话,网关的压力会很大,不堪重负。
  • 权限校验:只校验使用户向open-service服务的请求,不校验服务内部的请求。服务内部的请求有必要校验吗?
  • API监控:只监控经过网关的请求,以及网关本身的少量性能指标(例如,gc等);
  • 限流:与监控配合,进行限流操作;
  • API日志统一收集:相似于一个aspect切面,记录接口的进入和出去时的相关日志
  • 。。。后续补充

4、技术选型

笔者准备自建一个轻量级的服务网关,技术选型如下:

  • 开发语言:java + groovy,groovy的好处是网关服务不需要重启即可以动态的增加filter来实现少量功能;
  • 微服务基础框架:springboot;
  • 网关基础组件:netflix zuul;
  • 服务注册中心:consul;
  • 权限校验:jwt;
  • API监控:prometheus + grafana;
  • API统一日志收集:logback + ELK;
  • 压力测试:Jmeter;
  • 。。。后续补充
  • 在后续的详情中,会逐步详情各个知识点,并完成一个轻量级的服务网关!!!

Spring Cloud Zuul

简单用

新建项目 spring-cloud-zuul-service

增加依赖

org.springframework.cloud

spring-cloud-starter-zuul

开启服务注册

在程序的启动类 ZuulApplication 通过 @EnableZuulProxy 开启 Zuul 服务网关

package io.ymq.example.zuul;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.cloud.netflix.zuul.EnableZuulProxy;

@EnableZuulProxy

@SpringBootApplication

public class ZuulApplication {

public static void main(String[] args) {

SpringApplication.run(ZuulApplication.class, args);

}

}

增加配置

配置文件 application.yml

spring:

application:

name: zuul-service

server:

port: 9000

zuul:

routes:

blog:

path: /ymq/**

url: http://www.ymq.io/about

请关注小编,后续会推出更多精彩内容

本人从事行业工作8年了,工作之余搜集了少量视频资料

有JAVA高级架构师、系统高级架构师、大数据、机器(深度)学习/数据挖掘/数据分析/算法/计算机视觉、Android、IOS、Web前台、JavaScript、WebApp(React Native)、微信小程序开发、C、C++、Python开发运维、Linux运维架构内核、PHP、.Net、数据库、UID、游戏开发、软件测试、网络编程、FFmpeg开发、计算机软考等教程

我把资料都共享出来,也算是物尽其使用,希望能帮到需要的人,不使用费时在找资料;

资料也在不断升级中,不管是新手,还是老手,都能找到你需要的资料;

获取方式:

1、因为人数太多,请评论区留下你们评论

2、评论后私信我:“xx资料”就可领取!如:大数据资料,dubbo资料,云计算资料等等

老规矩,一个转发+评论,一份资料。名额有限,太多人我送不过来,请谅解!

资料只为有需要的朋友准备,而且整理不易,假如觉得资源不错,希望大家能积极转发让更多人看到,给予小编鼓励与支持,有动力分享资源。

下期资源更劲爆哦,欢迎关注 + 留言+点赞+转发+收藏!

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » Spring Cloud Zuul路由器(收藏了)

发表回复