• eureka的简单介绍,eureka单节点版的实现?eureka的自我保护?eureka的AP性,和CP性?


    注意!!!   
      这是对上一篇博客 springcloud的延续,整个项目的搭建,来源与上一篇博客。


    一、什么是eureka?
    // eureka是一个注册中心,实现了dubbo中zookeeper的效果! 二、实现eureka工程的搭建? 1.1 单节点版 1.1 zookeeper 和 eureka的区别? /* 1. zookeeper不会把自己注册到注册中心,但是eureka会! 2. 配置eureka 需要配置不能把自己注册到注册中心里面。 3. consumer 也不能把自己注册到注册中心。 4. 只要provider可以。 */ 1.2 创建eureka工程 20190926-springcloud-eureka-management(pom):只管理jar包
         子级项目
    --20190926-springcloud-eureka-7081(jar):运行了eureka 1.3 jar包的添加 所有的eureka都只会用到一个jar包 eureka并不是springcloud公司的,是Netflix公司的产品,目前springcloud正在开发完善的springcloud架构来代替Netflix所提供的组件 虽然eureka的工程构建仍然需要使用springboot,但是不再需要springboot-web-starter的jar包,因为eureka的jar包中已经有了 // !!!!!如果添加则出现jar包冲突 eureka的jar包添加只需要在父工程中添加即可,所有的子工程都可以继承父工程的jar包 springcloud官网中提供的springcloud2.x版本所规定的jar包格式: <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> </dependencies> 1.4 eureka整个开发中,不涉及任何与业务有关的代码 /* application.properties ApplicationRun.java @SpringBootApplication @EnableEurekaServer */ 1.5 把provider-8081注册进eureka中 /* 在配置zookeeper的时候,无论是服务消费者还是服务生产者,都引入zookeeper的jar包(zkClinet) 在配置eureka的时候,需要引入么? !!很需要!! <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> */ 修改application.properties配置文件 在讲zookeeper的时候,zk.address=zookeeper的ip地址 现在使用eureka的时候,也需要eureka的地址(eureka的项目地址) eureka.client.service-url.defaultZone=http://localhost:7081/eureka 在provider-8081项目的主启动类上添加注解 @EnableDiscoveryClient: springcloud2.x的版本注解 @EnableEurekaClient: springcloud1.x的版本注解 1.6 配置eureka服务的信息(actuator-info) // 为什么要配置? 虽然目前eureka注册中心中只有一个服务,但是在真实开发环境中可能有很多个(35个) 每一个团队/team是有多个人组成的,每一个开发人员开发的功能是不同的, eg: 电商 cart微服务:zhangsan开发 order微服务:lisi开发 portal微服务:wangwu开发 这些微服务最终都需要注册进eureka中 假设zhangsan所开发的cart微服务出现问题了,这个问题是lisi发现的 如果其中有一个服务出现问题,这个服务正好是自己开发的,但是最终lisi看不到主要信息,直接描述不清楚,这种情况是绝对不允许在团队中出现! /* 在provider-8081项目的application.properties中进行配置 配置eureka的实例名(Status下面所显示的名字) 不允许出现任何的重复! eureka.instance.instance-id=虽然可以随意起,但是要求描述出整个微服务的作用 */ 当鼠标移动到服务名的时候,只会显示localhost,但是根据localhost并不能精准的定位到哪一台服务器,需要把localhost改为IP地址 # 在eureka中显示IP地址 // eureka.instance.prefer-ip-adderss=true 配置完毕后显示并不是本机的ip地址 provider的ip地址显示是相对于eureka做的内网映射 在eureka的整个注册中心里会指定内部的ip地址,必须要使provider和eureka在同一个内网中, 一旦provider成功的注册进了eureka,那么eureka就会给provider分配一个自己的内网ip // 每一台电脑是有两个IP的,一个是公网IP,一个是内网IP 实现点击服务名显示具体的服务信息 先添加jar包 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> // 在provider-8081项目的application.properties配置文件中添加: info.author.name=Seven Lee info.company.name=AAA SOFTWARE EDU info.project.description=This is Demo 1.7 eureka的自我保护机制? 如果长时间不连接(不激活)eureka的时候,会出现自我保护机制,在eureka页面上会显示: EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE. /* 为什么会出现自我保护: 有没有可能网络阻塞(网络非常卡),如果发生后,eureka就检测不到provider的心跳 eureka中有200个provider,如果只有3个provider没有心跳,eureka就会直接把这三台直接剔除 但是如果有198个provider都没有心跳,则eureka就不会再剔除,也就是说直接会保留这198个provider */ 1.8 什么是eureka的AP性? 在eureka中注册过的服务会定时向eureka发送心跳 当网络故障/网络延迟/服务宕机就不会再向eureka发送心跳,eureka从接不到心跳的那一秒开始算起,(90秒)之后会直接把这个服务给剔除 因为provider的机房停电了,大面积的provider都无法向eureka发送心跳,90秒之后还是没有接收到心跳, eureka就不会再剔除任何一个服务(也就是说会把全部的服务都保留下来)(这个就是eureka的AP性) /* 为什么eureka不会剔除大量的服务? AP:只保证了服务的可用性,不保证数据的一致性 CP:只保证了数据的一致性,不保证服务的可用性 如果eureka把所有的服务全部剔除,当consumer进行访问调用的发现eureka中并没有任何服务了,整个项目都会处于瘫痪状态,整个客户端的体验就会非常差,也就是说相当于报错500! 如果当大面积服务都没有心跳,eureka不剔除的情况下,consumer进行访问调用的时候依然可以找到所注册服务,然后就可以直接获取到数据,这些数据可能不是最新的数据! */ 1.9 如何关闭eureka的自我保护机制: !!可以关闭!!但是不能这么做!! 在eureka-7081项目的application.properties配置文件中 // eureka.server.enable-self-preservation=false(!!关闭eureka的自我保护机制!!) 提示一下信息: THE SELF PRESERVATION MODE IS TURNED OFF. THIS MAY NOT PROTECT INSTANCE EXPIRY IN CASE OF NETWORK/OTHER PROBLEMS. 现在某些微服务就是不需要eureka的自我保护,就想办法把自我保护机制失效 provider告诉eureka,我每个5秒会向你发送一次心跳,当最后一次检测我的时间之后过了8秒还没有接收到心跳直接把我剔除! 在eureka-7081的application.properties配置文件中添加 # eureka自己检测服务的心跳时间(90秒) # 单位是毫秒,先把eureka检测心跳的时间缩短为10秒 # 也就是说每个10秒就会检测一次服务的心跳 // eureka.server.eviction-interval-timer-in-ms=10000 在provider-8081的application.properties配置文件中添加 # 规定自己向eureka发送心跳的时间 # 单位是秒 // eureka.instance.lease-renewal-interval-in-seconds=5 # 当eureka最后一次检测到心跳的时间间隔(单位是秒) # eg:15:05:20是最后一次检测到心跳-->检测8秒之后还是无法检测心跳的时候直接剔除 // eureka.instance.lease-expiration-duration-in-seconds=8 2.集群版 (正宗的eureka!

    二、eureka项目jar包的添加,和相关配置文件?

    2.1 20190927-springcloud-eureka-management父级项目的 jar包

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <parent>
            <artifactId>20190927-springcloud-parent</artifactId>
            <groupId>com.aaa</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.aaa</groupId>
        <artifactId>20190927-springcloud-eureka-management</artifactId>
        <packaging>pom</packaging>
    
        <modules>
            <module>20190927-springcloud-eureka-7081</module>
        </modules>
    
    <!--
            eureka的jar包添加只需要在父工程中添加即可,所有的子工程都可以继承父工程的jar包
                    springcloud官网中提供的springcloud2.x版本所规定的jar包格式:
    -->
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
            </dependency>
        </dependencies>
    
    
    </project>

    2.2   把provider-8081注册进eureka中 的文件配置?

    server.port=8081
    server.servlet.context-path=/
    
    spring.datasource.driver-class-name=com.mysql.jdbc.Driver
    
    # 我的数据库编码的问题 所以需要添加 characterEncoding=utf8   设置自字符集。
    spring.datasource.url=jdbc:mysql://localhost:3306/qy100?characterEncoding=utf8&useSSL=false
    
    spring.datasource.username=root
    spring.datasource.password=root
    spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
    
    mybatis.type-aliases-package=com.aaa.zxf.model
    mybatis.mapper-locations=classpath:mapper/*Mapper.xml
    
    #三、
    # 配置的是在eureka中显示的服务名(Application)
    # 如果不配置,则会显示UNKNOWN(这个是细节!!,以后有问题)
    spring.application.name=user-provider
    
    #一、
    #配置eureka 的注册地址,将provider 注册进来。
    # 单节点模式,eureka的命名空间是 defaultZone
    # 客户端的命名空间可以随意指定,就算不一致,也可以注册进eureka 。因为单节点只有
    #一台eureka, 此时的命名空间是失效的。
    
    
    #二、     注意!
    # GreenWich RS.3:无论是单点解还是集群模式,eureka的服务器端和客户端的命名空间必要保持一致,否则会报错(找不到服务实例)
    #eureka.client.service-url.defaultZone=http://localhost:7081/eureka
    eureka.client.service-url.defaultZone=http://localhost:7081/eureka
    
    
    #四
    #在eureka中配置实例, 就是eureka的status下显示的名字
    # 不可以重复!!! 等同于mysql中表的id。
    eureka.instance.instance-id=user-provider-8081
    
    #五、
    #在eureka中显示ip的地址
    eureka.instance.prefer-ip-address=true
    
    #六  点击eureka的服务名显示出该服务的具体信息
    # 根据服务的具体内容,作者,公司,以及对整个服务的描述来进行显示
    # 相当于在HTML页面上有一个a标签<a href="/actuator/info"></a> --> 跳转到controller:@RequestMapping("/actuator/info")
    # !!开头用info!!其他的随便输入
    
    info.autor.name=ZhouXu
    info.company.name=AAA
    info.project.desription=This is Demo
    
    #七  现在某些微服务就是不需要eureka的自我保护,就想办法把自我保护机制失效
    # 规定自己向eureka发送心跳的时间  单位是秒
    eureka.instance.lease-renewal-interval-in-seconds=5
    
    #eureka.instance.lease-renewal-interval-in-seconds=5
    
    # 当eureka最后一次检测到心跳的时间间隔(单位是秒)
    # eg:15:05:20是最后一次检测到心跳-->检测8秒之后还是无法检测心跳的时候直接剔除
    eureka.instance.lease-expiration-duration-in-seconds=8

    provide-8081启动类添加注解。

    package com.aaa.zxf;
    
    import org.mybatis.spring.annotation.MapperScan;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
    
    /**
     *
     * 将provider 注册到 eureka 需要添加注解
     *                                         @EnableDiscoveryClient
     */
    @SpringBootApplication
    @MapperScan("com.aaa.zxf.mapper")
    @EnableDiscoveryClient
    public class ApplicationRun8081 {
        public static void main(String[] args) {
    
            SpringApplication.run(ApplicationRun8081.class,args);
    
        }
    }

    2.3 eureka服务的信息配置?

    20190927-springcloud-eureka-7081子级项目(jar)

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <parent>
            <artifactId>20190927-springcloud-provider-management</artifactId>
            <groupId>com.aaa</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>20190927-springcloud-provider-8081</artifactId>
    
        <dependencies>
            <dependency>
                <groupId>com.aaa</groupId>
                <artifactId>20190927-springcloud-service</artifactId>
                <version>1.0-SNAPSHOT</version>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            </dependency>
    
    <!--
        实现点击服务名显示具体的服务信息的jar包
    -->
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>
        </dependencies>
    
    
    </project>

    7081的application.properties配置。

    # 一、
    #eureka 注册中心的相关配置
    server.port=7081
    server.servlet.context-path=/
    
    #二、
    # eureka 服务器端的实例名称  唯一的!
    #就是给 eureka 起了一个名字。 不可乱起。
    #hostname就是本台服务器的域名,不配置就是localhost
    eureka.instance.hostname=localhost
    
    
    #三、
    # 设置eureka 不要将自己注册到注册中心里面。
    # eureka默认也会把自己注册到注册中心里,这里因为最终eureka是不需要被consumer所发现的,所以不再需要把自己注册里面,eureka自己就是注册中心
    # 它是对整个服务的管理起作用,并不是一个服务提供者,所以不应该把自己注册到注册中心里
    # 默认值为true,需要把默认值改成false
    eureka.client.register-with-eureka=false
    
    #四、
    # 设置eureka 不要在注册中心 发现自己
    # eureka的职责是维护服务的实例,表明自己就是注册中心,并不需要从注册中心里发现自己
    # 默认值为true,需要手动改为false
    eureka.client.fetch-registry=false
    
    #五、
    #1. eureka的指向地址
    # zookeeper需要在linux服务器上进行配置,最终的情况下使用zookeeper的时候必须要指向zookeeper的IP地址
    #eureka不需要做任何服务器配置,但是也必须要指向地址(直接指向eureka的项目即可:http://localhost:7081/eureka)
    
    #2. localhost
    # 该地址中的localhost就是eureka.instance.hostname的值,端口号就是server.port的值,/eureka:固定的(eureka自己提供)
    # defaultZone:eureka默认所提供的命名空间
    # 在eureka的注册地址中,是可以分空间(zone)的,是命名空间,根据空间的不同来配置不同集群的eureka来实现不同的作用
    # eureka不需要linux服务器,但是eureka怎么知道自己和其他的服务器是一个集群呢?
    # eg:电商项目
    # order项目-->服务的提供者和服务的消费者
    # cart项目-->服务的提供者和服务的消费者
    # item项目-->服务的提供者和服务的消费者
    # manager项目-->服务的提供者和服务的消费者
    # userInfo项目-->服务的提供者和服务的消费者
    # 就可以根据类别进行配置eureka
    # eureka01和eureka02的命名空间就是:order
    # eureka03和eureka04的命名空间就是:cart
    # 为了提供整个项目的安全性和可维护性
    
    #3. 单节点的配置
    # 如果为单节点可以随意配置,但是如果为集群则目前为止必须要配置成defaultZone(因为如果是集群版就必须先要声明命名空间,如果不声明则无法使用)
    eureka.client.service-url.defaultZone=http://localhost:7081/eureka
    
    
    
    #六
    #关闭eureka的自我保护机制:
    #!!可以关闭!!但是不能这么做!!
    #eureka.server.enable-self-preservation=false
    
    
    #七  现在某些微服务就是不需要eureka的自我保护,就想办法把自我保护机制失效
    #1. provider告诉eureka,我每个5秒会向你发送一次心跳,当最后一次检测我的时间之后过了8秒还没有接收到心跳直接把我剔除!
    
    #2.  eureka自己检测服务的心跳时间(90秒)
    # 单位是毫秒,先把eureka检测心跳的时间缩短为10秒
    # 也就是说每个10秒就会检测一次服务的心跳
    eureka.server.eviction-interval-timer-in-ms=10000
    
    
    #eureka.server.eviction-interval-timer-in-ms=10000

    7081的启动类

    package com.aaa.zxf;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
    
    /**
     * 关于注解?
     *   @EnableEurekaServer: 就是开启eureka的服务器端
     *
     *   @EnableEurekaClient: !!!!不让用!!!!(springcloud1.x的注解)
     */
    @SpringBootApplication
    @EnableEurekaServer
    public class ApplicationRun7081 {
        public static void main(String[] args) {
            SpringApplication.run(ApplicationRun7081.class,args);
        }
    }

    图解单节点

     

  • 相关阅读:
    Vue 函数
    VUE 基础语法
    C# txt文件操作
    C# 添加应用程序包
    Js 倒计时跳转
    Redis集群(主从集群)(一)
    JAVA基础总结001(《JAVA核心技术》)
    Linux学习001——文件和用户
    Linux——ELK集群搭建
    Linux安装jdk
  • 原文地址:https://www.cnblogs.com/ZXF6/p/11614022.html
Copyright © 2020-2023  润新知