springcloud是一套完整的微服务解决方案。包括了很多组件:也就是Eureka、Ribbon、Feign、Hystrix、Zuul。
1.eureka
负责服务发现与注册;
eureka server作为注册中心,里面有一个注册表,保存各服务所在的机器和端口号。
这些机器和端口信息是各个服务的Eureka client组件注册上来的。
各个服务从eureka server 把这些相关信息拉取到自己本地缓存起来。
然后调用其他服务时可以直接在自己本地的Eureka client获取信息,直接调用其他自己需要的服务。
2.Feign
Feign是一个超级方便的调用Spring-Cloud远程服务的框架/工具,帮助开发者以更少耦合更少代码更快更兼容的方法进行远程服务调用。
使用@Feignclient("serviceName")注解
实现原理: 使用动态代理
1.首先对定义了@feignclient注解的接口,创建一个动态代理。
2.接着你要是调用那个接口,本质上就是调用feign创建的动态代理,!!!
3.feign动态代理根据接口上的requestmapping,pathvalue等注解,来构造出需要请求的服务地址
4.最后针对这个地址发起请求,解析响应。
3.Ribbon
spring cloud ribbon是一个基于http和tcp的客户端负载均衡工具,基于Netflix Ribbon实现的。不是独立部署,但是几乎存在于每个微服务的基础设施中。
作用:负载均衡,在每次请求时选择一台机器,均匀的把请求分发到各个机器上。
算法:Ribbon的负载均衡默认使用的事最经典的round robbi轮询算法。
此外,Ribbon是和Feign以及Eureka紧密协作,完成工作的,具体如下:
1.首先。ribbon会从eurek aclient里面获取到对应的服务注册表,也就知道了所有服务的都部署在哪些机器上,在监听哪些端口号。
2.然后。Ribbon就可以使用默认的Round Ribbon算法,从中选择一台机器
3.Feign就会针对这台机器,构造并发起请求。
4.Hystrix
Hystrix是隔离、熔断以及降级的一个框架,hystrix会搞(根据服务来创建)很多个小小的线程池,每个线程池里的线程就仅仅请求某一个服务。
微服务架构雪崩问题:一个服务挂了,导致调它的服务的所有线程调用这个服务的接口时都会超时,卡在这块。那么发起请求的这个服务也就没有线程来处理请求了,然后别的服务再来请求刚才那个线程用完的服务,就发现她也挂了,不响应任何请求了。
熔断:在一段时间内请求后直接返回,不走网络请求,再去卡卡卡
降级:熔断后,需要把要做的事情记录下来,然后等恢复后去处理。
5.Zuul
微服务网关,负责网络路由。还可以做:可以做统一的降级、限流、认证授权、安全