一、Eureka
Eureka包含三部分
Eureka Server:注册中心服务端
注册中心服务端主要对外提供了三个功能
1、服务注册
服务提供者启动时,会通过 Eureka Client 向 Eureka Server 注册信息,Eureka Server 会存储该服务的信息,Eureka Server 内部有二层缓存机制来维护整个注册表
2、提供注册表
服务消费者在调用服务时,如果 Eureka Client 没有缓存注册表的话,会从 Eureka Server 获取最新的注册表
3、同步状态
Eureka Client 通过注册、心跳机制和 Eureka Server 同步当前客户端的状态
Eureka Client:注册中心客户端
Eureka Client 是一个 Java 客户端,用于简化与 Eureka Server 的交互。Eureka Client 会拉取、更新和缓存 Eureka Server 中的信息。因此当所有的 Eureka Server 节点都宕掉,服务消费者依然可以使用缓存中的信息找到服务提供者,但是当服务有更改的时候会出现信息不一致。
1、Register: 服务注册
服务的提供者,将自身注册到注册中心,服务提供者也是一个 Eureka Client。当 Eureka Client 向 Eureka Server 注册时,它提供自身的元数据,比如 IP 地址、端口,运行状况指示符 URL,主页等。
2、Renew: 服务续约
Eureka Client 会每隔 30 秒发送一次心跳来续约。 通过续约来告知 Eureka Server 该 Eureka Client 运行正常,没有出现问题。 默认情况下,如果 Eureka Server 在 90 秒内没有收到 Eureka Client 的续约,Server 端会将实例从其注册表中删除,此时间可配置,一般情况不建议更改。
服务续约的两个重要属性
服务续约任务的调用间隔时间,默认为30秒
eureka.instance.lease-renewal-interval-in-seconds=30
服务失效的时间,默认为90秒。
eureka.instance.lease-expiration-duration-in-seconds=90
3、Eviction 服务剔除
当 Eureka Client 和 Eureka Server 不再有心跳时,Eureka Server 会将该服务实例从服务注册列表中删除,即服务剔除。
4、Cancel: 服务下线
Eureka Client 在程序关闭时向 Eureka Server 发送取消请求。 发送请求后,该客户端实例信息将从 Eureka Server 的实例注册表中删除。该下线请求不会自动完成,它需要调用以下内容:
DiscoveryManager.getInstance().shutdownComponent();
GetRegisty: 获取注册列表信息
Eureka Client从服务器获取注册表信息,并将其缓存在本地。客户端会使用该信息查找其他服务,从而进行远程调用。该注册列表信息定期(每30秒钟)更新一次。每次返回注册列表信息可能与 Eureka Client 的缓存信息不同,Eureka Client 自动处理。
如果由于某种原因导致注册列表信息不能及时匹配,Eureka Client 则会重新获取整个注册表信息。 Eureka Server 缓存注册列表信息,整个注册表以及每个应用程序的信息进行了压缩,压缩内容和没有压缩的内容完全相同。Eureka Client 和 Eureka Server 可以使用 JSON/XML 格式进行通讯。在默认情况下 Eureka Client 使用压缩 JSON 格式来获取注册列表的信息。
获取服务是服务消费者的基础,所以必有两个重要参数需要注意:
#启用服务消费者从注册中心拉取服务列表的功能
eureka.client.fetch-registry=true
#设置服务消费者从注册中心拉取服务列表的间隔
eureka.client.registry-fetch-interval-seconds=30
1、Remote Call: 远程调用
当 Eureka Client 从注册中心获取到服务提供者信息后,就可以通过 Http 请求调用对应的服务;服务提供者有多个时,Eureka Client 客户端会通过 Ribbon 自动进行负载均衡。
使用案例:
案例1
案例2
二、ribbon
负载均衡有好几种实现策略,常见的有:
看下ribbon里面是怎么做的,首先负载均衡顶级接口: IRule 下面接口都是IRule的实现类
1、最少策略
List<Server> serverList = getLoadBalancer().getAllServers(); // 获取所有的服务器列表
for (Server server: serverList) { // 遍历每个服务器
ServerStats serverStats = loadBalancerStats.getSingleServerStat(server); // 获取各个服务器的状态
if (!serverStats.isCircuitBreakerTripped(currentTime)) { // 没有触发断路器的话继续执行
int concurrentConnections = serverStats.getActiveRequestsCount(currentTime);//获取当前服务器的请求个数
if (concurrentConnections < minimalConcurrentConnections) {
//比较各个服务器之间的请求数,然后选取请求数最少的服务器并放到chosen变量中
minimalConcurrentConnections = concurrentConnections;
chosen = server;
}
}
}
2、加权策略
原理:开始的时候还没有权重列表,采用父类的轮询方式,有一个默认每30秒更新一次权重列表的定时任务,该定时任务会根据实例的响应时间来更新权重列表,choose方法做的事情就是,用一个(0,1)的随机double数乘以最大的权重得到randomWeight,然后遍历权重列表,找出第一个比randomWeight大的实例下标。
3、如何使用
@Bean
@LoadBalanced
RestTemplate restTemplate() {
return new RestTemplate();
}
三、hystrix
作用:断路器,保护系统,控制故障范围
四、网关
包含:Zuul和gatway
作用:api网关,路由,负载均衡等多种作用
简介:类似nginx,反向代理的功能,不过netflix自己增加了一些配合其他组件的特性。
五、配置中心
有Config和nacos
本文转载:https://baijiahao.baidu.com/s?id=1686055618310435909
https://blog.csdn.net/wudiyong22/article/details/80829808