Eureka的搭建及其使用

一. 什么是Eureka

(1)Eureka是一个由Netflix开发的独立项目,用于服务注册和发现。

(2)Eureka是基于RESTful服务的。在微服务架构中,Eureka Server提供了RESTful API,使服务能够通过HTTP协议进行注册和发现。

二. Eureka的主要作用

(1)服务注册:微服务架构中的每个服务都会在启动时向Eureka注册自己的信息,包括服务名称、IP地址、端口号等。

(2)服务发现: 客户端应用程序可以通过Eureka查找和发现其他已注册的服务的位置和信息。这样,服务之间就能够动态地相互通信,而无需硬编码服务的位置信息。

(3)负载均衡: Eureka还可以提供负载均衡的功能,确保请求被分发到可用的、健康的服务实例上。

(4)故障转移: 当某个服务实例出现故障或不可用时,Eureka能够自动将流量路由到其他健康的实例,提高系统的可用性和弹性。

(5)动态伸缩: 在微服务架构中,服务的实例数量可能会根据负载的变化而动态伸缩。Eureka可以帮助系统在运行时适应这些变化。

三. Eureka两个主要角色

  1. Eureka Server(服务注册中心)

    • 服务注册: Eureka Server 用于服务的注册。当一个微服务启动时,它会向 Eureka Server 注册自己的信息,包括服务名称、IP地址、端口等。这样,其他服务就可以通过 Eureka Server 查询可用的服务实例。

    • 服务续约: 微服务通过定时发送心跳(默认每隔30秒,可在Eureka Client配置)告诉 Eureka Server 自己仍然处于活动状态。如果一个微服务在一定时间内没有发送心跳,Eureka Server 就会将其标记为不可用,并从注册表中移除。

    • 服务剔除: Eureka Server 在运行时负责管理注册表,包括动态添加、更新和删除服务实例。这样,整个系统能够动态适应服务的上下线。

  2. Eureka Client(服务提供者和服务消费者)

    • 服务注册: 微服务通过 Eureka Client 注册自己到 Eureka Server。这样,其他服务就能够通过 Eureka Server 获取该服务的信息。

    • 服务发现: 微服务通过 Eureka Client 发现其他服务。它可以从 Eureka Server 中获取可用服务实例的信息,并在需要调用其他服务时,根据这些信息选择一个实例进行调用。

    • 负载均衡: Eureka Client 集成了负载均衡的功能。当一个微服务需要调用其他服务时,Eureka Client 可以从多个可用实例中选择一个来实现负载均衡,分散请求压力。

四. Eureka的基本搭建

(1)引入依赖

        在项目的注册中心模块和服务提供者消费者模块中,引入相应依赖

        Eureka Server(服务注册中心):

        
            org.springframework.cloud
            spring-cloud-starter-netflix-eureka-server
        

        Eureka Client(服务提供者和服务消费者)

        
            org.springframework.cloud
            spring-cloud-starter-netflix-eureka-client
        

(2)yml文件添加配置

        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

(3)启动类添加该服务注解

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);
    }
}

五. Eureka实际解决问题

(1)消费者动态调用提供者接口

        在以往的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);

实现原理:

  1. 服务注册: 微服务在启动时向Eureka服务器注册自己的信息,包括服务名称、IP地址、端口号等。

  2. 服务发现: 当一个服务需要调用其他服务时,它可以通过Eureka服务发现机制动态获取目标服务的实例信息,而不是硬编码目标服务的IP和端口。

  3. 改写为服务名称: 替代硬编码的IP和端口,使用服务名称。每个注册到Eureka的服务都有一个唯一的名称,其他服务可以通过这个名称来发现和调用目标服务。

  4. 动态解析: 在代码中,通过服务名称结合Eureka客户端的功能,动态地解析服务名称对应的实际运行实例的IP和端口信息。

这种方式使得微服务架构更具弹性和可伸缩性,因为服务的实例可以动态增减,而调用方无需关心实际服务的具体位置。

(2)调用接口时实现负载均衡

        实现方式:

        在启动类创建restamplate加@LoadBalanced注解,表示restemplate发起的请求将要被ribbon拦截和处理。

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

        此时,如果我开启了两个相同的Customer服务(端口不同而已),服务消费者调用Customer接口,往往一次调用Customer-1的接口,然后调用Customer-2的接口,依次轮询(理论上如此,我实现时好像是随机访问的)。

---------------------------------------------------------------------------------------------------------------------------------

        负载均衡实现原理:

Eureka的搭建及其使用_第1张图片

流程运作由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

方法一意味着调用所有服务都要遵守负载规则,方法二是指定服务遵守负载规则。

七. Ribbon饥饿加载

Eureka默认采用的是懒加载,只有当需要使用对象或资源时才进行加载或初始化,而不是在应用程序启动时就立即加载所有可能需要的对象或资源。

比如我第一次使用消费者访问接口,时间很长,而之后访问时间会缩短很多

Eureka的搭建及其使用_第2张图片

第一次访问时间为836毫秒,而之后为200毫秒左右。

采用饥饿加载,可以减少第一次访问的时间:

在消费者yml配置

ribbon:
  eager-load:
    enabled: true     #启动饥饿加载
    clients:          #对哪些服务采用饥饿加载,可以有多个
      - CustomerService 

此时时差显著减小

Eureka的搭建及其使用_第3张图片

---------------------------------------------------------------------------------------------------------------------------------

若对此文某处有所疑问,欢迎与博主探讨!

若有错(应该不会有),还请指正,我会由衷接受错误。

你可能感兴趣的:(SpringCloud,java,spring,boot,spring,cloud,eureka)