目录
1、Spring Cloud中的服务注册与发现的实现原理
服务注册与发现的基于服务注册中心,常见的如Eureka、Consul、Nacos
1.1、服务注册
当一个微服务实例启动时,它会向服务注册中心注册自己的信息,包括服务名称、网络地址、端口号等。注册中心将这些信息存储起来,并维护一个服务注册表。
1.2、服务发现
其他微服务实例需要调用某个服务时,它们可以向服务注册中心发起查询请求,根据服务名称获取可用的服务实例列表。这样就能够实现动态的服务发现
1.3、健康检查与心跳机制
微服务实例会定期向服务注册中心发送心跳信号,以表明自己的健康状态。如果服务注册中心在一段时间内没有收到某个服务实例的心跳,就会认为该实例不可用,并从服务注册表中移除。
1.4、Naocs实现原理
新一代的服务发现和配置管理工具,它提供了服务发现、服务健康监测、动态配置管理以及动态 DNS 服务等功能。
(1)服务注册与发现
微服务实例启动后,会向Nacos服务器注册自己的信息,包括服务名、IP地址、端口号等。注册后的服务实例可以通过Nacos的服务发现功能,发现并调用其他微服务
(2) 动态配置管理
Nacos支持动态配置管理,可以将配置信息存储在Nacos服务器中,并且可以实现动态更新。微服务实例可以通过Nacos的配置中心,动态获取最新的配置信息
(3) 服务健康监测
Nacos会定期检查各个服务实例的健康状态,如果某个实例出现故障或不可用,Nacos将会将其从服务注册表中移除,保证调用方不会发起请求到不可用的实例上
(4) 动态 DNS:可以将微服务实例的信息映射为域名,从而实现了基于域名的服务调用。
2、Ribbon负载均衡
2.1、负载均衡实现原理
在客户端实现负载均衡,从而实现对服务实例的动态选择和调用。
使用Ribbon作为HTTP客户端,通过在RestTemplate或Feign客户端上集成Ribbon,从而实现对服务实例的负载均衡,周期性地从Eureka、Consul、Naocs等服务注册中心获取服务实例的列表
2.2、 常见的负载均衡策略
(1)轮询(默认)
按顺序轮流选择服务实例,平均分配请求。
(2)随机:随机选择一个可用的服务实例。
(3)加权轮询:根据权重来决定选择哪个服务实例,权重越高的实例被选中的概率越大。
(4)加权随机:根据权重来随机选择一个服务实例,权重越高的实例被选中的概率越大。
(5)最少连接:选择当前连接数最少的服务实例
3、Feign远程调用原理
feign底层基于动态代理技术,根据接口定义创建一个动态代理对象,代理对象中包含了对远程服务的调用逻辑。当调用接口方法时,实际上是调用了代理对象的方法。Feign还集成了Ribbon,可以实现对远程服务的负载均衡。Feign配合Eureka或nacos可实现对服务实例的动态发现和调用。
通过这些技术的组合,Feign实现了对远程服务调用的简化和统一管理。
4、Hystrix熔断器
4.1、Hystrix原理
(1)注解标识
使用@EnableHystrix注解启用Hystrix熔断器。在需要进行熔断的方法上使用@HystrixCommand注解标识,以指定熔断策略、fallback方法、超时时间
(2)线程池隔离
Hystrix采用线程池隔离的方式来执行受保护的方法,每个受保护的方法都会被分配到一个独立的线程池中运行,以防止故障的扩散
(3)资源监控
Hystrix会收集每个方法的执行情况,包括成功、失败、超时等情况,通过这些数据来判断是否需要触发熔断
(4)熔断器状态
某个方法的失败率超过阈值,熔断器将会打开,停止向该方法发起请求,直接执行降级逻辑
(5) 降级处理
当熔断器开启后,Hystrix会执行预设的降级逻辑,例如返回默认值、调用备用方法等,以保证系统的稳定性
4.2、Hystrix的超时处理机制
设置`execution.isolation.thread.timeoutInMilliseconds`属性来定义服务调用的超时时间。
如:超时时间为3000毫秒
@HystrixCommand(commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "3000")
})