Eureka

Eureka包含两个组件:Eureka Server和Eureka Client。

  • Eureka Server提供服务注册服务,各个节点启动后,会在Eureka Server中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到。

  • Eureka Client是一个java客户端,用于简化与Eureka Server的交互,客户端同时也就是一个内置的、使用轮询(round-robin)负载算法的负载均衡器。

在应用启动后,将会向Eureka Server发送心跳,默认周期为30秒,如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,Eureka Server将会从服务注册表中把这个服务节点移除(默认90秒)。

Eureka Server之间通过复制的方式完成数据的同步,Eureka还提供了客户端缓存机制,即使所有的Eureka Server都挂掉,客户端依然可以利用缓存中的信息消费其他服务的API。综上,Eureka通过心跳检查、客户端缓存等机制,确保了系统的高可用性、灵活性和可伸缩性。

Eureka是做什么的

eureka主要负责完成微服务架构中的服务治理功能

为什么要使用Eureka

当服务的模块越来越多,系统的功能越来越复杂,以前用到的静态配置就会变得越来越难以维护,会消耗巨大的人力,所以通过使用服务注册与发现来完成对微服务应用的自动化管理。

服务治理

用来实现各个微服务实例化的自动化注册与发现。

服务注册

首先会构建一个服务中心,之后的每个服务单元向这个服务中心提供主机,端口号等信息登记自己提供的服务。

注册中心通过服务名分类组织服务清单,并对其进行维护。

服务注册中心需要以心跳的方式去监测清单中的服务是否可用,若不可用需要从服务清单中剔除。

服务发现

服务之间不需要指定具体的实例地址,而是通过服务中心发起请求调用实现。所以,调用方并不需要知道服务提供方具体的位置,只需向注册中心发起请求,从而获取所有服务的实例清单,才能实现对具体服务实例的访问。

实际应用中,不会每次都向注册中心获取服务,使用了缓存和服务剔除等不同的策略。

Eureka的角色

要实现Eureka至少需要服务注册中心与服务提供者

服务注册中心

Eureka的服务端应用,提供服务的注册与发现功能。支持高可用配置,当集群中有分片故障时,Eureka就会进入自我保护模式,允许在有分片故障期间继续提供注册与发现的功能。当分片恢复正常,集群中的其他分片会将其状态同步回来。

服务提供者

会向注册中心注册并提供自身的服务,并周期性的发送心跳来更新它的服务租约。同时它能将服务端的注册信息查询并缓存到本地且周期性的刷新状态。

服务消费者

消费应用从注册中心获取服务列表,从而得知每个服务方的信息,知道去哪里调用服务方。

父项目

1.新建父项目(maven项目):springcloud-netflix
2.导入依赖

	<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-hystrix</artifactId>
                <version>1.4.7.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
                <version>1.4.7.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-openfeign</artifactId>
                <version>1.4.7.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
                <version>1.4.6.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
                <version>1.4.6.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
                <version>1.4.7.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
                <version>1.4.7.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
                <version>1.4.7.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-config-server</artifactId>
                <version>1.4.7.RELEASE</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

Eureka服务端搭建

eureka服务端即是服务注册中心,当前为单个eureka服务的搭建。

步骤:

  1. 新建maven子模块:springcloud-eureka-server
  2. 添加依赖
  3. 编写application.yaml
  4. 编写启动类
  5. 测试

实现

  1. 新建maven子模块:springcloud-eureka-server
  2. 添加依赖
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    <version>1.4.6.RELEASE</version>
</dependency>
  1. 编写application.yaml
spring:
  application:
    name: springcloud-eureka-server
server:
  port: 2001

eureka:
  instance:
    hostname: eureka1 #hostname用于eureka集群服务器之间的区分
    lease-expiration-duration-in-seconds: 90 #最后一次心跳后,间隔多久认定微服务不可用,默认90
  client:
    register-with-eureka: false #不向自身注册。由于该应用为单个注册中心,所以设置为false,代表不向注册中心注册自己。
    fetch-registry: false #不从自身拉取注册信息。由于单个注册中心,不拉取自身信息。
    serviceUrl.defaultZone: http://localhost:2001/eureka/
  server:
    enable-self-preservation: false #eureka的自我保护状态。测试时将其关闭
  1. 编写启动类
@EnableEurekaServer //通过注解触发自动配置
@SpringBootApplication
public class SpringCloudEurekaServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringCloudEurekaServerApplication.class,args);
    }
}
  1. 测试

    访问:localhost:2001

在这里插入图片描述

​ 服务注册中心已成功启动,当前没有服务注册

Eureka客户端搭建

搭建eureka客户端作为服务提供者。

步骤

  1. 新建maven子模块:springcloud-eureka-client
  2. 添加依赖
  3. 编写application.yaml
  4. 编写启动类
  5. 测试

实现

  1. 新建maven子模块:springcloud-eureka-client
  2. 添加依赖
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    <version>1.4.6.RELEASE</version>
</dependency>
  1. 编写application.yaml
spring:
  application:
    name: springcloud-eureka-client
server:
  port: 8001
eureka:
  instance:
    lease-expiration-duration-in-seconds: 30 #心跳间隔时间,默认为30s
  client:
    registry-fetch-interval-seconds: 30 #拉取注册信息间隔时间,默认30s
    service-url:
      defaultZone: http://127.0.0.1:2001/eureka #表示eureka服务注册中心的部署位置
# info配置
info:
  # 项目的名称
  app.name: 项目名-springcloud
  # 公司的名称
  company.name: 自定义配置
  1. 编写启动类
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@EnableEurekaClient //通过注解触发自动配置
@SpringBootApplication
public class SpringCloudEurekaClientApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringCloudEurekaClientApplication.class,args);
    }
}
  1. 测试

访问:localhost:2001
在这里插入图片描述

  • 显示当前客户端已注册

  • 点击status下的项目名可查看当前Info配置,显示的两项配置都是自定义配置

Eureka服务提供者的高可用

需要在搭建好单个服务注册中心和单个服务提供者的基础上进行

步骤:

1.打开Run/Debug Configurations:Run->Edit Configurations

2.修改Run/Debug Configurations

在这里插入图片描述
1.1 修改Name:将SpringCloudEurekaClientApplication 修改为 SpringCloudEurekaClientApplication-8001,用端口号做区分
1.2 写入Program arguments:–server.port=8001,写入服务端口号
在这里插入图片描述

1.3 复制SpringCloudEurekaClientApplication-8001
1.4 修改Name:将SpringCloudEurekaClientApplication-8001 修改为 SpringCloudEurekaClientApplication-8002,用端口号做区分
1.5 修改Program arguments:将 --server.port=8001 修改为 --server.port=8002

3.测试

3.1 启动server与两个client

3.2 访问http://localhost:2001/

在这里插入图片描述

3.3 一个服务可以通过两个端口访问

4.意义

不同端口可以配置不同的yaml,即为同一个服务的不同的端口配置不同的开发环境

Eureka服务管理者的高可用

需要在搭建好单个服务注册中心和单个服务提供者的基础上进行。

步骤

  1. 将springcloud-eureka-server的application.yaml再复制两份,将自身作为服务向其他服务注册中心注册自己,这样就形成了一组相互注册的服务注册中心,实现服务清单的同步,复制的yaml分别为:

    1. application-eureka1.yaml

      spring:
        application:
          name: springcloud-eureka-server
      server:
        port: 2001
      
      eureka:
        instance:
          hostname: eureka1 #hostname用于eureka集群服务器之间的区分
          lease-expiration-duration-in-seconds: 90 #最后一次心跳后,间隔多久认定微服务不可用,默认90
        client:
          register-with-eureka: true #不向自身注册。由于该应用为单个注册中心,所以设置为false,代表不向注册中心注册自己。
          fetch-registry: true #不从自身拉取注册信息。由于单个注册中心,不拉去自身信息。
          serviceUrl.defaultZone: http://localhost:2002/eureka/
        server:
          enable-self-preservation: false #eureka的自我保护状态。测试时将其关闭
      
    2. application-eureka2.yaml

      spring:
        application:
          name: springcloud-eureka-server
      server:
        port: 2001
      
      eureka:
        instance:
          hostname: eureka2 #hostname用于eureka集群服务器之间的区分
          lease-expiration-duration-in-seconds: 90 #最后一次心跳后,间隔多久认定微服务不可用,默认90
        client:
          register-with-eureka: true #不向自身注册。由于该应用为单个注册中心,所以设置为false,代表不向注册中心注册自己。
          fetch-registry: true #不从自身拉取注册信息。由于单个注册中心,不拉去自身信息。
          serviceUrl.defaultZone: http://localhost:2001/eureka/
        server:
          enable-self-preservation: false #eureka的自我保护状态。测试时将其关闭
      
  2. 修改Run/Debug Configurations

    在这里插入图片描述

    1. 修改Name:将 SpringCloudEurekaServerApplication 修改为 SpringCloudEurekaServerApplication-2001,用端口号做区分
    2. 写入Program arguments:–spring.profiles.active=eureka1 --server.port=2001

    在这里插入图片描述

    1. 复制SpringCloudEurekaServerApplication-2001
    2. 修改Name:将 SpringCloudEurekaServerApplication-2001 修改为SpringCloudEurekaServerApplication-2002,用端口号做区分
    3. 修改Program arguments:将 --spring.profiles.active=eureka1 --server.port=2001 修改为 --spring.profiles.active=eureka2 --server.port=2002
  3. 修改服务提供者的yaml:修改 eureka.client.service-url.defaultZone,将服务注册到两个注册中心

    spring:
      application:
        name: springcloud-eureka-client
    server:
      port: 8001
    eureka:
      instance:
        lease-expiration-duration-in-seconds: 30 #心跳间隔时间,默认为30s
      client:
        registry-fetch-interval-seconds: 30 #拉取注册信息间隔时间,默认30s
        service-url:
    #      defaultZone: http://127.0.0.1:2001/eureka #表示eureka服务器的部署位置
          defaultZone: http://127.0.0.1:2001/eureka,http://127.0.0.1:2002/eureka
    # info配置
    info:
      # 项目的名称
      app.name: 项目名-springcloud
      # 公司的名称
      company.name: 自定义配置
    
  4. 测试

    1. 启动两个server
    2. 访问http://localhost:2001/
      在这里插入图片描述

    `

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐