问题
单个服务之间可以通过java自带的HttpUrlConnection来进行互相远程调用,也可以用HTTPclient、OkHttp等HTTP请求框架调用,那为什么还要用dubbo和cloud来进行服务治理呢?
1. 负载均衡
分布式系统中单个服务都是以集群方式存在的。有这样一种情况,当A服务调用B服务的时候,A和B都是有N台机器的集群,这时是用A服务集群中的哪个机器去调用B服务集群中的哪个机器呢?
所以需要从A集群和B集群中各选出一台机器,这样的逻辑可以通过HttpUrlConnection或者其他HTTP请求框架实现,但是很麻烦。
2. 容错机制
单一应用的程序出现错误的概率是0.01%,所以成功的概率是99.99%,是可以接受的。但放在分布式服务架构中(更容易出错),每台机器都是独立的应用,如果出现错误的概率也是0.01%,由于单机错误具有扩散性,一次请求处理过程中如果有50台机器参与,那么该系统出现错误的概率是:
99.9
%
50
=
9.51
%
99.9\%^{50} = 9.51\%
99.9%50=9.51%
这时就需要容错的机制(举例子,实际不一定是这样的):
- A1调用B3,B3出现错误
- 重试调用B3 3次,还是出错
- 改用A1去调用B2,三次重试还是出错
- 再从redis中找一个返回值,但是没有
- 返回一个默认值给A1,同时剔除B2和B3,这样不会出现系统的瘫痪
- 这时B3,和B2修复好了,重新上线
以上这些都是容错机制在做的,自己要写的话不但费劲,而且不一定周到,效率也不一定高。
总结:负载均衡和容错机制(不只限于这两种功能)是分布式架构进行服务治理时应用必然用得到的,所以单独抽离出来做成工具软件,提高了开发效率。