Eureka
通过两种方式进行远程调用
@EnableEurekaClient
1.RestTempLate 通过@Bean注入到springboot容器
@LoadBalanced让RestTemplate在请求时拥有客户端负载均衡能力,支持以别名方式进行远程调用
restTemplate.getForobject(url.<>.class)底层通过HttpClient技术实现远程调用
2.Feign
启动时,程序会进行包扫描,扫描所有包下所有@FeignClient注解的类,并将这些类注入到spring的IOC容器中。当定义的Feign中的接口被调用时,通过JDK的动态代理来生成RequestTemplate。
RequestTemplate中包含请求的所有信息,如请求参数,请求URL等。
RequestTemplate声场Request,然后将Request交给client处理,这个client默认是JDK的HTTPUrlConnection,也可以是OKhttp、Apache的HTTPClient等。
最后client封装成LoadBaLanceClient,结合ribbon负载均衡地发起调用。
Eureka自我保护机制,默认情况下EurekaClient定时向EurekaServer端发送心跳包,如果Eureka在一定时间内没有收到client发送的心跳包,默认90s,便会从服务注册中剔除该服务,但是在短时间丢失了大量服务实例心跳,这时候eurekaServer会开启自我保护机制,不会剔除该服务,原因为了防止EurekaClient是可以正常访问,只是网络访问不同,本地环境建议禁止,生产环境开启。
Hystrix
默认超时时间1秒
配置文件中设置属性hystrix.command.default.execution.timeout.enable:flased
浏览器在1秒内没有收到服务器的响应,正常业务逻辑会执行,然后走降级方法
在SpringCloud中ribbon负载均衡客户端,会从Eureka注册中心服务端上获取服务注册信息列表,然后在本地实现轮询负载均衡策略
负载均衡算法:总请求量%服务器数量得到下标服务器位置
1.启动注册中心
2.启动服务
3.服务在启动的时候,会把当前服务信息,比如服务地址的端口,以别名方式注册到注册中心上
4.消费者在调用接口的时候,使用服务别名也就是serviceId去注册中心上获取实际rpc远程调用地址
5.如果消费者获取实际rpc远程调用地址后,在使用本地httpCLient技术实现调用,首先会缓存在jvm内存中,默认情况下eureka每30秒更新一次服务调用地址