zoukankan      html  css  js  c++  java
  • SpringCloud微服务入门

    声明:本文摘抄子鲁班学院商鞅老师课堂笔记

    帮助:本文涉及到的详细代码请参考:https://github.com/LoveWK/mySpringCloud.git

    1.什么是微服务,以及为什么使用微服务?

      微服务就是把原本臃肿的一个项目的所有模块拆分开来并做到互相没有关联,甚至可以不使用同一个数据库。传统的单体架构所有的模块全都耦合在一块,代码量大,维护困难,微服务每个模块就相当于一个单独的项目,代码量明显减少,遇到问题也相对来说比较好解决。

      单体架构所有的模块都共用一个数据库,存储方式比较单一,微服务每个模块都可以使用不同的存储方式(比如有的用redis,有的用mysql等),数据库也是单个模块对应自己的数据库。

      单体架构所有的模块开发所使用的技术一样,微服务每个模块都可以使用不同的开发技术,开发模式更灵活。

    2.微服务和分布式的区别?

      谈到区别,我们先简单说一下分布式是什么:

        所谓分布式,就是将偌大的系统划分为多个模块(这一点和微服务很像)部署到不同机器上(因为一台机器可能承受不了这么大的压力或者说一台非常好的服务器的成本可能够好几台普通的了),各个模块通过接口进行数据交互,其实 分布式也是一种微服务。 因为都是把模块拆分开来变为独立的单元,提供接口来调用.

      那么 他们本质的区别在哪呢?

        他们的区别主要体现在“目标”上, 何为目标,就是你这样架构项目要做到的事情。 分布式的目标是什么? 我们刚刚也看见了, 就是一台机器承受不了的,或者是成本问题 , 不得不使用多台机器来完成服务的部署, 而微服务的目标 只是让各个模块拆分开来,不会被互相影响,比如模块的升级亦或是出现BUG等等... 

      讲了这么多,可以用一句话来理解:分布式也是微服务的一种,而微服务他可以是在一台机器上。

    3.微服务与SpringCloud的关系(区别)?

      微服务只是一种项目的架构方式,或者说是一种概念,就如同我们的MVC架构一样, 那么Spring-Cloud便是对这种技术的实现

    4.SpringCloud项目的搭建。

      因为spring-cloud是基于spring-boot项目来的,所以我们项目得是一个spring-boot项目,至于spring-boot项目,这节我们先不讨论,这里要注意的一个点是spring-cloud的版本与spring-boot的版本要对应下图:如果版本不对,项目启动会报错

      

       4.1首先创建一个SpringBoot项目

      

       4.2在SpringBoot项目中新创建一个moudle项目

      

       添加SpringCloud的依赖

        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-dependencies</artifactId>
                    <version>Finchley.SR2</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>

      4.3SpringCloud组件:eureka

    eureka是什么?

      eureka是Netflix的子模块之一,也是一个核心的模块,eureka里有2个组件,一个是EurekaServer(一个独立的项目) 这个是用于定位服务以实现中间层服务器的负载平衡和故障转移,另一个便是EurekaClient(我们的微服务) 它是用于与Server交互的,可以使得交互变得非常简单:只需要通过服务标识符即可拿到服务。

      eureka和SpringCloud的关系?

        Spring Cloud 封装了 Netflix 公司开发的 Eureka 模块来实现服务注册和发现(可以对比Zookeeper)。

        Eureka 采用了 C-S 的设计架构。Eureka Server 作为服务注册功能的服务器,它是服务注册中心。

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

        角色关系图:

        

       如何使用eureka服务?

        在SpringCloud项目加入eureka服务依赖(不用添加版本号,会自动选择最佳版本号):

    <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>SpingCloudDemo</artifactId>
            <groupId>org.example</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>springCloud</artifactId>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
                <version>1.5.9.RELEASE</version>
            </dependency>
    
    
            <!--eureka服务端依赖-->
           <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
            </dependency>
    
            <!--eureka客户端依赖-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            </dependency>
    
        </dependencies>
        <!--SpringCloud的依赖-->
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-dependencies</artifactId>
                    <version>Finchley.SR2</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
    </project>

        在SpringCloud的项目文件application.yml文件中加入配置

    server:
      port: 3000
    eureka:
      server:
        enable-self-preservation: false  #关闭自我保护机制
        eviction-interval-timer-in-ms: 4000 #设置清理间隔(单位:毫秒 默认是60*1000)
      instance:
        hostname: localhost
    
    
      client:
        registerWithEureka: false #不把自己作为一个客户端注册到自己身上
        fetchRegistry: false  #不需要从服务端获取注册信息(因为在这里自己就是服务端,而且已经禁用自己注册了)
        serviceUrl:
          defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka

        然后在spring-boot启动项目上 加入注解:@EnableEurekaServer 就可以启动项目了

        

         然后访问我们的eureka服务:http://localhost:3000/

        

          出现这个界面说明配置成功,这个警告只是说你把他的自我保护机制关闭了

        接下来配置eureka的客户端:

        相同的方法创建一个module模块(这里是springCloudUser),加入依赖,配置信息:

        

    server:
      port: 6000
    eureka:
      client:
        serviceUrl:
          defaultZone: http://localhost:3000/eureka/  #eureka服务端提供的注册地址 参考服务端配置的这个路径
      instance:
        instance-id: power-1 #此实例注册到eureka服务端的唯一的实例ID
        prefer-ip-address: true #是否显示IP地址
        leaseRenewalIntervalInSeconds: 10 #eureka客户需要多长时间发送心跳给eureka服务器,表明它仍然活着,默认为30 秒 (与下面配置的单位都是秒)
        leaseExpirationDurationInSeconds: 30 #Eureka服务器在接收到实例的最后一次发出的心跳后,需要等待多久才可以将此实例删除,默认为90秒
    
    spring:
      application:
        name: server-power #此实例注册到eureka服务端的name

        在启动项上加入注解@EnableEurekaClient

        

          启动完项目后,我们重新访问:http://localhost:3000/

        这里我们能看见 名字叫server-power的(图中将其大写了) id为 power-1的服务 注册到我们的Eureka上面来了 至此,一个简单的eureka已经搭建好了。

        

     5.eureka集群

      eureka集群原理:

        服务启动后向Eureka注册,Eureka Server会将注册信息向其他Eureka Server行同步,当服务消费者要调用服务提供者,则向服务注册中心获取服务提供者地址,然后会将服务提供者地址缓存在本地,下次再调用时,则直接从本地缓存中取,完成一次调用。

       eureka集群配置:

        刚刚我们了解到 Eureka Server会将注册信息向其他Eureka Server进行同步 那么我们得声明有哪些server呢?

        这里 假设我们有3个Eureka Server 如图:

         

         具体配置:

    server:
      port: 3000
    eureka:
      server:
        enable-self-preservation: false
        eviction-interval-timer-in-ms: 4000
      instance:
        hostname: eureka3000.com
    
    
      client:
        registerWithEureka: false
        fetchRegistry: false
        serviceUrl:
          defaultZone: http://eureka3001.com:3001/eureka,http://eureka3002.com:3002/eureka#这里不用注册自己,默认自己是注册自己的

      修改host文件,进行映射配置(根据情况配置,如果不配置,就直接写IP地址也行,这里只是模拟一下域名解析过程):

       127.0.0.1  eureka3000.com
       127.0.0.1  eureka3001.com
       127.0.0.1  eureka3002.com

      eureka服务不用注册自己:

        eureka的server会把自己的注册信息与其他的server同步,所以这里我们不需要注册到自己身上,因为另外两台服务器会配置本台服务器。

      当三台eureka配置好之后,全部启动一下就可以看见效果了。

      我们这里仅仅是把服务端配置好了, 那客户端怎么配置呢?

      在客户端的配置文件中配置集群服务:

    client:
        serviceUrl:
            defaultZone: http://localhost:3000/eureka/,http://eureka3001.com:3001/eureka,http://eureka3002.com:3002/eureka

      原来是注册到那一个地址上面,现在是要写三个eureka注册地址,但不是代表他会注册三次,因为我们eureka server的注册信息是同步的,这里只需要注册一次就可以了,但是为什么要写三个地址呢。因为这样就可以做到高可用的配置:打个比方有3台服务器。但是突然宕机了一台, 但是其他2台还健在,依然可以注册我们的服务,换句话来讲, 只要有一台服务还建在,那么就可以注册服务。

    6.CAP定理的含义:

      

      1998年,加州大学的计算机科学家 Eric Brewer 提出,分布式系统有三个指标。

      Consistency   --- 一致性

        "一致性"。意思是,写操作之后的读操作,必须返回该值。

      Availability   --- 可用性

        "可用性",意思是只要收到用户的请求,服务器就必须给出回应。

      Partition tolerance  --- 分区容错性

        分区容错的意思是,区间通信可能失败。比如,一台服务器放在本地,另一台服务器放在外地(可能是外省,甚至是外国),这就是两个区,它们之间可能无法通信。

        一般来说,分区容错无法避免,因此可以认为 CAP 的 P 总是成立。

      他们第一个字母分别是C,A,P,Eric Brewer 说,这三个指标不可能同时做到。这个结论就叫做 CAP 定理

    7.eureka和zookeeper的对比:

      Zookeeper在设计的时候遵循的是CP原则,即一致性,Zookeeper会出现这样一种情况,当master节点因为网络故障与其他节点失去联系时剩余节点会重新进行leader选举,问题在于,选举leader的时间太长:30~120s,且选举期间整个Zookeeper集群是不可用的,这就导致在选举期间注册服务处于瘫痪状态,在云部署的环境下,因网络环境使Zookeeper集群失去master节点是较大概率发生的事情,虽然服务能够最终恢复,但是漫长的选举时间导致长期的服务注册不可用是不能容忍的。

       Eureka在设计的时候遵循的是AP原则,即可用性。Eureka各个节点(服务)是平等的, 没有主从之分,几个节点down掉不会影响正常工作,剩余的节点(服务) 依然可以提供注册与查询服务,而Eureka的客户端在向某个Eureka注册或发现连接失败,则会自动切换到其他节点,也就是说,只要有一台Eureka还在,就能注册可用(保证可用性), 只不过查询到的信息不是最新的(不保证强一致),除此之外,Eureka还有自我保护机制,如果在15分钟内超过85%节点都没有正常心跳,那么eureka就认为客户端与注册中心出现了网络故障,此时会出现以下情况:

        1: Eureka 不再从注册列表中移除因为长时间没有收到心跳而过期的服务。

        2:Eureka 仍然能够接收新服务的注册和查询请求,但是不会被同步到其它节点上(即保证当前节点可用)

        3: 当网络稳定后,当前实例新的注册信息会被同步到其它节点中

  • 相关阅读:
    关于版权
    简易的命令行入门教程:
    安卓图标
    Flutter 第一次运行就出现白屏的问题
    解决应用白屏
    main.dart
    Hello World
    Flutter学习指南:UI布局和控件
    Flutter
    编译环境与生成环境的JDK版本不一样,报 java util zip ZipException error in op
  • 原文地址:https://www.cnblogs.com/wk-missQ1/p/13292664.html
Copyright © 2011-2022 走看看