为什么做微服务网关(微服务网关如何调用服务)

网友投稿 257 2022-12-28


本篇文章给大家谈谈为什么做微服务网关,以及微服务网关如何调用服务对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。 今天给各位分享为什么做微服务网关的知识,其中也会对微服务网关如何调用服务进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

Spring Cloud

本文中我们主要介绍微服务开发框架——Spring Cloud。尽管Spring Cloud带有"Cloud"的字样,但它并不是云计算解决方案,而是Spring Boot的基础上构建的,用于快速构建分布式系统的通用模式的工具集。

Spring Cloud有以下特点:

由上图可知,Spring Cloud是以 英文单词+SR+数字 的形式命名版本号的。那么英文单词和SR分别表示什么呢?
因为Spring Cloud是一个综合项目,它包含很多子项目。由于子项目也维护着自己的版本号,Spring Cloud采用了这种命名方式,从而避免与子项目的版本混淆。其中英文单词如Edware是伦敦某地铁站名,它们按照字母顺序发行,可以将其理解为主版本的演进。SR表示"Service Release",一般表示Bug修复。

版本兼容性如下

版本内容

可参考官方文档: https://spring.io/projects/spring-cloud#overview

我的上一篇博客(微服务理论篇)中谈到,对单体应用进行服务拆分得到各个微服务,而这些服务又是相互独立的,那么我们如何知道各个微服务的健康状态、如何知道某个微服务的存在呢?由此、一个拥有服务发现的框架显得尤为重要。这也就是Eureka诞生的原因。

综上,Eureka通过心跳检查、客户端缓存等机制,确保了系统的高可用性、灵活性和可伸缩性。

通过使用Eureka已经实现了微服务的注册与发现。启动各个微服务时,Eureka Client会把自己的网络信息注册到Eureka Server上。似乎一切更美好了一些。然而,这样的架构依然有一些问题,如负载均衡。一般来说,各个微服务都会部署多个实例。那么服务消费者要如何将请求分摊到多个服务提供实例上呢?

如果服务提供者相应非常慢,那么消费者对提供者的请求就会被强制等待,知道提供者响应或超时。在高负载场景下,如果不作任何处理,此类问题可能会导致服务消费者的资源耗竭甚至整个系统崩溃。
微服务架构的应用系统通常包含多个服务层。微服务之间通过网络进行通信,从而支撑起整个应用系统,因此,微服务之间难免存在依赖关系。而这种由于"基础服务故障"导致"级联故障"的现象称为雪崩效应。

如图所示,A最为服务提供者(基础服务),B为A的服务消费者,C和D是B的服务消费者。当A不可用引起了B的不可用,并将不可用像滚雪球一样放大到C和D时,雪崩效应就形成了。
那么Hystrix是如何容错的呢?

以下对该图做个简单讲解:

Zuul作为微服务架构中的微服务网关。微服务架构经过前几个组件的组合,已经有了基本的雏形了,那么我们为什么还要使用微服务网关呢?我们可以想象,一般情况下我们一个业务并不是只调用一个接口就可以完成一个业务需求。
如果让客户端直接与各个微服务通信,会有以下问题:

如图,微服务网关封装了应用程序的内部结构,客户端只须跟网关交互,而无须直接调用特定微服务接口。同时,还有以下优点:

为什么要同一管理微服务配置?
对于传统的单体应用,常常使用配置文件管理所有配置。例如一个Spring Boot 项目开发的单体应用,可以将配置内容放到application.yml文件中。如果需要切换环境,可以设置多个Profile,并在启用应用时指定spring.profile.active={profile}。
而在微服务架构中,微服务的配置管理一般有以下需求:

【分享】什么是API网关?大公司为什么都有API网关?

在这篇文章中将我们一起来探讨当前的API网关的作用。
一、API网关的用处
API网关我的分析中会用到以下三种场景。

二、API网关在企业整体架构中的地位
一个企业随着信息系统复杂度的提高,必然出现外部合作伙伴应用、企业自身的公网应用、企业内网应用等,在架构上应该将这三种应用区别开,三种应用的安排级别、访问方式也不一样。
因此在我的设计中将这三种应用分别用不同的网关进行API管理,分别是:API网关(OpenAPI合伙伙伴应用)、API网关(内部应用)、API网关(内部公网应用)。

三、企业中在如何应用API网关
1、对于OpenAPI使用的API网关来说,一般合作伙伴要以应用的形式接入到OpenAPI平台,合作伙伴需要到 OpenAPI平台申请应用。
因此在OpenAPI网关之外,需要有一个面向合作伙伴的使用的平台用于合作伙伴,这就要求OpenAPI网关需要提供API给这个用户平台进行访问。
如下架构:

当然如果是在简单的场景下,可能并不需要提供一个面向合作伙伴的门户,只需要由公司的运营人员直接添加合作伙伴应用id/密钥等,这种情况下也就不需要合作伙伴门户子系统。
2、对于内网的API网关,在起到的作用上来说可以认为是微服务网关,也可以认为是内网的API服务治理平台。
当企业将所有的应用使用微服务的架构管理起来,那么API网关就起到了微服务网关的作用。
而当企业只是将系统与系统之间的调用使用rest api的方式进行访问时使用API网关对调用进行管理,那么API网关起到的就是API服务治理的作用。
架构参考如下:

3、对于公司内部公网应用(如APP、公司的网站),如果管理上比较细致,在架构上是可能由独立的API网关来处理这部分内部公网应用,如果想比较简单的处理,也可以是使用面向合作伙伴的API网关。
如果使用独立的API网关,有以下的好处:
• 面向合作伙伴和面向公司主体业务的优先级不一样,不同的API网关可以做到业务影响的隔离。
• 内部API使用的管理流程和面向合作伙伴的管理流程可能不一样。
• 内部的API在功能扩展等方面的需求一般会大于OpenAPI对于功能的要求。
基于以上的分析,如果公司有能力,那么还是建议分开使用合作伙伴OPEN API网关和内部公网应用网关。

四、API网关解决方案
私有云解决方案如下:
• Kong是基于Nginx+Lua进行二次开发的方案
https://konghq.com/
• Eolinker和Kong比较接近,但是因为是国内公司开发的,后续的技术支持和培训比较友好。
https://www.eolinker.com
• Netflix Zuul,zuul是spring cloud的一个推荐组件, https://github.com/Netflix/zuul
• orange,这个开源程序也是国人开发的,不过这个是个人开发不是公司。
http://orange.sumory.com/
公有云解决方案:
• Amazon API Gateway, https://aws.amazon.com/cn/api-gateway/
• 阿里云API网关, https://www.aliyun.com/product/apigateway/
• 腾讯云API网关, https://cloud.tencent.com/product/apigateway
自开发解决方案:
• 基于Nginx+Lua+ OpenResty的方案,可以看到Eolinker,Kong,orange都是基于这个方案。
• 基于Netty、非阻塞IO模型。通过网上搜索可以看到国内的宜人贷等一些公司是基于这种方案。
• 基于Node.js的方案。这种方案是应用了Node.js天生的非阻塞的特性。
• 基于java Servlet的方案。zuul基于的就是这种方案,这种方案的效率不高,这也是zuul总是被诟病的原因。
五、企业怎么选择API网关
现在的亚马逊、阿里、腾讯云都在提供基础公有云的API网关,当然这些网关的基础功能肯定是没有问题,但是二次开发,扩展功能、监控功能可能就不能满足部分用户的定制需求了。
另外很多企业因为自身信息安全的原因,不能使用外网公有网的API网关服务,这样就只有选择私有云的方案了。
在需求上如果基于公有云的API网关只能做到由内部人员为外网人员申请应用,无法做到定制的合作伙伴门户,这也不适合于部分企业的需求。
如果作为微服务网关,大多数情况下是希望网关服务器和服务提供方服务器是要在内网的,在这里情况下也只有私有云的API网关才能满足需求。
综合上面的分析,基础公有云的API网关只有满足一部分简单客户的需求,对于很多企业来说私有云的API网关才是正确的选择。

微服务 六:服务网关

服务除了内部相互之间调用和通信之外,最终要以某种方式暴露出去,才能让外界系统(例如客户的浏览器、移动设备等等)访问到,这就涉及服务的前端路由,对应的组件是服务网关(Service Gateway),见图(15),网关是连接企业内部和外部系统的一道门,有如下关键作用:

服务反向路由,网关要负责将外部请求反向路由到内部具体的微服务,这样虽然企业内部是复杂的分布式微服务结构,但是外部系统从网关上看到的就像是一个统一的完整服务,网关屏蔽了后台服务的复杂性,同时也屏蔽了后台服务的升级和变化。安全认证和防爬虫,所有外部请求必须经过网关,网关可以集中对访问进行安全控制,比如用户认证和授权,同时还可以分析访问模式实现防爬虫功能,网关是连接企业内外系统的安全之门。

限流和容错,在流量高峰期,网关可以限制流量,保护后台系统不被大流量冲垮,在内部系统出现故障时,网关可以集中做容错,保持外部良好的用户体验。

监控,网关可以集中监控访问量,调用延迟,错误计数和访问模式,为后端的性能优化或者扩容提供数据支持。

日志,网关可以收集所有的访问日志,进入后台系统做进一步分析。

图(15)gateway服务图

除以上基本能力外,网关还可以实现线上引流,线上压测,线上调试(Surgical debugging),金丝雀测试(Canary Testing),数据中心双活(Active-Active HA)等高级功能。

网关通常工作在7层,有一定的计算逻辑,一般以集群方式部署,前置LB进行负载均衡。

开源的网关组件有Netflix的Zuul,其工作原理如下图。

图(16)zuul工作原理图

在介绍过服务注册表和网关等组件之后,我们可以通过一个简化的微服务架构图(17)来更加直观地展示整个微服务体系内的服务注册发现和路由机制,该图假定采用进程内LB服务发现和负载均衡机制。在图(17)的微服务架构中,服务简化为两层,后端通用服务(也称中间层服务Middle Tier Service)和前端服务(也称边缘服务Edge Service,前端服务的作用是对后端服务做必要的聚合和裁剪后暴露给外部不同的设备,如PC,Pad或者Phone)。后端服务启动时会将地址信息注册到服务注册表,前端服务通过查询服务注册表就可以发现然后调用后端服务;前端服务启动时也会将地址信息注册到服务注册表,这样网关通过查询服务注册表就可以将请求路由到目标前端服务,这样整个微服务体系的服务自注册自发现和软路由就通过服务注册表和网关串联起来了。如果以面向对象设计模式的视角来看,网关类似Proxy代理或者Façade门面模式,而服务注册表和服务自注册自发现类似IoC依赖注入模式,微服务可以理解为基于网关代理和注册表IoC构建的分布式系统。

图(17)简化的微服务架构图

微服务网关层

API网关是所有客户端的统一入口。路由服务可以被用于很多目的,例如日志、限流、认证,从而做到应用无感知。API网关对于任意一种处理请求有两种方式处理。一部分请求只要简单路由到相应的服务;还有一些请求需要拆分到多个服务。API Gateway是实现微服务重要的组件之一,常用的网关Zuul, Nginx, Spring Cloud, Linkerd,Envoy,UnderTow。

为了评估API网关各自的性能,我们使用Apache的ab作为压测工具。(另外还可以用Gatling做性能测试)

测试结果和心得如下:

微服务核心组件 Zuul 网关原理剖析

Zuul 网关是具体核心业务服务的看门神为什么做微服务网关,相比具体实现业务的系统服务来说它是一个边缘服务,主要提供动态路由,监控,弹性,安全性等功能。在分布式的微服务系统中,系统被拆为为什么做微服务网关了多套系统,通过zuul网关来对用户的请求进行路由,转发到具体的后台服务系统中。

本 Chat 主要内容如下:

网关是具体核心业务服务的看门神,相比具体实现业务的系统服务来说它是一个边缘服务,主要提供动态路由,监控,弹性,安全性等功能,下面我们从单体应用到多体应用的演化过程来讲解网关的演化历程。

一般业务系统发展历程都是基本相似的,从单体应用到多应用,从本地调用到远程调用。对应单体应用架构模式(如下图1),由于只需一个应用,所有业务模块的功能都打包为了一个 War 包进行部署,这样可以减少机器资源和部署的繁琐。

图1 单体应用

在单体应用中,网关模块是和应用部署到同一个jvm进程里面的,当外部移动设备或者web站点访问单体应用的功能时候,请求是先被应用的网关模块拦截的,网关模块对请求进行鉴权、限流等动作后在把具体的请求转发到当前应用对应的模块进行处理。

随着业务的发展,网站的流量会越来越大,在单体应用中简单的通过加机器的方式可以带来的承受流量冲击的能力也越来越低,这时候就会考虑根据业务将单体应用拆成若干个功能独立的应用,单体应用拆为多个应用后,由于不同的应用开发对应的功能,所以多应用开发之间可以独立开发而不用去理解对方的业务,另外不同的应用模块只承受对应业务流量的压力,不会对其他应用模块造成影响,这时候多体的分布式系统就出现了,如下图2。

图2 多体应用

如上图在多体应用中业务模块A和B单独起了个应用,每个应用里面有自己的网关模块,如果业务模块多了,那么每个应用都有自己的网关模块,这样复用性不好,所以可以考虑把网关模块提起出来,单独作为一个应用来做服务路由,如下图3:

如上图当移动设备发起请求时候是具体发送到网关应用的,经过鉴权后请求会被转发到具体的后端服务应用上,对应前端移动设备来说他们不在乎也不知道后端服务器应用是一个还是多个,他们只能感知到网关应用的存在。

Zuul是Netflix开源的一个网关组件,在Netflix内部系统中Zuul被用来作为内部系统的门面,如下图是Zuul在Netflix内部使用的一个架构图:

如上图最上层的移动设备或者网站首先通过aws负载均衡器把请求路由到zuul网关上,zuul网关则负责把请求路由到具体的后端service上。

Zuul开源地址 https://github.com/Netflix/zuul

Zuul网关的核心是一系列的过滤器,这些过滤器可以对请求或者响应结果做一系列过滤,Zuul 提供了一个框架可以支持动态加载,编译,运行这些过滤器,这些过滤器是使用责任链方式顺序对请求或者响应结果进行处理的,这些过滤器直接不会直接进行通信,但是通过责任链传递的RequestContext参数可以共享一些东西。

虽然Zuul 支持任何可以在jvm上跑的语言,但是目前zuul的过滤器只能使用Groovy脚本来编写。编写好的过滤器脚本一般放在zuul服务器的固定目录,zuul服务器会开启一个线程定时去轮询被修改或者新增的过滤器,然后动态进行编译,加载到内存,然后等后续有请求进来,新增或者修改后的过滤器就会生效了。

在zuul中过滤器分为四种:

如下图为zuul1.0的工作原理:

如上图,当zuul接受到请求后,首先会由前置过滤器进行处理,然后在由路由过滤器具体把请求转发到后端应用,然后在执行后置过滤器把执行结果写会到请求方,当上面任何一个类型过滤器执行出错时候执行该过滤器。

本节作者使用zuul的版本:

...

....

总结:zuul1.0时候当zuul接受到一个请求后会同步执行前置过滤器、路由过滤器、后置过滤器,等执行完毕后在同步把结果返回为调用方,调用方在整个过程中是阻塞的。其实SpringBoot集成的zuul就是自己实现了个前置过滤器做选择路由,然后自己实现了个路由过滤器根据前置过滤器选择的路由具体做路由转发。

Netty作为高性能异步网络通讯框架,在dubbo,rocketmq,sofa等知名开源框架中都有使用,如下图zuul2.0使用netty server作为网关监听服务器监听客户端发来的请求,然后把请求转发到前置过滤器(inbound filters)进行处理,处理完毕后在把请求使用netty client代理到具体的后端服务器进行处理,处理完毕后在把结果交给后者过滤器(outbound filters)进行处理,然后把处理结果通过nettyServer写回客户端。

...
总: 在zuul1.0时候客户端发起的请求后需要同步等待zuul网关返回,zuul网关这边对每个请求会分派一个线程来进行处理,这会导致并发请求数量有限。而zuul2.0使用netty作为异步通讯,可以大大加大并发请求量。 关于为什么做微服务网关和微服务网关如何调用服务的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。 为什么做微服务网关的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于微服务网关如何调用服务、为什么做微服务网关的信息别忘了在本站进行查找喔。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:团队协作接口测试工具包括(接口测试 集成测试)
下一篇:java8中:: 用法示例(JDK8双冒号用法)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~