Springcloud及微服务相关概念的理解

此处我带着最初的疑惑,希望以最简单、最易理解的方式进行解释。

为什么会有服务注册和服务发现?服务为什么要发现?

这个问题有些别扭,但确实是我最初接触springcloud的时候想到的,现在有了一些框框之后来试着诠释一下,如有不正之处还请指正。

Springcloud是设计实现微服务的手段之一,而微服务就是将传统单体应用拆解为多个独立的服务,即每个服务专注做自己的事情,服务发现就是A服务可以感知到已存在的服务B,从而进行后续的一系列操作比如去调用或消费B。为什么要去感知其他服务,因为服务被拆分之后完成一个操作势必很大可能会调用其他服务,如订单服务完成后需要调用库存服务来进行减库存操作,这样的话问题就来了,两个服务A和B之间怎样调用呢?

调用的前提是发现,即B服务对于A服务来说前提是让A感知到B服务的存在,而Springcloud中eureka就是做这个事情的(阿里研发的nacos server类似),即感知的桥梁就是eureka,比如你在起A、B两个服务之前,先启动一个服务注册中心,让你后续启动的服务都可以被发现并注册到服务注册中心,这样一来,所有的服务都被服务注册中心识别了(注册中心相当于一个管理者和转发者,记录了每个服务的网络地址,端口等信息,接到请求后转发至目标服务),后面这两个服务之间的交互都可以介于服务注册中心来完成。当然你可能会想到,为什么不让B直接去调用A呢?这就是微服务的设计,我们强调,之所以拆成微服务,就是从最大层面上减少服务之间依赖和直接交互,做到最大限度的独立以及松耦合。

当然你也会想到,如果业务较为复杂,那么许多的服务调用时都先经过找服务注册中心。这样服务注册中心难道压力不大吗?确实很大,有问题就有解决办法,这就引出了“高可用服务注册中心”的概念,这个问题此处就先不谈了。

服务调用原理简述

服务与服务之间的调用

使用Springcloud实现微服务时,调用服务是基于REST风格的http请求实现的,服务会暴露接口提供访问。

服务内部@FeignClient的处理

你所用的注解@FeignClient,实则是构造出了你要请求的接口地址和参数等信息,发起http请求去实现了接口调用并解析响应,换句话说其内部封装了http请求,默认是基于jdk中的HttpURLConnection发起的http请求,并非RPC。

限流是什么?

限流,即访问被限制,为什么限制?因为流量太大了,请求太多了,我只同意允许你部分的请求可以正常访问,这就是限流,可以应用到网购秒杀这个情形上,秒杀时下单成功的用户是因为他们的请求被正常受理了,而请求失败的用户就是请求被限流了,限流的策略有多种,如“部分拒绝处理”、“延迟处理”等,但有些业务场景是不允许拒绝处理用户请求的,如下节所述。

对于有些业务即使高并发高负载的情况下也是不能限流的,比如外卖,某个时间段外卖订单量巨大,给平台造成巨大压力,但是你又不能忽略任何用户的订单,这时候就可以将订单服务分离成下单服务与订单配送服务两个服务进行解耦,简单讲下这两个服务:下单服务即与用户交互的服务,一头与用户交互,一头与订单配送服务交互;订单配送服务即正真形成可配送订单的服务,他要做的事情就是将系统接受的用户订单以合适的条件形成可配送的订单。

这种情形下,用户下的每一个订单都需要处理,高并发情况下会有暂时阻塞的订单,让所有的订单流入MQ,订单配送服务在MQ的接收端以比较稳的节奏持续读取这么多用户下的每一个订单并形成可配送的订单,这就实现了不漏掉一个用户订单的需求及服务之间的松耦合,而且完美解决了高并发的难题,当然,这只是其中一种实现方式。

发布了178 篇原创文章 · 获赞 116 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/HYZX_9987/article/details/104679275
今日推荐