zoukankan      html  css  js  c++  java
  • 01-springcloud和eureka

    这是本人自己记录的springcloud知识,相应源码在https://github.com/shijingfeng/spring-cloud-actual.git

    一 什么是 Spring Cloud

    Spring Cloud,基于 Spring Boot 提供了一套微服务解决方案,包括服务注册与发现,配置中心,全链路监 控,服务网关,负载均衡,熔断器等组件,除了基于NetFlix的开源组件做高度抽象封装之外,还有一些选型 中立的开源组件。

    官方译文:构建分布式系统不用特别的复杂且避免容易出现的错误。Spring Cloud为常见的分布式系统模式 提供了一个简单和可访问的编程模型,帮助开发人员构建弹性、可靠和协调的应用程序。SpringCloud构建在 SpringBoot之上,使开发人员很容易开始工作并迅速提高生产力。

    spring cloud架构图

    1 API Gateway 路由网关(Zuul)

    2 breaker dashboard  服务监控(Hystrix)

    3 service registry 服务注册(Eureka)

    4 config dashboard 配置中心(springcloud config)

    5 distributed tracing 服务跟踪(springcloud sleuth)

    6 microservices 微服务集群

    springcloud与dubbo基本的区别:

    1. spring Cloud 使用 RESTful API 实现服务之间通信
    2. Dubbo 使用 RPC (远程过程调用) 实现服务之间通信

    Eureka服务的注册与发现

    问题:系统会根据业务被拆分成了很多的微服务,微服务的信息如何管理? Spring Cloud中提供服务注册中心来管理微服务信息。

    为什么要用注册中心?

    1. 1. 微服务数量众多,要进行远程调用就需要知道服务端的ip地址和端口,注册中心帮助我们管理这些服务 的ip和端口。
    2. 2. 微服务会实时上报自己的状态,注册中心统一管理这些微服务的状态,将存在问题的服务踢出服务列 表,客户端获取到可用的服务进行调用。

    Eureka介绍

    Spring Cloud Eureka 是对Netflix公司的Eureka的二次封装,它实现了服务治理的功能,Spring Cloud Eureka 提供 Eureka Server 服务端与 Eureka Client 客户端 ,服务端即是Eureka服务注册中心,客户端完成 微服务向Eureka服务的注册与发现。

    如果没有用eureka的时候,有1000个微服务,当你要找某一个微服务时特别繁琐。eureka服务注册管理中心可以解决这种问题,客户端先去eureka服务去服务查找,获取想要的服务信息后,再去请求微服务。

    图示:

    EureKa采用C-S的设计架构,即包括了Eureka Server(服务端),EureKa client(客户端/微服务)。

     1.EureKa Server 提供服务注册,各个节点启动后,在EureKa server中进行注册;

    2 EureKa Client 是一个Java客户端,用于和服务端进行交互,同时客户端也是一个内置的默认使用轮询负载均衡算法的负载均衡器。在应用启动后,会向Eueka Server发送心跳(默认30秒)。如果EUR额卡 Server在多个心跳周期内没有接受到某个节点的心跳,EureKa Server将会从服务注册表中将这个服务移出(默认90秒)。

    Eureka server服务注册中心(单机版搭建)

    1.首先先创建一个maven项目

    2.引入eruaka服务端依赖

    3.配置application.yml文件:

    在 src/main/resources下新建application.yml文件,配置如下:

    4.创建启动类

    5.测试erueka

    访问:http://localhost:6001/ ,效果如下:

    微服务注册到服务中心

    1.配置微服务的pom文件,添加erueka客户端依赖

    2.application.yml配置

    3.修改启动类(将此服务注册到eureka)

    4.功能测试

    4.1先启动Eureka server服务

    4.2再启动eurekaclient 服务

    4.3再访问localhost:6001

    Eureka自我保护机制

    如果长时间(90秒)没有访问、监测不到心跳,或者修改实例名称,eureka启动保护机制

    eureka不会立刻删除,依旧会对该微服务的信息进行保存

    什么是自我保护机制

    当Eureka Server 在一定时间内(默认90秒)没有接收到某个微服务的心跳,Eureka Server会从服务列表将此服 务实例注销。但是如果出现网络异常情况(微服务本身是正常的),微服务与Eureka Server之间无法正常通信, 以上行为可能变得非常危险了——因为微服务本身其实是正常的,此时本不应该注销这个微服务。 Eureka Server有一种 “自我保护模式” 来解决这个问题——当Eureka Server在短时间内丢失过多客户端时(可能发 生了网络故障),此时Eureka Server会进入自保护模式,一旦进入该模式,Eureka Server就会保护服务注册表中 的信息,不再删除服务注册表中的数据(也就是不会注销任何微服务)。当网络故障恢复后,该Eureka Server会 自动退出自我保护模式。

    所以, 自我保护模式是一种应对网络异常的安全保护措施。它的架构哲学是宁可同时保留所有微服务(健康的微服 务和不健康的微服务都会保留),也不盲目注销任何健康的微服务。使用自我保护模式,可以让Eureka集群更加的 健壮、稳定。

    自我保护配置

    在开发阶段建议禁用自我保护模式,默认开启了

    在 eureka server 中配置:

     搭建集群版 Eureka Server 服务注册中心

    为了避免 Eureka Server的失效,Eureka Server 高可用环境需要部署两个及以上Eureka Server,它们互相向对方注册。如果在本机启动两个Eureka需要 注意两个Eureka Server的端口要设置不一样,如下图:

    1. 在实际使用时Eureka Server至少部署两台服务器,实现高可用。
    2. 两台Eureka Server互相注册。
    3. 微服务需要连接两台Eureka Server注册,当其中一台Eureka死掉也不会影响服务的注册与发现。
    4. 微服务会定时向Eureka Server发送心跳,报告自己的状态。
    5. 微服务从注册中心获取服务地址以RESTful方式发起远程调用

    创建两个Eureka Server模块

    配置 pom.xml

    将 6001 中的 pom.xml 依赖复制到 6002 模块中

    1 <dependency>
    2     <groupId>org.springframework.cloud</groupId>
    3     <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    4 </dependency>

    主启动类

    将 6001 中的主启动类 复制到 6002 模块中,并将类名重命名。

    IP与域名绑定

    1.找到 C:WindowsSystem32driversetc 目录下的hosts文件

    2.IP与域名绑定进hosts文件

    Eureka Server组成高可用,两个Eureka Server互相向对方注册,这里需要通过域名访问,这里我们设置两个Eureka Server的域名分别为 eureka6001.com、eureka6002.com。

    127.0.0.1 eureka6001.com 
    
    127.0.0.1 eureka6002.com

    application.yml

    6001

    server:
      port: 6001 # 服务端口
    
    eureka:
      instance:
        hostname: eureka6001.com # eureka服务端的实例名称
      client:
        registerWithEureka: false # 服务注册,false表示不将自已注册到Eureka服务中
        fetchRegistry: false # 服务发现,false表示自己不从Eureka服务中获取注册信息
        serviceUrl:    # Eureka客户端与Eureka服务端的交互地址,集群版配置对方的地址,单机版配置自己(如果不配置则默认本机8761端口)
          #defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
          #集群版
          defaultZone: http://eureka6002.com:6002/eureka/
      server:
        enable-self-preservation: false # 禁用自我保护机制
    

      

    6002

    server:
      port: 6002 # 服务端口
    
    eureka:
      instance:
        hostname: eureka6002.com # eureka服务端的实例名称
      client:
        registerWithEureka: false # 服务注册,false表示不将自已注册到Eureka服务中
        fetchRegistry: false # 服务发现,false表示自己不从Eureka服务中获取注册信息
        serviceUrl:    # Eureka客户端与Eureka服务端的交互地址,集群版配置对方的地址,单机版配置自己(如果不配置则默认本机8761端口)
          #defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
          #集群版
          defaultZone: http://eureka6001.com:6001/eureka/
      server:
        enable-self-preservation: false # 禁用自我保护机制
    

      

    服务提供着注册到eureka中

    修改 8001 中的 application.yml 文件

    server:
      port: 8001
    
    mybatis:
      config-location: classpath:mybatis/mybatis.cfg.xml        # mybatis配置文件所在路径
      type-aliases-package: com.sjf # 所有Entity别名类所在包
      mapper-locations: classpath:mybatis/mapper/**/*.xml       # mapper映射文件
    
    spring:
      #应用名称
      application:
        name: server02-product #这个很重要,这在以后的服务与服务之间相互调用一般都是根据这个name
      #连接数据库设置
      datasource:
        type: com.alibaba.druid.pool.DruidDataSource            # 当前数据源操作类型
        driver-class-name: com.mysql.cj.jdbc.Driver             # mysql驱动包
        url: jdbc:mysql://127.0.0.1:3306/springcloud_db01?serverTimezone=GMT%2B8  # 数据库名称
        username: root
        password: 123456
        dbcp2:
          min-idle: 5                                # 数据库连接池的最小维持连接数
          initial-size: 5                            # 初始化连接数
          max-total: 5                               # 最大连接数
          max-wait-millis: 150                       # 等待连接获取的最大超时时间
    
    eureka:
      client:
        registerWithEureka: true # 服务注册开关
        fetchRegistry: true # 服务发现开关
        serviceUrl: # 客户端(服务提供者)注册到哪一个Eureka Server服务注册中心,多个用逗号分隔
          defaultZone: http://eureka6001.com:6001/eureka,http://eureka6002.com:6002/eureka
      instance:
        instanceId: ${spring.application.name}:${server.port} # 指定实例ID,就不会显示主机名了
        hostname: localhost
        prefer-ip-address: true #访问路径就会显示成IP地址
    

      

    效果测试

    1. 先启动 2个 Eureka Server 集群 (6001、6002)

    2. 访问:

    http://eureka6001.com:6001/

    http://eureka6002.com:6002/

    3.再启动8001服务提供中

  • 相关阅读:
    数据结构:图 (总结)
    排序算法总结(此篇文章是14年写作,代码难看,请看我新发表的排序总结)
    no identifier specified for entity错误
    哈夫曼编码算法思想总结
    线索二叉树
    ORACLE 错误 ora-01830 解决方法
    (转)web会话管理方式
    (转)C3P0配置
    分页技术()
    简易 DBUtil 封装
  • 原文地址:https://www.cnblogs.com/whaleup/p/12493806.html
Copyright © 2011-2022 走看看