(1)Eureka是一个由Netflix开发的独立项目,用于服务注册和发现。
(2)Eureka是基于RESTful服务的。在微服务架构中,Eureka Server提供了RESTful API,使服务能够通过HTTP协议进行注册和发现。
(1)服务注册:微服务架构中的每个服务都会在启动时向Eureka注册自己的信息,包括服务名称、IP地址、端口号等。
(2)服务发现: 客户端应用程序可以通过Eureka查找和发现其他已注册的服务的位置和信息。这样,服务之间就能够动态地相互通信,而无需硬编码服务的位置信息。
(3)负载均衡: Eureka还可以提供负载均衡的功能,确保请求被分发到可用的、健康的服务实例上。
(4)故障转移: 当某个服务实例出现故障或不可用时,Eureka能够自动将流量路由到其他健康的实例,提高系统的可用性和弹性。
(5)动态伸缩: 在微服务架构中,服务的实例数量可能会根据负载的变化而动态伸缩。Eureka可以帮助系统在运行时适应这些变化。
服务注册: Eureka Server 用于服务的注册。当一个微服务启动时,它会向 Eureka Server 注册自己的信息,包括服务名称、IP地址、端口等。这样,其他服务就可以通过 Eureka Server 查询可用的服务实例。
服务续约: 微服务通过定时发送心跳(默认每隔30秒,可在Eureka Client配置)告诉 Eureka Server 自己仍然处于活动状态。如果一个微服务在一定时间内没有发送心跳,Eureka Server 就会将其标记为不可用,并从注册表中移除。
服务剔除: Eureka Server 在运行时负责管理注册表,包括动态添加、更新和删除服务实例。这样,整个系统能够动态适应服务的上下线。
服务注册: 微服务通过 Eureka Client 注册自己到 Eureka Server。这样,其他服务就能够通过 Eureka Server 获取该服务的信息。
服务发现: 微服务通过 Eureka Client 发现其他服务。它可以从 Eureka Server 中获取可用服务实例的信息,并在需要调用其他服务时,根据这些信息选择一个实例进行调用。
负载均衡: Eureka Client 集成了负载均衡的功能。当一个微服务需要调用其他服务时,Eureka Client 可以从多个可用实例中选择一个来实现负载均衡,分散请求压力。
在项目的注册中心模块和服务提供者消费者模块中,引入相应依赖
Eureka Server(服务注册中心):
org.springframework.cloud
spring-cloud-starter-netflix-eureka-server
Eureka Client(服务提供者和服务消费者):
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
1.一个是服务注册的名称(name根据现实需求灵活修改)
spring:
application:
name: enrekaserver
2.其次是添加Eureka服务网址(server服务端自身也要添加地址,以便Eureka Client能够注册和发现服务),server和client的端口都要使用server的端口,推荐server端口为8761
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:9091/eureka
server服务端
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
client客户端
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@EnableEurekaClient
public class YourApplicationNameApplication {
public static void main(String[] args) {
SpringApplication.run(YourApplicationNameApplication.class, args);
}
}
在以往的restemplate的实现中(不会实现,可参照其他资料),url往往是固定的id地址+端口
例如,其中localhost和9091端口是固定不动的
String url="http://localhost:9091/customer/"+id;
Customer customer = restTemplate.getForObject(url, Customer.class);
使用Eureka注册的服务,可以将主机名+端口号替换yml文件中的注册服务名称
例如,我customer模块的服务名称为EurekaCustomer,可将上面代码改写为
String url="http://EurekaCustomer/customer/"+id;
Customer customer = restTemplate.getForObject(url, Customer.class);
实现原理:
服务注册: 微服务在启动时向Eureka服务器注册自己的信息,包括服务名称、IP地址、端口号等。
服务发现: 当一个服务需要调用其他服务时,它可以通过Eureka服务发现机制动态获取目标服务的实例信息,而不是硬编码目标服务的IP和端口。
改写为服务名称: 替代硬编码的IP和端口,使用服务名称。每个注册到Eureka的服务都有一个唯一的名称,其他服务可以通过这个名称来发现和调用目标服务。
动态解析: 在代码中,通过服务名称结合Eureka客户端的功能,动态地解析服务名称对应的实际运行实例的IP和端口信息。
这种方式使得微服务架构更具弹性和可伸缩性,因为服务的实例可以动态增减,而调用方无需关心实际服务的具体位置。
实现方式:
在启动类创建restamplate加@LoadBalanced注解,表示restemplate发起的请求将要被ribbon拦截和处理。
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
此时,如果我开启了两个相同的Customer服务(端口不同而已),服务消费者调用Customer接口,往往一次调用Customer-1的接口,然后调用Customer-2的接口,依次轮询(理论上如此,我实现时好像是随机访问的)。
---------------------------------------------------------------------------------------------------------------------------------
流程运作由LoadBalancerInterceptor类实现,该类实现了ClientHttpRequestInterceptor接口,该接口用于拦截客户端发起的http请求,直接运行时debug跟踪一下。
由IRule接口决定使用轮询负载均衡(RoundRobinRule)
public class BaseLoadBalancer extends AbstractLoadBalancer implements PrimeConnectionListener, IClientConfigAware {
private static Logger logger = LoggerFactory.getLogger(BaseLoadBalancer.class);
private static final IRule DEFAULT_RULE = new RoundRobinRule();
---------------------------------------------------------------------------------------------------------------------------------
(1)在消费者启动类注入bean,将默认的轮询改变为随机负载(有其他负载方案)。
@Bean
public IRule randomRule(){
return new RandomRule();
}
(2)在服务消费者的yml文件中配置(顶格写,首行为服务提供者的名称)
CustomerService:
ribbon:
NFLoadBlancerRuleClassName: com.netflix.loadbalancer.RandomRule
方法一意味着调用所有服务都要遵守负载规则,方法二是指定服务遵守负载规则。
Eureka默认采用的是懒加载,只有当需要使用对象或资源时才进行加载或初始化,而不是在应用程序启动时就立即加载所有可能需要的对象或资源。
比如我第一次使用消费者访问接口,时间很长,而之后访问时间会缩短很多
第一次访问时间为836毫秒,而之后为200毫秒左右。
采用饥饿加载,可以减少第一次访问的时间:
在消费者yml配置
ribbon:
eager-load:
enabled: true #启动饥饿加载
clients: #对哪些服务采用饥饿加载,可以有多个
- CustomerService
此时时差显著减小
---------------------------------------------------------------------------------------------------------------------------------
若对此文某处有所疑问,欢迎与博主探讨!
若有错(应该不会有),还请指正,我会由衷接受错误。