• SpringCloud-Eureka快速入门,集群搭建


    Eureka

    个人主页:https://blog.csdn.net/hello_list?type=blog

    前言

    第一章:SpringCloud环境搭建 — Rest使用

    这里博主从说更新springcloud,发了第一篇之后好久又没更新了,这里不是没有学习了,其实我都已经把文章全部写好了,整个springcloud的,几大组件,所以大家在看文章的时候可以依赖会有变动,因为比如Eureka用着没什么问题,之后有用到Ribbon,zull可能依赖就有问题了,需要更换,不过也可能不会换前面的,所以大家还是可以出了问题就换依赖试一下
    这里我么就说明了什么,如果发现有错误,大部分都是依赖问题,springcloud本身没有太多编码什么的,大多导依赖然后配置,不是依赖不行了,就是配置错了,很简单的,这里博主也都写好了,慢慢就都发出来了,所以大家可以关注点赞收藏不迷路!!!

    学习Eureka那我们就要知道Eureka是什么,前面我们学过zookeeper了,注册中心,Eureka就是springcloud下被spring共公司封装了的注册中心,但是与zookeeper不同,具体不同,我觉得多说无益,都用一下就知道哪里不同了,下面是我从别人哪里复制的,可以看下这样的说话。

    • Eureka是Netflix的有个子模块,也是核心模块之一。Eureka是基于REST的服务,用于定位服务,以实现云端中间件层服务发现和故障转移,服务注册与发现对于微服务来说是非常重要的,有了服务注册与发现,只需要使用服务的标识符,就可以访问到服务,而不需要修改服务调用的配置文件了,功能类似于Dubbo的注册中心,比如Zookeeper

    • Eureka基本的架构

      • Springcloud 封装了Netflix公司开发的Eureka模块来实现服务注册与发现 (对比Zookeeper).
      • Eureka采用了C-S的架构设计,EurekaServer作为服务注册功能的服务器,他是服务注册中心.
      • 而系统中的其他微服务,使用Eureka的客户端连接到EurekaServer并维持心跳连接。这样系统的维护人员就可以通过EurekaServer来监控系统中各个微服务是否正常运行,Springcloud 的一些其他模块 (比如Zuul) 就可以通过EurekaServer来发现系统中的其他微服务,并执行相关的逻辑.

    Eureka的架构设计图

    在这里插入图片描述

    Eureka-Server

    新建一个普通的maven项目,导入eureka依赖,做一个注册中心,新建一个项目名springcloud-eureka-7001,还是那几个步骤,微服务就这么简单,我觉得比起成吨的java代码,理论上也好理解

    1、导入依赖

    <dependencies>
        
        <dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-starter-eureka-serverartifactId>
            <version>1.4.7.RELEASEversion>
        dependency>
    
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-devtoolsartifactId>
        dependency>
    
    dependencies>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    2、编写配置

    新建application.yml文件

    server:
      port: 7001
    
    
    # Eureka配置
    eureka:
      instance:
        hostname: localhost  # Eureka实例名称
      client:
        # 是否是客户端,是否注册自己,默认都是true这里我们选择false就是自己是注册中心
        register-with-eureka: false
        fetch-registry: false
        service-url:
          #监控页面,这里改成我们自己定义的
         defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    3、开启功能

    创建springboot启动类

    @SpringBootApplication
    @EnableEurekaServer  //开启eureka服务端功能
    public class EurekaServer_7001 {
        public static void main(String[] args) {
            SpringApplication.run(EurekaServer_7001.class,args);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    启动程序,启动成功,访问http://localhost:7001/这里就是注册中心页面

    在这里插入图片描述

    Eureka-Client

    同样的,这里我们直接注册8001服务

    1、导入依赖,一会儿还有一个问题,我们稍后再说

    
    
    <dependency>
        <groupId>org.springframework.cloudgroupId>
        <artifactId>spring-cloud-starter-eurekaartifactId>
        <version>1.4.7.RELEASEversion>
    dependency>
    
    
    
    
    <dependency>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-actuatorartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    2、编写配置,这里是我们服务端配置,自动去注册中心注册

    # Eureka配置,注册服务
    eureka:
      client:
        service-url:
          defaultZone: http://localhost:7001/eureka
      instance:
        instance-id: springcloud-provider-account8001  # 修改默认描述信息
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    3、开启功能,加到springboot启动类上

    @EnableEurekaClient //启动客户端服务
    
    • 1

    启动项目,可以看到,我们的服务就被注册了进来

    在这里插入图片描述

    自我保护机制

    这个时候我们关闭8001服务,我们等待下,可以看到这样的报错,其实这就是euraka的自我保护机制,当服务出现宕机等问题时候,注册中心并不会立马清除服务,而且会保存服务等待服务恢复

    不难理解吧,其实就是保持不会立马清楚这个服务,如果想深入了解下这个机制,可以自行了解,反正不难的很简单。

    在这里插入图片描述

    完善监控信息

    当我们点击1的时候,我们发现跳转到2这个地址页面,是不是404什么都没有,这是因为我们还没有配置,这里我们可以添加服务的描述信息,这个地方我这里出问题了,最后参考这个文章配置了下,大家可以看看:(4条消息) Eureka 遇到/actuator/info不显示_dyao23的博客-CSDN博客_/actuator/info

    1、导入actuator依赖,上面我们已经导入了,因为我这里出不来,所以加了这个插件

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-maven-pluginartifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>build-infogoal>
                        goals>
                    execution>
                executions>
            plugin>
        plugins>
    build>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    2、编写配置,我这里也加了相对应的management配置

    # 导入actuator可以完善监控信息配置
    info:
      app.name: springcloud-account
      company.name: blog.csdn.net/hello_list
    
    management:
      endpoints:
        web:
          exposure:
            include: "*"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    但是还是不可以,出来的这个

    在这里插入图片描述

    3、启动程序,因为上面出现的还是花括号,这里我用那个文章里的插件打包了下,就可以了,然后点击链接,就可以出来我们服务信息的描述,这样可以用来做我们服务信息的一个描述,在使用中查看

    在这里插入图片描述

    DiscoveryClient服务发现

    Eureka我们叫注册中心,就是服务的注册和发现,我们了解了服务注册,我们如何去发现服务呢,客户端如何去发现服务然后调用服务,这里我们去尝试下DiscoveryClient发现服务,调用服务就不用说了吧,Eureka基于restful我们前面使用了restful调用服务,所以在调用前我们应该去发现服务

    这里我们直接拿8001再次当成客户端,我们之前不是写过一个测试controller嘛,现在就用来做客户端。

    注入bean,这里我们用的是springboot框架的,别导错包了

    在这里插入图片描述

    我们新加一个方法

    @GetMapping("/client/discovery")
    public Object discovery(){
        // 这里我们模拟操作下
        // 通过客户端去注册中心拿到服务信息,拿到服务信息后我们就可以restful去进行请求
    
        // 获取微服务的列表清单
        List<String> services = client.getServices();
        System.out.println("service======>"+services);
    
        // 我们还可以通过服务id得到一个具体的服务信息,这里调用的自己8001端口服务
        // 自己点一个下就那么几个属性
        List<ServiceInstance> instances = client.getInstances("SPRINGCLOUD-PROVIDER-ACCOUNT");
        for (ServiceInstance instance : instances) {
            System.out.println(
                instance.getHost()+"\t"+
                instance.getPort()+"\t"+
                instance.getUri()+"\t"+
                instance.getServiceId()+"\t"+
                instance.getScheme()+"\t"+
                instance.getMetadata()
            );
        }
        return this.client;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    我们可以知道都有什么服务,服务信息是什么,这个就是我们的实例id

    在这里插入图片描述

    我们看一下都能得到什么,访问测试,我们可以拿到这些数据信息

    在这里插入图片描述

    在这里插入图片描述

    有了这些信息,我们就可以通过restful去调用请求,然后完成远程调用,对吧,是不是很简单,其实我们发现本质还是调用请求。

    Eureka集群搭建

    特别简单,我们搭建一个三个注册中心的集群,我们再新建两个项目,其实本质就是一个项目复制粘贴,还是几步

    1、导入依赖

    2、编写配置

    在这里插入图片描述

    1,3步我们可以省略吧,这里我们主要看3个集群的配置,三个集群我们开三个端口7001,7002,7003,集群可简单我们看下配置就知道多简单了

    这里我们为了方便和直观感受分布式,我们做一个主机映射,我这里必须管理员权限访问,这里大家就跟我一样吧,告诉大家这个方法,记事本管理员方式打开

    在这里插入图片描述

    Ctrl+o快捷键

    在这里插入图片描述

    然后在最末尾添加,这样我们访问eureka7001.com就都是在访问我们本地127.0.0.1

    127.0.0.1 eureka7001.com
    127.0.0.1 eureka7002.com
    127.0.0.1 eureka7003.com
    
    • 1
    • 2
    • 3

    这样做一个映射非常的直观,其实也可以不用做,我们下面不是有实例名嘛,修改下,可能会有问题,还是这样做吧,因为实例名不能都是localhost,然后不是localhost就不能访问本地回环地址,打不开网页;自己尝试试试看

    7001配置

    server:
      port: 7001
    
    
    # Eureka配置
    eureka:
      instance:
        hostname: eureka7001.com  # Eureka实例名称
      client:
        # 是否是客户端,是否注册自己,默认都是true这里我们选择false就是自己是注册中心
        register-with-eureka: false
        fetch-registry: false
        service-url:
          #监控页面,这里改成我们自己定义的
          #单机 defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka
          defaultZone: http://eureka7002.com:7002/eureka,http://eureka7003.com:7003/eureka
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    7002配置

    server:
      port: 7002
    
    
    # Eureka配置
    eureka:
      instance:
        hostname: eureka7002.com  # Eureka实例名称
      client:
        # 是否是客户端,是否注册自己,默认都是true这里我们选择false就是自己是注册中心
        register-with-eureka: false
        fetch-registry: false
        service-url:
          #监控页面,这里改成我们自己定义的
          defaultZone: http://eureka7001.com:7001/eureka,http://eureka7003.com:7003/eureka
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    7003配置

    server:
      port: 7003
    
    
    # Eureka配置
    eureka:
      instance:
        hostname: eureka7003.com  # Eureka实例名称
      client:
        # 是否是客户端,是否注册自己,默认都是true这里我们选择false就是自己是注册中心
        register-with-eureka: false
        fetch-registry: false
        service-url:
          #监控页面,这里改成我们自己定义的
         defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    3、主启动类,开启功能,把这三个都开启

    我们访问eureka7001.com:7001,可以看到7002和7003的集群信息

    在这里插入图片描述

    同样的访问其他两个都是一样:

    在这里插入图片描述

    在这里插入图片描述

    集群就搭建成功了,我们试着把8001的服务注册进去这几个注册中心,这里我们要注册三个,所以是不是应该修改下配置文件,这里做下修改就可以了

    在这里插入图片描述

    我们可以看到7002里已经把这个服务注册进来了

    在这里插入图片描述

    7001:

    在这里插入图片描述

    7003,可能是我得后台不稳定啊,不知道为什么说服务没了,可能后台服务不稳定,自我保护敏感吧,但是不影响使用

    在这里插入图片描述

    这里我们还可以把80consumer打开测试下,ok没有问题:

    在这里插入图片描述

    以下为其他原文,理论的大家可以看下:https://www.kuangstudy.com/bbs/1374942542566551554

    1. 回顾CAP原则

    RDBMS (MySQL\Oracle\sqlServer) ===> ACID

    NoSQL (Redis\MongoDB) ===> CAP

    2. ACID是什么?
    • A (Atomicity) 原子性
    • C (Consistency) 一致性
    • I (Isolation) 隔离性
    • D (Durability) 持久性
    3. CAP是什么?
    • C (Consistency) 强一致性
    • A (Availability) 可用性
    • P (Partition tolerance) 分区容错性

    CAP的三进二:CA、AP、CP

    4. CAP理论的核心
    • 一个分布式系统不可能同时很好的满足一致性,可用性和分区容错性这三个需求
    • 根据CAP原理,将NoSQL数据库分成了满足CA原则,满足CP原则和满足AP原则三大类
      • CA:单点集群,满足一致性,可用性的系统,通常可扩展性较差
      • CP:满足一致性,分区容错的系统,通常性能不是特别高
      • AP:满足可用性,分区容错的系统,通常可能对一致性要求低一些
    5. 作为分布式服务注册中心,Eureka比Zookeeper好在哪里?

    著名的CAP理论指出,一个分布式系统不可能同时满足C (一致性) 、A (可用性) 、P (容错性),由于分区容错性P再分布式系统中是必须要保证的,因此我们只能再A和C之间进行权衡。

    • Zookeeper 保证的是 CP —> 满足一致性,分区容错的系统,通常性能不是特别高
    • Eureka 保证的是 AP —> 满足可用性,分区容错的系统,通常可能对一致性要求低一些

    Zookeeper保证的是CP

    当向注册中心查询服务列表时,我们可以容忍注册中心返回的是几分钟以前的注册信息,但不能接收服务直接down掉不可用。也就是说,服务注册功能对可用性的要求要高于一致性。但zookeeper会出现这样一种情况,当master节点因为网络故障与其他节点失去联系时,剩余节点会重新进行leader选举。问题在于,选举leader的时间太长,30-120s,且选举期间整个zookeeper集群是不可用的,这就导致在选举期间注册服务瘫痪。在云部署的环境下,因为网络问题使得zookeeper集群失去master节点是较大概率发生的事件,虽然服务最终能够恢复,但是,漫长的选举时间导致注册长期不可用,是不可容忍的。

    Eureka保证的是AP

    Eureka看明白了这一点,因此在设计时就优先保证可用性。Eureka各个节点都是平等的,几个节点挂掉不会影响正常节点的工作,剩余的节点依然可以提供注册和查询服务。而Eureka的客户端在向某个Eureka注册时,如果发现连接失败,则会自动切换至其他节点,只要有一台Eureka还在,就能保住注册服务的可用性,只不过查到的信息可能不是最新的,除此之外,Eureka还有之中自我保护机制,如果在15分钟内超过85%的节点都没有正常的心跳,那么Eureka就认为客户端与注册中心出现了网络故障,此时会出现以下几种情况:

    • Eureka不在从注册列表中移除因为长时间没收到心跳而应该过期的服务
    • Eureka仍然能够接受新服务的注册和查询请求,但是不会被同步到其他节点上 (即保证当前节点依然可用)
    • 当网络稳定时,当前实例新的注册信息会被同步到其他节点中

    因此,Eureka可以很好的应对因网络故障导致部分节点失去联系的情况,而不会像zookeeper那样使整个注册服务瘫痪

    小结

    都看到这里了,还不点个关注吗,bye~

  • 相关阅读:
    外汇天眼:Patrick Wonsey挪用340万美元!涉嫌外汇和二元期权欺诈
    @zabbix web登录忘记密码(用户密码重置及反解)
    深度理解实分析:超越公式与算法的学习方法
    Python 基础知识自检,离深入掌握 Python 还有多远
    Unity制作影视互动游戏视频加密方案分享
    PostgreSQL Extension 开发环境搭建
    【数据集】Maple-IDS——网络安全恶意流量检测数据集
    进阶面试皆宜!阿里强推 Java 程序员进阶笔记,差距不止一点点
    猿创征文|GISER开发者必备高能武器库
    如何优化k8s中HPA的弹性速率
  • 原文地址:https://blog.csdn.net/hello_list/article/details/126569446