SpringCloud使用Eureka作为服务治理中心

前言

我们在进行开发分布式架构的系统时,有一个不可或缺的工具那就是服务治理组件,我们可以通过它来实现服务的注册、发布和调用,可以理解为它维护着我们所有服务的花名册。目前主流的服务治理中心有ZookeeperEurekaNacos等,本篇博客这里我想和大家介绍一下服务治理组件—Eureka的原理和使用。

Nacos的使用可以参考我的博客Nacos服务治理中心和配置中心

正文

Eureka

Eureka是一项基于REST的服务,主要在AWS云中用于定位服务,以实现负载均衡和中间层服务器的故障转移。它是微服务框架中最核心和最基础的模块,它主要用来实现微服务实例的自动化注册与发现。

Eureka由2个部分组成:服务端发现组件 和 客户端发现组件:

  • 客户端通过注解的方式嵌入程序中,服务器和客户端之间会进行周期性心跳检测 ,如果心跳不存在时,该服务节点会从服务注册表中移除。并且我们要知道Eureka的心跳检测是基于SpringBoot Actuator来实现的
  • 各个服务节点 通过注册中心得注册信息以Rest方式来实现调用。

在这里插入图片描述

Eureka的三种角色:服务注册中心、服务提供者、服务消费者,事实上一个结点既可以是服务提供者 、也可以是服务消费者。
在这里插入图片描述
微服务节点之间通过续约和续期地方式实现服务清单的一致性:

  • 续约Eureka Client会周期(默认30秒)地向Eureka Server发送心跳以续约(Renew)自己的信息。
  • 续期Eureka Server会定期(默认60秒)执行一次失效服务检测功能,它一会检查超过一定时间(默认是60秒)没有续约的Eureka Client,发现并注销该节点。

SpringCloud使用Eureka作为服务治理中心

Eureka Server 的搭建

Maven依赖

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.2.RELEASE</version>
</parent>


<dependencies>
    <!--除去springboot自带的日志-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>


    <!-- log4j -->
    <!--添加log4j2的依赖-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-log4j2</artifactId>
    </dependency>

   <!--spring boot-->
   <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
   </dependency>

   <!-- eureka -->
  <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
  </dependency>

</dependencies>


<!--加入Spring Cloud 的Dalston版本的配置依赖-->
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Greenwich.SR4</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

application.properties:配置文件

server.port=8761

###eureka配置
eureka.instance.hostname=localhost
eureka.instance.lease-renewal-interval-in-seconds=30
eureka.instance.lease-expiration-duration-in-seconds=80
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/
eureka.server.enable-self-preservation=false

各配置项说明:

  • eureka.instance.hostname :应用实例主机名,一般结合linuxhostname中配置映射关系。
  • eureka.client.registry-fetch-interval-seconds:表示eureka client间隔多久去拉取服务注册信息,默认为30秒,对于api-gateway,如果要迅速获取服务注册状态,可以缩小该值,比如5秒
  • eureka.instance.lease-expiration-duration-in-seconds:表示eureka server至上一次收到client的心跳之后,等待下一次心跳的超时时间,在这个时间内若没收到下一次心跳,则将移除该instance
  • eureka.client.register-with-eureka:禁止自己当做服务注册,当单节点eureka server时选择false
  • eureka.client.fetch-registry:表示是否从eureka server获取注册的服务信息,当单节点eureka server时选择false
  • eureka.client.service-url.defaultZone:eureka服务器的地址,如果服务注册中心为高可用集群时,多个注册中心地址以逗号分隔。
  • eureka.server.enable-self-preservation:是否允许开启自我保护模式,缺省:true,当eureka服务器在短时间内丢失过多客户端时,自我保护模式可使服务端不再删除失去连接的客户端。在开发调试过程中选择false,避免客户端节点重新启动后无法被刷新。

更多参数可参考:https://www.cnblogs.com/zyon/p/11023750.html

SpringCloudGovernanceApp:启动类

@Slf4j
@EnableEurekaServer  //这个注解实现服务器端
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class SpringCloudGovernanceApp extends SpringBootServletInitializer {
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(SpringCloudGovernanceApp.class);
    }
    /**
     * 项目的启动方法
     *
     * @param args
     */
    public static void main(String[] args) {
        SpringApplication.run(SpringCloudGovernanceApp.class, args);
        log.info("======服务已经启动========");
    }
}

验证

启动项目后:访问Eureka的控制台 http://127.0.0.1:8761/

在这里插入图片描述

Eureka Client的搭建

Maven依赖

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.2.RELEASE</version>
</parent>

<dependencies>
    <!--除去springboot自带的日志-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

    <!-- log4j -->
    <!--添加log4j2的依赖-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-log4j2</artifactId>
    </dependency>


   <!--spring boot-->
   <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
   </dependency>


   <!-- eureka -->
  <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
  </dependency>


</dependencies>

<!--加入Spring Cloud 的Dalston版本的配置依赖-->
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Greenwich.SR4</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

application.properties:配置文件

server.port=8080
spring.application.name=springcloud-demo-producer

#eureka
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/,http://localhost:8762/eureka/
eureka.client.availability-zones.localhost=http://localhost:8761/eureka/,http://localhost:8762/eureka/
eureka.client.registry-fetch-interval-seconds=30
eureka.instance.lease-expiration-duration-in-seconds=80
eureka.instance.lease-renewal-interval-in-seconds=30
eureka.instance.prefer-ip-address=true

各配置项说明:

  • eureka.client.service-url.defaultZone:eureka服务器的地址,如果服务注册中心为高可用集群时,多个注册中心地址以逗号分隔。
  • eureka.client.availability-zones.localhost:在多机房的时候启动,比如服务A调用服务B,可以实现A服务优先访问同机房的服务B,避免跨机房影响访问时间。
  • eureka.client.registry-fetch-interval-seconds:表示eureka client间隔多久去拉取服务注册信息,默认为30秒,对于api-gateway,如果要迅速获取服务注册状态,可以缩小该值,比如5秒。
  • eureka.instance.lease-expiration-duration-in-seconds:表示eureka server至上一次收到client的心跳之后,等待下一次心跳的超时时间,在这个时间内若没收到下一次心跳,则将移除该instance
  • eureka.instance.lease-renewal-interval-in-seconds:表示eureka client发送心跳给server端的频率。
  • eureka.instance.prefer-ip-address:就可以将IP注册到eureka server上,而如果不配置就是机器的主机名。这样可以实现通过公网实现服务调用。

更多参数可参考:https://www.cnblogs.com/zyon/p/11023750.html

SpringCloudProducerApp:启动类

@Slf4j
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class},scanBasePackages = "com.luo")
@EnableDiscoveryClient
@EnableEurekaClient
@EnableCircuitBreaker
public class SpringCloudProducerApp extends SpringBootServletInitializer {
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(SpringCloudProducerApp.class);
    }
    /**
     * 项目的启动方法
     *
     * @param args
     */
    public static void main(String[] args) {
        SpringApplication.run(SpringCloudProducerApp.class, args);
        log.info("======服务已经启动========");
    }
}

验证

启动项目后:刷新Eureka的控制台 http://127.0.0.1:8761/

在这里插入图片描述

在这里插入图片描述

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐