Eureka服务注册与发现

运行原理:

  服务提供者和消费者都注册到Eureka服务器上,浏览器访问消费者地址,消费者会通过Eureka服务器上服务提供者的名字,找到提供者的真实路径,进行调用。高可用时可以搭建几个Eureka服务器,互相注册,复制各自信息。

  eureka是注重高可用和分区容错性的,它实现注册发现和故障转移靠的就是:注册表和多级缓存。目的就是为防止当高并发时,读写同时操作注册表时数据同步问题,如果为了数据安全必须加锁,而加锁势必会导致性能问题,所以才考虑了这种多级缓存方案。
1. eureka中维护了注册表和readonly和readwrite缓存,首先消费者和提供者会注册到eureka注册中心里面去,并同步到readwrite缓存里面去。
2. 消费者定时去readonly中拉取注册信息,然后去调用提供者。由于readonly和readwrite同步不是实时的,所以经常会出现刚启动之后,要过几十秒才能访问的情况。
3. 其实eureka后台会有一个线程,定时去同步readonly和readwrite的注册信息,当数据同步完成之后。此时消费者就能从readonly拿到数据去调用提供者。
4. 如果此时提供者挂了,注册表信息没更新、或者消费者还是拿着以前的注册信息去调用,就会出现timeout。
5. eureka为了提高它的容错性,在后台维护了一个线程去更新注册表信息,当它发现提供者长时间没法送过心跳检测,就会删掉这个提供者的注册信息,然后清空整个readwrite缓存。
6. 过了一会,前面提到的那一个后台线程同步readonly和readwrite信息时,就把readonly缓存清空了。
7. 此时消费者去拉取readonly没有信息时、就会去读取readwrite缓存,readwrite也为空,就会去找注册表了,然后把最新的数据同步到readonly和readwrite。

作用:透明化的远程方法调用,就像调用本地方法一样调用远程方法,只需简单配置,没有任何api侵入。

  eureka是springcloud的一个子项目,通过rest api来调用。更看重高可用和分区容错性。springcloud对构建微服务架构有一套完整的技术栈; zookeeper只是一个单纯的服务注册组件,通过rpc方式调用。zookeeper更加看重一致性和分区容错性。很难说谁好谁坏,还是根据公司业务做技术选型吧。

案例编写:

一:搭建eureka服务器

1. 导入依赖

   <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.8.RELEASE</version> 
        <relativePath/>
    </parent>
  <!-- springcloud依赖 -->
  <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Dalston.SR3</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- eureka服务器依赖 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka-server</artifactId>
        </dependency>
    </dependencies>

2. 配置application.xml文件

# 指定默认端口
server:
  port: 8761
  
# eureka默认把自己到服务器注册会报错,这里禁止掉
eureka:
  client: 
    register-with-eureka: false
    fetch-registry: false

3. 编写启动类

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
//申明这是一个eureka服务器
@EnableEurekaServer
public class ServerApp {

    public static void main(String[] args) {
    
        SpringApplication.run(ServerApp.class, args);
        //new SpringApplicationBuilder(ServerApp.class).web(true).run(args); 
    }
}

4. 测试  (看到这个页面就说明eureka服务器搭建好了,我们可以编写一个项目注册到eureka上面来)

 搭建测试工程:

1. 导包

   <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.8.RELEASE</version> 
        <relativePath/>
    </parent>
  <!-- springcloud依赖 -->
  <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Dalston.SR3</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- eureka客户端依赖 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>
    </dependencies>

2. 编写application.yml配置文件

# 设置服务名称,服务会以这个名字注册到eureka服务器上
spring:
  application:
    name: myclient

# 设置eureka服务器的注册地址
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/

3. 启动springboot应用,刷新127.0.0.1:8761可以发现我们的服务就已注册上去了。

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication
//申明eureka客户端
@EnableEurekaClient
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

原文地址:https://www.cnblogs.com/wlwl/p/9473379.html