每个服务可以根据实际需求独立进行扩展
3. SpringCloud五大组件浅析 3.1 举例业务场景如上图,假设现在开发一个电商网站,要实现支付订单功能流程如下
创建一个订单后,如果用户立刻支付了这个订单,我们需要将这个订单状态更新为已支付
扣减相对应的商品库存
通知仓储中心进行发货
给用户这次购物添加加相对应的积分
针对上述流程我们需要有订单服务、库存服务、仓储服务、积分服务,整个流程的大体思路如下:
用户针对一个订单完成支付后,就会去找订单服务,更新订单状态
订单服务调用库存服务,完成相应的功能
订单服务调用仓储服务,完成相应的功能
订单服务调用积分服务,完成相应的功能
3.2 服务发现 - Netflix Eureka(类似zookeeper)首先考虑一个问题,订单服务要调用库存服务、仓储服务、积分服务,如何调用呢?
订单服务根本不知道上述服务在哪台服务器上,所以没法调用,而Eureka的作用就是来告诉订单服务它想调用的服务在哪台服务器上,Eureka有客户端和服务端,每一个服务上面都有Eureka客户端,可以把本服务的相关信息注册到Eureka服务端上,那么我们的订单服务就可以就可以找到库存服务、仓储服务、积分服务了
我们上述的业务使用Eureka后如下图:
总结:
Eurake客户端:负责将这个服务的信息注册到Eureka服务端中
Eureka服务端:相当于一个注册中心,里面有注册表,注册表中保存了各个服务所在的机器和端口号,可通过Eureka服务端找到各个服务
3.3 WebService客户端Feign(类似Dubbo)通过上面的Eureka,现在订单服务确实知道库存服务、积分服务、仓储服务在哪了,但是我们如何去调用这些服务呢,如果我们自己去写很多代码调用那就太麻烦了,而SpringCloud已经为我们准备好了一个核心组件:Feign,接下来看如何通过Feign让订单服务调用库存服务,注意Feign也是用在消费者端的。
订单服务与仓库服务Service
没有底层的建立连接、构造请求、解析响应的代码,直接就是用注解定义一个 FeignClient接口,然后调用那个接口就可以了。人家Feign Client会在底层根据你的注解,跟你指定的服务建立连接、构造请求、发起靕求、获取响应、解析响应,等等。这一系列脏活累活,人家Feign全给你干了。
问题来了,Feign是如何做到的呢?其实Feign的一个机制就是使用了动态代理:
首先,如果你对某个接口定义了@FeignClient注解,Feign就会针对这个接口创建一个动态代理
接着你要是调用那个接口,本质就是会调用 Feign创建的动态代理,这是核心中的核心
Feign的动态代理会根据你在接口上的@RequestMapping等注解,来动态构造出你要请求的服务的地址
最后针对这个地址,发起请求、解析响应
3.4 客服端负载均衡 - Netflix Ribbon上面可以通过Eureka可以找到服务,然后通过Feign去调用服务,但是如果有多台机器上面都部署了库存服务,我应该使用Feign去调用哪一台上面的服务呢,这个时候就需要Ribbon了,它在服务消费者端配置和使用,作用就是负载均衡,默认使用的负载均衡算法是轮询算法,Ribbon会从Eureka服务端中获取到对应的服务注册表,然后就知道相应服务的位置,然后Ribbon根据设计的负载均衡算法去选择一台机器,Feigin就会针对这些机器构造并发送请求。
3.5 断路器 - Netflix Hystrix