eureka原理介绍

原理简介

Eureka是Netflix开源的一款提供服务注册和发现的产品,它提供了完整的Service Registry和Service Discovery实现。也是springcloud体系中最重要最核心的组件之一

1背景介绍

  服务中心又称注册中心,管理各种服务功能包括服务的注册、发现、熔断、负载、降级等,比如dubbo admin后台的各种功能。

有了服务中心调用关系会有什么变化,画几个简图来帮忙理解

项目A调用项目B

正常调用项目A请求项目B

有了服务中心之后,任何一个服务都不能直接去掉用,都需要通过服务中心来调用

项目A调用项目B,项目B在调用项目C

这时候调用的步骤就会为两步:第一步,项目A首先从服务中心请求项目B服务器,然后项目B在从服务中心请求项目C服务。

  上面的项目只是两三个相互之间的简单调用,但是如果项目超过20个30个呢,任何一个项目改动,就会牵连好几个项目跟着重启,麻烦而且容易出错。

  通过服务中心来获取服务不需要关注调用项目IP地址,由几台服务器组成,每次直接去服务中心获取可以使用的服务去调用既可。

  由于各种服务都注册到了服务中心,就有了去做很多高级功能条件。

1.几台服务提供相同服务来做均衡负载;

2.监控服务器调用成功率来做熔断,移除服务列表中的故障点;

3.监控服务调用时间来对不同的服务器设置不同的权重等等。

2 eureka介绍

  Spring Cloud 封装了 Netflix 公司开发的 Eureka 模块来实现服务注册和发现。Eureka 采用了 C-S 的设计架构。

  Eureka Server 作为服务注册功能的服务器,它是服务注册中心。而系统中的其他微服务,使用 Eureka 的客户端连接到 Eureka Server,并维持心跳连接。这样系统的维护人员就可以通过 Eureka Server 来监控系统中各个微服务是否正常运行。Spring Cloud 的一些其他模块(比如Zuul)就可以通过 Eureka Server 来发现系统中的其他微服务,并执行相关的逻辑。

  Eureka由两个组件组成:Eureka服务器和Eureka客户端。

  Eureka服务器用作服务注册服务器。Eureka客户端是一个java客户端,用来简化与服务器的交互、作为轮询负载均衡器,并提供服务的故障切换支持。Netflix在其生产环境中使用的是另外的客户端,它提供基于流量、资源利用率以及出错状态的加权负载均衡。

####(1)、Eureka Server
  提供服务注册和发现
####(2)、Service Provider
  服务提供方将自身服务注册到Eureka,从而使服务消费方能够找到
####(3)、Service Consumer
  服务消费方从Eureka获取注册服务列表,从而能够消费服务

3.eureka代码实现(简单)

配置注意情况

eureka.client.register-with-eureka :表示是否将自己注册到Eureka Server,默认为true。
eureka.client.fetch-registry :表示是否从Eureka Server获取注册信息,默认为true。
eureka.client.serviceUrl.defaultZone :设置与Eureka Server交互的地址,查询服务和注册服务都需要依赖这个地址。默认是http://localhost:8761/eureka ;多个地址可使用 , 分隔。

server服务端

(1).pom.xml
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.1.RELEASE</version>
</parent> 
<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        <version>2.0.1.RELEASE</version>
    </dependency>
</dependencies>
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>
<!--注意:这里必须要添加,否则各种依赖有问题-->
<repositories>
    <repository>
        <id>spring-milestones</id>
        <name>Spring Milestones</name>
        <url>https://repo.spring.io/libs-milestone</url>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
    </repository>
</repositories>

#####(2)main方法

@SpringBootApplication
@EnableEurekaServer
public class AppRunCloud {
    public static void main(String[] args) {
        SpringApplication.run(AppRunCloud.class, args);
    }
}

#####(3) application.yml

server:
  port: 8101
spring: 
  application: 
    name: cw-server
eureka:
  instance:
    ##注册中心的ip地址
    hostname: 127.0.0.1
  client:
    service-url: 
        ##注册中心地址
      defaultZone: http://${eureka.instance.hostname}:8101/eureka
     ###自己是注册中心,是否要将自己注册到注册中心去,但是集群的时候需要设置为true
    register-with-eureka: false
     ###自己是注册中心,不需要去检索服务信息
    fetch-registry: false

client客户端

(1).pom.xml
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.1.RELEASE</version>
</parent> 
<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        <version>2.0.1.RELEASE</version>
    </dependency>
    <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-web</artifactId>
     </dependency>
</dependencies>
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>
<!--注意:这里必须要添加,否则各种依赖有问题-->
<repositories>
    <repository>
        <id>spring-milestones</id>
        <name>Spring Milestones</name>
        <url>https://repo.spring.io/libs-milestone</url>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
    </repository>
</repositories>
(2).main方法
@SpringBootApplication
@EnableEurekaClient
public class AppClientRun {
    public static void main(String[] args) {
        SpringApplication.run(AppClientRun.class, args);

    }
}
(3).application.properties
server.port=9200
spring.application.name=cw-order

eureka.client.service-url.defaultZone=http://127.0.0.1:8101/eureka
#注册到eureka服务器上的地址
eureka.client.register-with-eureka=true
#是否需要注册到eureka
eureka.client.fetch-register=true
#需要检索服务

4.理解集群 (可以作为面试答)

(cw的理解)通过集群代码:

  1.当服务器1打开后会发送心跳包连接服务器2,此时服务器1在工作,当服务器2连接成功后,服务器1和服务器2建立了集群,但实际上工作的是服务器1,服务器2休眠。

  2.当服务器1断开后,服务器2发送心跳包连接服务器1,此时服务器2在工作,当服务器1连接成功后,服务器1会工作,服务器2休眠。

  3.当服务器再次断开后,服务器2又处理工作状态,同时不断的发送心跳包给服务器1,当服务器1连接上时,服务器2休眠,服务器1继续工作。

5.eureka代码实现(集群)

server服务端集群

(1) pom.xml
<parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>2.0.1.RELEASE</version>
  </parent> 
  <properties>
      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
      <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
      <java.version>1.8</java.version>
  </properties>

  <dependencies>
      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter</artifactId>
      </dependency>
      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-test</artifactId>
          <scope>test</scope>
      </dependency>
      <dependency>
          <groupId>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
          <version>2.0.1.RELEASE</version>
      </dependency>
  </dependencies>
  <build>
      <plugins>
          <plugin>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-maven-plugin</artifactId>
          </plugin>
      </plugins>
  </build>
  <!--注意:这里必须要添加,否则各种依赖有问题-->
  <repositories>
      <repository>
          <id>spring-milestones</id>
          <name>Spring Milestones</name>
          <url>https://repo.spring.io/libs-milestone</url>
          <snapshots>
              <enabled>false</enabled>
          </snapshots>
      </repository>
  </repositories>

<description>Eureka集群</description>
(2)application配置
① application.yml
#启动server1服务时,先注释掉server2配置
spring.application.name=server1
spring.profiles.active=server1

#启动server1服务时,先注释掉server1配置
#spring.application.name=server2
#spring.profiles.active=server2
② application-server1.yml
server: 
  port: 8001

spring: 
  application:
    name: server1
  security:
    user:
      name: admin
      password: admin

eureka:
  instance: 
    hostname: server1
  client: 
    registerWithEureka: true 
    fetchRegistry: true #表示是否从eureka服务器获取注册信息
    serviceUrl:
      defaultZone: http://admin:admin@server2:8002/eureka/
③ application-server2.yml
server: 
  port: 8002

spring: 
  application:
    name: server2
  security:
    user:
      name: admin
      password: admin

eureka:
  instance: 
    hostname: server2
  client: 
    registerWithEureka: true 
    fetchRegistry: true #表示是否从eureka服务器获取注册信息
    serviceUrl:
      defaultZone: http://admin:admin@server1:8001/eureka/
④ host文件配置路径
由于采用了参数配置eureka.instance.hostnam及http://admin:admin@server1的写法,则需要在进行hosts的配置,

Window   : 在C:\Windows\System32\drivers\etc\hosts,
Linux      : /etc/host,

如下图所示

(3) main方法
@SpringBootApplication
@EnableEurekaServer
@EnableDiscoveryClient
public class RunServer {
    public static void main(String[] args) {
        SpringApplication.run(RunServer.class, args);
    }
}
(4)注意事项
启动第一个项目肯定会报错,因为互相注册导致无法找到另一个服务,不用惊慌,把两个服务全部启动。
访问http://127.0.0.1:8001/或http://127.0.0.1:8002/ ,
DS Replicas显示为另一个服务

application.yml:(启动两次修改此配置文件即可,server-1,和server-2分别启动一次)

client客户端集群

#####(1)pom.xml

<parent>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-parent</artifactId>
       <version>2.0.1.RELEASE</version>
   </parent> 
   <properties>
       <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
       <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
       <java.version>1.8</java.version>
   </properties>

   <dependencies>
       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter</artifactId>
       </dependency>
       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-test</artifactId>
           <scope>test</scope>
       </dependency>
      <dependency>
           <groupId>org.springframework.cloud</groupId>
           <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
           <version>2.0.1.RELEASE</version>
       </dependency>
       <!-- 这是因为client里不包含Tomcat的依赖,所以Spring容器无法创建一些实例,从而导致项目无法启动,只需在pom.xml文件中,加上web依赖即可 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
       </dependency>
   </dependencies>
   <build>
       <plugins>
           <plugin>
               <groupId>org.springframework.boot</groupId>
               <artifactId>spring-boot-maven-plugin</artifactId>
           </plugin>
       </plugins>
   </build>
   <!--注意:这里必须要添加,否则各种依赖有问题-->
   <repositories>
       <repository>
           <id>spring-milestones</id>
           <name>Spring Milestones</name>
           <url>https://repo.spring.io/libs-milestone</url>
           <snapshots>
               <enabled>false</enabled>
           </snapshots>
       </repository>
   </repositories>

#####(2) application.yml

spring: 
  application: 
    name: client
  security: 
    user:
      name: admin
      password: admin

server: 
  port: 8101

eureka: 
  client: 
    fetchRegistry: true
    registerWithEureka: true
    serviceUrl: 
      defaultZone: http://admin:admin@server2:8002/eureka/,
http://admin:admin@server1:8001/eureka/

#####(3) main方法

@SpringBootApplication
@EnableEurekaClient
public class RunClient {
    public static void main(String[] args) {
        SpringApplication.run(RunClient.class, args);
    }
}

文章标题:eureka原理介绍

发布时间:2019-11-13, 16:08:48

最后更新:2020-03-25, 10:01:15