作者:赵计刚

cnblogs.com/java-zhao/p/6716059.html

一、什么是服务网关

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

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切面,记录接口的进入和出去时的相关日志

  • 。。。后续补充

上述功能是网关的基本功能,网关还可以实现以下功能:

  • A|B测试:A|B测试时一块比较大的东西,包含后台实验配置、数据埋点(看转化率)以及分流引擎,在服务网关中,可以实现分流引擎,但是实际上分流引擎会调用内部服务,所以如果是按照上图的架构,分流引擎最好做在open-service中,不要做在服务网关中。

  • 。。。后续补充

4、技术选型

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

  • 开发语言:java + groovy,groovy的好处是网关服务不需要重启就可以动态的添加filter来实现一些功能;

  • 微服务基础框架:springboot;

  • 网关基础组件:netflix zuul;

  • 服务注册中心:consul;

  • 权限校验:jwt;

  • API监控:prometheus + grafana;

  • API统一日志收集:logback + ELK;

  • 压力测试:Jmeter;

  • 。。。后续补充

在后续的介绍中,会逐渐介绍各个知识点,并完成一个轻量级的服务网关!!!

特别推荐一个分享架构+算法的优质内容,还没关注的小伙伴,可以长按关注一下:长按订阅更多精彩▼如有收获,点个在看,诚挚感谢

为什么微服务一定要有网关呢?相关推荐

  1. .NET微服务架构及API网关

    .NET微服务架构及API网关 原文:.NET微服务架构及API网关 一.MSA简介 1.1.MSA是什么 微服务架构MSA是Microservice Architecture的简称,它是一种架构模式 ...

  2. .Net微服务架构:API网关

    本人建立了个人技术.工作经验的分享微信号,计划后续公众号同步更新分享,比在此更多具体.欢迎有兴趣的同学一起加入相互学习.基于上篇微服务架构分享,今天分享其中一个重要的基础组件"API网关&q ...

  3. 微服务学习总结4(网关和consul结合)

    先上一张图片: 首先要启动consul服务,用于对三个日志服务的注册和发现.(默认端口8500) 然后启动三个日志服务,端口分别为5726.5727.5728. 最后启动网关服务,用于转发客户端请求, ...

  4. 万字长文解析:分布式架构、SOA、微服务架构、API网关、ESB服务总线架构之间的关联及演进

    1架构演进 架构十五年:改变的是形态,不变的是目的 业务驱动架构形态变化 过去十几年,随着互联网发展以及业务的多样化,系统的架构也在不断发生变化,总体上来说大体经历了从单体应用架构-垂直应用架构-分布 ...

  5. .Net Core微服务入门——Ocelot API网关接入(二)

    Net Core微服务入门--Ocelot API网关接入(二) 我们先接入Consul,实现服务发现 服务发现 1.引入 Ocelot.Provider.Consul 包 2.修改ocelot.js ...

  6. .Net Core微服务入门——Ocelot API网关接入(一)

    .Net Core微服务入门--Ocelot API网关接入 上一章我们测试了一个简单的Client 端访问Consul实现服务注册与发现,但是现实生产环境我们直接通过Client自行连接Consul ...

  7. 基于go-micro微服务的实战-实现网关Gateway(三)

    基于go-micro微服务的实战-实现网关Gateway(三) 文章最后附带完整代码 基于go-micro实现网关层 创建好网关层目录 common: 公告模块,配置初始化等 conf: 配置文件 h ...

  8. 微服务(六)网关zuul

    微服务(六)网关zuul 1.网关zuul 2.负载均衡 1.网关zuul 微服务基本模块已经有了,也可以做微服务了.但完成一个复杂的业务,可能需要多个微服务合作来完成,比如下单,需要用户服务,支付服 ...

  9. 微服务架构~BFF和网关是如何演化出来的

    介绍 BFF(Backend for Frontend)和网关Gateway是微服务架构中的两个重要概念,这两个概念相对比较新,有些开发人员甚至是架构师都不甚理解. 本文用假想的公司案例+图示的方式, ...

  10. 微服务架构 BFF和网关是如何演化出来的

    文章目录 1. 介绍 2. 服务化架构V1 3. 服务化架构V2 4. 服务化架构V2.1 5. 服务化架构V3 6. 服务化架构V4 7. 结论 1. 介绍 BFF(Backend for Fron ...

最新文章

  1. MLIR多级中间表示概述
  2. github 克隆项目过慢
  3. asp.net高亮显示搜索关键字的两个方法
  4. 悬镜 linux防黑加固平台,悬镜答疑丨悬镜服务器防护CC效果如何?
  5. mqtt linux 编译,MQTT客户端代码X64位Ubuntu环境编译+测试实践小结
  6. 【JS 逆向百例】网洛者反爬练习平台第一题:JS 混淆加密,反 Hook 操作
  7. 常见的div盒子居中(上下左右)实现
  8. 概述--Nginx集成Vcenter 6.X HTML Console系列之 1--(共4)
  9. 对PostgreSQL中bgwriter的 MyProc 的理解
  10. nodejs与sqlite
  11. 【花朵识别】基于matlab模板匹配花朵分类【含Matlab源码 472期】
  12. 【2】基于深度神经网络的脑电睡眠分期方法研究(标签导入)
  13. afp专用计算机,FRM考试只能用这些金融计算器(内含用法功能全解读)
  14. 咸蛋超人的CxImage学习之路(一)
  15. Elastic基本概念
  16. 虚拟机逻辑卷删除失败
  17. 维谛(Vertiv)培训中心迁新址,再攀培训业务新高峰
  18. Java_Save could not be completed. Try File> Save As. if the problem persists.
  19. ECDH_SECP256R1 + X9.63 KDF-SHA256
  20. 软考的高级证书难考吗,难度大吗?

热门文章

  1. PTA团体程序设计天梯赛-L2-023 图着色问题
  2. 大掌门2显示服务器繁忙,《大掌门2》二周年庆典开启 真传弟子潇洒归来
  3. 关于python和anaconda的一些基础认识
  4. P1049 装箱问题
  5. Codeforces Round #562 (Div. 2) B. Pairs
  6. 【AngularJS】—— 9 自定义过滤器
  7. JBoss企业级应用服务平台群集指南(五)
  8. 话说TP框架里的Vendor这目录是干什么用的啊?类库扩展thinkphp3.1版本
  9. JS BOM 浏览器对象模型
  10. 《jQuery Mobile入门经典》—— 第 1 章 了解jQuery Mobile