一. SpringCloud简介与微服务架构 (4)

每个服务可以根据实际需求独立进行扩展

3. SpringCloud五大组件浅析 3.1 举例业务场景

image-20210120005132527

如上图,假设现在开发一个电商网站,要实现支付订单功能流程如下

创建一个订单后,如果用户立刻支付了这个订单,我们需要将这个订单状态更新为已支付

扣减相对应的商品库存

通知仓储中心进行发货

给用户这次购物添加加相对应的积分

针对上述流程我们需要有订单服务、库存服务、仓储服务、积分服务,整个流程的大体思路如下:

用户针对一个订单完成支付后,就会去找订单服务,更新订单状态

订单服务调用库存服务,完成相应的功能

订单服务调用仓储服务,完成相应的功能

订单服务调用积分服务,完成相应的功能

3.2 服务发现 - Netflix Eureka(类似zookeeper)

首先考虑一个问题,订单服务要调用库存服务、仓储服务、积分服务,如何调用呢?

订单服务根本不知道上述服务在哪台服务器上,所以没法调用,而Eureka的作用就是来告诉订单服务它想调用的服务在哪台服务器上,Eureka有客户端和服务端,每一个服务上面都有Eureka客户端,可以把本服务的相关信息注册到Eureka服务端上,那么我们的订单服务就可以就可以找到库存服务、仓储服务、积分服务了

我们上述的业务使用Eureka后如下图:

image-20210120012525962

总结:

Eurake客户端:负责将这个服务的信息注册到Eureka服务端中

Eureka服务端:相当于一个注册中心,里面有注册表,注册表中保存了各个服务所在的机器和端口号,可通过Eureka服务端找到各个服务

3.3 WebService客户端Feign(类似Dubbo)

通过上面的Eureka,现在订单服务确实知道库存服务、积分服务、仓储服务在哪了,但是我们如何去调用这些服务呢,如果我们自己去写很多代码调用那就太麻烦了,而SpringCloud已经为我们准备好了一个核心组件:Feign,接下来看如何通过Feign让订单服务调用库存服务,注意Feign也是用在消费者端的。

订单服务与仓库服务Service

image-20210120015626539

没有底层的建立连接、构造请求、解析响应的代码,直接就是用注解定义一个 FeignClient接口,然后调用那个接口就可以了。人家Feign Client会在底层根据你的注解,跟你指定的服务建立连接、构造请求、发起靕求、获取响应、解析响应,等等。这一系列脏活累活,人家Feign全给你干了。

问题来了,Feign是如何做到的呢?其实Feign的一个机制就是使用了动态代理:

首先,如果你对某个接口定义了@FeignClient注解,Feign就会针对这个接口创建一个动态代理

接着你要是调用那个接口,本质就是会调用 Feign创建的动态代理,这是核心中的核心

Feign的动态代理会根据你在接口上的@RequestMapping等注解,来动态构造出你要请求的服务的地址

最后针对这个地址,发起请求、解析响应

image-20210120020535084

3.4 客服端负载均衡 - Netflix Ribbon

上面可以通过Eureka可以找到服务,然后通过Feign去调用服务,但是如果有多台机器上面都部署了库存服务,我应该使用Feign去调用哪一台上面的服务呢,这个时候就需要Ribbon了,它在服务消费者端配置和使用,作用就是负载均衡,默认使用的负载均衡算法是轮询算法,Ribbon会从Eureka服务端中获取到对应的服务注册表,然后就知道相应服务的位置,然后Ribbon根据设计的负载均衡算法去选择一台机器,Feigin就会针对这些机器构造并发送请求。

image-20210120021918660

3.5 断路器 - Netflix Hystrix

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wssydw.html