1、注册中心:Eureka
任何服务启动以后,都会把自己注册到Eureka的注册表中;当服务死亡的时候,也会通知Eureka。这样,当某个服务想要访问另一个服务的时候,只需要问一下Eureka Server就可以了,它什么都知道。
注册到Eureka注册表这个注册动作,是由一个叫做Eureka Client的组件来完成的。服务启动和关闭的时候,会通过这个组件推销自己;而当某个服务(A)想要调用另一个服务(B)的时候,直接访问Eureka Server就可以了。当A拿到结果后,会把结果缓存在本地的注册表里。所以,当Eureka Server死掉后,也不会影响服务A去调用服务B。
2、负载均衡:Ribbon
服务A拿到服务B的实例列表以后,发现有两台,这就出现了问题:该调用那台机器呢?这就是SpringCloud中组件Ribbon的作用。它是最常用的负载均衡策略,请求会均匀的分配给后面的每台机器。
Ribbon不仅仅提供了轮询的策略,还有随机Random、根据响应时间加权、自定义的策略。
3、为简化代码而生的:Fegin
使用Ribbon时需要自己构建http请求,模拟http请求然后使用RestTemplate发送给其他服务,步骤相当繁琐。而且返回类型不安全,也表达不出什么语义。
Fegin得益于Java的动态代理机制,最终封装出一套简洁的接口调用方式,将需要调用的其他服务的方法定义成抽象方法即可,不需要自己构建http请求。
首先,Fegin会根据@FeginClient注解,通过动态代理,创建一个动态代理类。接下来,只要通过调用接口的方式,就可以构造Ribbon调用方式的参数,这个过程会自动填充。最后,通过构造的Ribbon请求,发起真正的调用,并通过反射组装返回值。所以,Fegin只是一层皮,最终还是要通过调用Ribbon进行调用。
4、异常的保护——断路器:Hystrix
Hystrix对每个服务开了一个线程池,并有比较复杂的规则,来控制出问题的服务的行为。比如,在规定时间内,直接返回默认的结果,而不是一直卡在那里。这个过程就叫做熔断,就像电源一样,出了问题,先切断保险丝,别把电器给烧了。
5、API网关服务:zuul
API网关,所有的外部客户端访问都需要经过API网关进行调度和过滤。
主要解决了两个问题:路由规则(暴露接口)与服务实例的维护问题;签名检验、登陆校验在微服务中的冗余问题。
6、分布式配置中心:config
来为分布式系统中的基础设施和微服务应用提供集中化的外部配置支持。
7、分布式服务跟踪:Sleuth
对于每个请求,通过实现对请求调用的跟踪可以帮助我们快速发现错误根源以及监控分析每条请求链路上的性能瓶颈。