实例就是服务器,一个服务可以在多个服务器上都部署,也就是
UserService 实例1:http://user-service-instance-1:8081
UserService 实例2:http://user-service-instance-2:8082
UserService 实例3:http://user-service-instance-3:8083
我们负载均衡就是避免每次调用服务都调用同一个实例
Eureka实现原理:
服务注册与发现:
当一个服务实例启动时(比如一个center服务),它会向Eureka发送注册请求,将自己的信息注册到注册中心。Eureka会将这些信息保存在内存中,并提供REST接口供其他服务查询。别的服务可以通过查询服务实例列表(就是下面这个表)来获取可用的服务,从而实现服务发现。
服务健康检查:Eureka通过心跳机制来检测服务实例列表里的服务的健康状态。服务实例会定期向Eureka发送心跳,也就是续约,表示自己还存活。如果Eureka一段时间内没有收到某个服务实例的心跳,会将其标记不可用,从服务实例列表删除。
Eureka保证高可用:
多实例部署:将多个Eureka Server实例部署在不同的节点,可以实现高可用。当一个实例发生故障,其他实例仍然可以提供服务,并保持注册信息的一致性。
服务注册信息的复制(保证数据的一致性):
当一个服务实例向Eureka Server注册时,每个Eureka Server实例都会复制其他实例的注册信息,以保证数据的一致性。
自我保护机制:Eureka还具有自我保护机制,当Eureka Server节点在一定时间内没有接到心跳时,会进入自我保护机制。等再过了段时间还没有心跳,才会剔除掉。这样可以防止网络抖动导致的误剔除。
传统方式使用RestTemplate:
RestTemplate 是Spring框架提供的一个用于执行HTTP请求的同步客户端模板类。它简化了与RESTful服务的交互,支持GET, POST, PUT, DELETE等多种HTTP方法。
举例restTemplate的方法:
发起GET请求:可以用来从服务器获取资源,支持传递查询参数。
POST请求:用于向服务器提交数据,支持JSON、XML等多种数据格式
比如我们想在代码中调用一个user-service的接口,可以这么写。
"http:/user-service/user/":这是请求的目标URL。在这个例子中,我们向http:/user-service/user/发起GET请求。
String.class:这是一个Class对象,指定了预期的返回结果类型。
但这个调用不够优雅,所谓远程调用,应该像调用本地代码一样调用远程接口。
我们用feign,他可以把rest的请求进行隐藏,伪装成springMVC的controller一样,不用自己拼接url,拼接参数,都交给feign来做
Feign:
feign的作用是简化http调用和负载均衡还有个容错机制。
虽然我们使用了Eureka,解决了一个服务想调用另一个服务,但另一个服务发生IP或端口的迁移问题,但我们需要去注册中心拿到服务后,在本地进行负载均衡,负载后再发起远程调用。
但在微服务中,服务的调用很频繁,一个方法可能就要调用多次服务。
每次调用服务我们都要分三步走
1、来到注册中心拉取配置
2、拉取到了配置在本地进行负载均衡
3、通过restTemplate进行访问
那我们要调用十次服务就得走三十步啦。因此基于这个代码冗余问题就提出了feign
简化http调用
feign是一个声明式的Web服务的客户端,它简化了使用基于HTTP的远程服务开发。
也就是将上面三行代码进行了一个简化封装。
我们以后远程调用直接使用Feign就行了,它底层是使用RestTemplate实现http调用,使用Ribbon实现负载均衡。
Feign就允许开发者使用简单的注解来定义和描述对远程服务的开发和访问。
比如@FeignClient(name = "UserService")注解告诉Feign,这个接口是用来调用名为UserService的服务的,然后URL就是“https:......”
@GetMapping("/endpoint")就是说发送GET请求到Controller中的endpoint方法(接口)
负载均衡
Feign集成了Ribbon负载均衡器,可自动实现负载均衡。可将请求分发到不同服务实例(服务器)上,提高系统可用性和可伸缩性。
容错机制
Feign支持集成Hystrix容错框架,可以在远程调用时提供断路器功能。简单来说就是一个服务出现问题,那么就会防止它扩散,避免雪崩的问题。如果一个远程服务长期不可用,Feign就快速失败并返回一个预设的失败的结果,避免系统后面的步骤一直等着。
Ribbon
1、服务列表获取:
Ribbon 通过配置文件或通过服务注册中心(如 Eureka)获取可用的服务实例列表。
这些服务实例通常会被缓存在客户端。
2、负载均衡策略:
Ribbon 提供了多种内置的负载均衡策略,例如轮询(Round Robin)、随机(Random)和权重(Weighted Response Time)等。
用户也可以自定义负载均衡算法。
3、服务实例选择:
当发起一个服务请求时,Ribbon 根据配置的负载均衡策略从服务列表中选择一个实例进行调用。
如果选择的服务实例不可用(如超时、失败等),Ribbon 可以自动切换到下一个实例。