zoukankan      html  css  js  c++  java
  • 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);
        }
    }

  • 相关阅读:
    通过SSH隧道的本地转发实现Django连接远程数据库
    Mysql多数据库备份
    apollo 项目配置中心开源框架部署
    nginx 配置多个 https 域名访问
    beetl 模板语法
    异常:由 spring-session pom 引发
    异常:NoSuchFieldError: BEST_MATCHING_HANDLER_ATTRIBUTE
    【Redis__验证】手机验证和限制登录功能
    【Linux__环境】配置
    【Layui__上传】多图上传
  • 原文地址:https://www.cnblogs.com/wlwl/p/9473379.html
Copyright © 2011-2022 走看看