前几天鲁班LB跟我说:你玩把游戏都要半个钟啦,为何不用这时间来看看书,如果涨工资还可以帮我买个皮肤。

  面对如此合理的这需求,但我不以为然,事实上并不是我不想学习,而是 ↓

  

  实力不允许呀~

  直到有一天,突然被叫到会议室,心里疙瘩一下,这难道?项目出严重Bug了,冷静的我思索片刻后,很快就会否定了这种想法,结果巴拉巴拉2小时后,结论竟然是说:“现在我们这个项目要求重构,需用使用微服务架构,所以不了解相关技术的同事请利用这段时间学习复习一下,下个月要开始进入开发阶段。

  呵呵,会议上,总是有人把微服务吹的很厉害似的,我笑而不语,于是

  

  一周后

  

  

  以下是我的笔记,我一般是带着问题去学习,有了需求,或者说是好奇心,因为这样学习的效率会更高

  当看到我们架构中有Eureka,我的第一个问题自然就是:做微服务为什么要使用Eureka,或者Eureka能够帮助我们解决什么样的问题?

  对于微服务的概念有经验的开发人员的一般都听说过吧,无非就是把大应用拆分为小应用,然后处理好服务的相互通讯即可,但是如果光启动微服务时,不启动eureka,其他微服务也是可以通过Nginx反向代理,用rest的方式从不同服务后台获取到数据(HTTP直怼),那多个eureka服务岂不是多此一举吗?细想一下其实并不是的,我觉得原因有如下:

  其一:

  如果后端微服务之间,有互相通信,那么在负载均衡时,相同的服务肯定会启动多个,而且使用不同的端口,这个时候,服务之间就可以通过注册在eureka中的名称来找到对方,而不是根据IP+端口号去找对方。反之如果后端微服务之间相互通信,都要知道具体的IP和端口,那开发起来十分麻烦,而IP地址也并不是固定不变的,除非使用域名封装,所以无论是测试还是开发还是上线都存在问题。

  其二:

  Eureka注册中心的作用很大的程度是作用于服务发现和服务心跳,在多个注册中心的时候,依赖于zuul的负载均衡,保证异常的服务停止,正常的服务加载,保证服务的稳定性。

  新手可能不理解这说的是什么意思,没关系,请往下看,首先我们先说说什么是SpringCloud

  SpringCloud是一系列框架的有序集合。它利用SpringBoot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、 熔断器、数据监控等,都可以用SpringBoot的开发风格做到一键启动和部署。是一套简单易懂、易部署和易维护的分布式系统开发工具包。

  主要组成如下:

  •   服务发现——Netflix Eureka                      服务调用——Netflix Feign
  •   熔断器——Netflix Hystrix                          服务网关——Netflix Zuul
  •   分布式配置——Spring Cloud Config         消息总线 —— Spring Cloud Bus

  

  本文主要介绍Eureka注册中心

  组成原理:

  Eureka包含两个组件: Eureka Server和Eureka Client:

  Eureka Server提供服务注册服务,各个Client节点启动后,会在Eureka Server中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到。

  Eureka Client是一个java客户端,用于简化与Eureka Server的交互,客户端有一个内置的、使用轮询(round-robin)负载算法的负载均衡器。在应用启动后,将会向Eureka Server发送心跳,默认周期为30秒,如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,Eureka Server将会从服务注册表中把这个服务节点移除(默认90 秒)。如果Eureka Server做了集群,Eureka Server之间通过复制的方式完成数据的同步,同时Eureka还提供了客户端缓存机制,即使所有的Eureka Server都挂掉,客户端依然可以利用缓存中的信息消费其他服务的API。

  综上,Eureka能够通过心跳检查、客户端缓存等机制,确保了系统的高可用性。

  问题:同为注册中心,Eureka要比Zookeeper好在哪,或者说为什么Cloud为什么不集成Zookeeper,在CAP理论中说道,一个分布式系统不可能同时满足C(一致性)、A(可用性)和P(分区容错性)。由于分区容错性在是分布式系统中必须要保证的,因此我们只能在A和C之间进行权衡。我们从需求出发考虑,当向注册中心查询服务列表时,我们可以容忍注册中心返回的是几分钟以前的注册信息,但不能接受服务直接down掉不可用。也就是说,对于服务注册功能对可用性的要求要高于一致性。

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

  而在此Zookeeper保证的是CP, 而Eureka则是AP,显然Eureka更加合适。

  但在默认配置中,Eureka Server在默认90s没有得到客户端的心跳,则注销该实例,但是往往因为微服务跨进程调用,网络通信往往会面临着各种问题,比如微服务状态正常,但是因为网络分区故障时,Eureka Server注销服务实例则会让大部分微服务不可用,这很危险,因为服务明明没有问题。为了解决这个问题,Eureka 有自我保护机制,通过在Eureka Server配置参数,可启动保护机制它的工作原理是:当Eureka Server节点在短时间内丢失过多的客户端时(可能发送了网络故障),那么这个节点将进入自我保护模式,不再注销任何微服务,当网络故障回复后,该节点会自动退出自我保护模式。

  实战:

  Eureka服务端开发(非常简单的3步完成)

  1.从官网下载脚手架项目https://start.spring.io/

  2.修改一下配置文件

  3.启动,本质上也是一个SpringBoot项目

  

  把下载好的Demo导入编译器,打开application.properties或 .yml配置文件

  

  1. #配置端口
  2. server:
  3. port: 8761 #服务端口
    #配置服务名称
    spring:
      application:
        name: service-name
  4. #是否将自己注册到Eureka服务中,本身就是服务端,所以无需注册
    #是否从Eureka中获取注册信息
    #客户端和服务端交互地址
  5. eureka:
  6. client:
  7. registerWithEureka: false
  8. fetchRegistry: false
  9. serviceUrl:
  10. defaultZone: http://127.0.0.1:${server.port}/eureka/

  配置启动类

  1. @SpringBootApplication
    //加入注解,声明为服务端
  2. @EnableEurekaServer
  3. public class EurekaServer {
  4. public static void main(String[] args) {
  5. SpringApplication.run(EurekaServer.class, args);
  6. }
  7. }

  上图为Eureka服务端启动成功,可视化界面,Application表示当前并无客户端用户注册进来,这里说的客户端就是我们开发的微服务应用

  Eureka客户端开发(其实就是我们真正业务微服务应用)

  1.从官网下载脚手架项目https://start.spring.io/

  2.修改一下配置文件

  1. #配置端口
    server:
      port:1111
    #配置服务名称
    spring:
      application:
        name : client-name
    #配置服务器路径
    eureka:
  2. client:
  3. serviceurl:
  4. defaultZone: http://localhost:8761/eureka
  5. instance:
  6. preferipaddress: true

  启动类配置

  1. //加入注解,声明为微服务客户端,项目启动后自动向服务端注册
    @EnableDiscoveryClient
  2. @SpringBootApplication
  3. public class ServiceProviderApplication {
  4.  
  5. public static void main(String[] args) {
  6. SpringApplication.run(ServiceProviderApplication.class, args);
  7. }
  8. }

  启动后就能在服务端可视化界面看见客户端的注册信息,我们现在就将所有的微服务都注册到Eureka中,这样所有的微服务之间都可以互相调用,服务的调用将在下一篇文章详细讲解

  

  但是有时候会出现下面的文字

  

  说明Eureka已经进入了保护模式:

  Eureka Server在运行期间,会统计心跳失败的比例在15分钟之内是否低于85%,如果出现低于的情况(在生产环境上通常是由于网络不稳定导致),Eureka Server会将当前的实例注册信息保护起来,同时提示这个警告。保护模式主要用于一组客户端和Eureka Server之间存在网络分区场景下的保护。一旦进入保 护模式,Eureka Server将会尝试保护其服务注册表中的信息,不会注销任何微服务。

  

  关于Eureka Server集群的介绍

  Eureka注册中心只部署在一台机器上,一旦出现问题,会导致整个服务调用系统的崩溃,针对这种情况,我们需要部署两台Eureka注册中心,彼此相互注册,组成一个高可用的的Eureka集群。这样一来,每台服务器都包含着对方的服务注册信息,相当于双机热备,同时,服务提供者只需向其中的一个注册服务。

  在生产环境中,一般是把两个相互注册的服务器安装在两台服务器上,现在我们在一台机器上模拟双服务器的场景,具体的实现步骤如下:

  到C:\WINDOWS\system32\drivers\etc目录里,找到hosts文件,在其中加入两个机器名(其实都是指向本机),代码如下。修改后,需要重启机器。

127.0.0.1      erueka-server

127.0.0.1      erueka-server2

  配置如下

Eureka service

  1. server:
  2. port: 8761 #端口号
    spring:
      application:
        name: eureka-server #应用名
  3. eureka:
  4. instance:
  5. hostname: hostname1
  6. client:
  7. register-with-eureka: true
  8. fetch-registry: true
  9. service-url:
  10. defaultZone: http://hostname1:8761/eureka/,http://hostname2:8762/eureka/

Eureka service2

  1. server:
  2. port: 8762 #端口号
  3. spring:
  4.   application:
  5.     name: eureka-server2 #应用名
  6.  
  7. eureka:
  8. instance:
  9. hostname: hostname2
  10. client:
  11. register-with-eureka: true
  12. fetch-registry: true
  13. service-url:
  14. defaultZone: http://hostname1:8761/eureka/,http://hostname2:8762/eureka/

  这样下来,就算有一台机器死机了,然后可让服务正常工作。

那些年,想和你一起认识的SpringCloud Eureka的更多相关文章

  1. springcloud(五):熔断监控Hystrix Dashboard和Turbine

    Hystrix-dashboard是一款针对Hystrix进行实时监控的工具,通过Hystrix Dashboard我们可以在直观地看到各Hystrix Command的请求响应时间, 请求成功率等数 ...

  2. 使用Sidecar将Node.js引入Spring Cloud

    网上看到的一篇文章,觉得写得挺好,现转载于此,以方便需要的网友查阅. 该文章介绍了非JAVA语言提供的应用集成到Spring Cloud的这样一个实现,以便我们使用其他语言作为参考. 感谢原作者分享, ...

  3. SPRINGCLOUD 开发学习记录

    一个简单的微服务系统:服务注册和发现,服务消费,负载均衡,断路器,智能路由,配置管理 服务注册中心: eureka是一个高可用组件,没有后端缓存,每一个实例注册后向注册中心发送心跳,默认情况下,eru ...

  4. Spring Cloud Eureka 常用配置详解,建议收藏!

    前几天,栈长分享了 <Spring Cloud Eureka 注册中心集群搭建,Greenwich 最新版!>,今天来分享下 Spring Cloud Eureka 常用的一些参数配置及说 ...

  5. 外行人都能看懂的SpringCloud,错过了血亏!

    一.前言 只有光头才能变强 认识我的朋友可能都知道我这阵子去实习啦,去的公司说是用SpringCloud(但我觉得使用的力度并不大啊~~)... 所以,这篇主要来讲讲SpringCloud的一些基础的 ...

  6. SpringCloud(1)---基于RestTemplate微服务项目案例

    基于RestTemplate微服务项目 在写SpringCloud搭建微服务之前,我想先搭建一个不通过springcloud只通过SpringBoot和Mybatis进行模块之间额通讯.然后在此基础上 ...

  7. spring cloud(五)熔断监控Hystrix Dashboard和Turbine

    Hystrix-dashboard是一款针对Hystrix进行实时监控的工具,通过Hystrix Dashboard我们可以在直观地看到各Hystrix Command的请求响应时间, 请求成功率等数 ...

  8. Spring Cloud 入门教程(八): 断路器指标数据监控Hystrix Dashboard 和 Turbine

    1. Hystrix Dashboard (断路器:hystrix 仪表盘)  Hystrix一个很重要的功能是,可以通过HystrixCommand收集相关数据指标. Hystrix Dashboa ...

  9. spring cloud Hystrix监控面板Hystrix Dashboard和Turbine

    我们提到断路器是根据一段时间窗内的请求情况来判断并操作断路器的打开和关闭状态的.而这些请求情况的指标信息都是HystrixCommand和HystrixObservableCommand实例在执行过程 ...

随机推荐

  1. 把VSCode配置成C/C++开发IDE

    工作一年多了,大学学的数据结构和算法都忘得差不多了.于是想补补数据结构知识,并且刷一下剑指offer的一些面试题.首要问题就是装个C语言的运行环境,大学学C语言和C++的时候都是用的VC++6.0或者 ...

  2. scala class中孤立代码块揭秘

    在 scala class中,经常会有很多的代码块需要执行,它们不在任何方法中,只是孤立的代码块. 案例: class Tester(val name:String, num:Integer) { p ...

  3. Demo小细节

    (1) 程序如下: public class Example { static int i = 1, j = 2; static { display(i); i = i + j; } static v ...

  4. 33 | 无实例无真相:基于LoadRunner实现企业级服务器端性能测试的实践(下)

  5. Linux系统:centos7下安装Jdk8、Tomcat8、MySQL5.7环境

    一.JDK1.8 环境搭建 1.上传文件解压 [root@localhost mysoft]# tar -zxvf jdk-8u161-linux-x64.tar.gz [root@localhost ...

  6. mysql 终端命令

    1.打开数据库 /usr/local/MySQL/bin/mysql -u root -p 2.输入root密码 3.使用我的数据库 use mysql 4.查看表 desc table_name 5 ...

  7. 爬取链家网租房图 使用ImagesPipeline保存图片

    # 爬虫文件 # -*- coding: utf-8 -*- import scrapy import os from urllib import request from lianjia.items ...

  8. 从零开始实现放置游戏(十)——实现战斗挂机(1)hessian服务端搭建

    前面实现RMS系统时,我们让其直接访问底层数据库.后面我们在idlewow-game模块实现游戏逻辑时,将不再直接访问底层数据,而是通过hessian服务暴露接口给表现层. 本章,我们先把hessia ...

  9. 孰能巧用 Spring Cloud 服务注册中心Eureka

    Eureka介绍 在Spring Cloud Netflix 整合技术栈中,Eureka既可以作为服务注册中心也可以用于服务发现对整个微服务架构起着最核心的整合作用. Eureka是基于REST(Re ...

  10. Docker学习第二天-容器

    Docker 容器 容器是 Docker 又一核心概念. 简单的说,容器是独立运行的一个或一组应用,以及它们的运行态环境.对应的,虚拟机可以理解为模拟运行的一整套操作系统(提供了运行态环境和其他系统环 ...