分布式是现在互联网架构的首选。在分布式中我们会有三方理论简称CAP

简称 全称 解释
C Consistency 数据一致性
A Availability 可用性,性能
P Partition tolerance 分区容错性

> 今天我们就来看看分布式中关于服务治理这块的服务

什么是服务治理

  • 在多个服务之间相互调用的时候比较零散,管理起来比较麻烦。当被调用者有所改动可能都会牵扯到调用者的修改。所以服务治理应运而生。

  • spring cloud的Eureka实现了服务注册、服务调用、负载均衡、容错。这也是服务治理模块通用功能。

  • 服务注册和服务调用在eureka看来都是客户端。eureka服务是服务端。所以他是一种典型的CS架构。eureka客户端需要与eureka服务保持心跳机制。这样eureka服务才会认为客户端没有宕机。

  • 上述的架构图可以清楚的看出,eureka服务端可集群化,服务提供者可以集群化。客户端就没必要集群化。就算集群化对于eureka服务来说也是单机的consumer。

Eureka调用过程

  • service provider启动时会将自己服务的信息封装后注册到eureka注册中心上。service consumer已provider注册名去注册中心寻找到真实地址并进行调用。

  • 针对service provider的管理对于service consumer来说不需要知道service provider的具体信息。只需要知道service provider的注册名就行了。在我们集群化后也不用担心provider我们具体的调用地址。负载均衡也是eureka帮我分配了。我们客户端只负责接口的调用。

Eureka单机注册

Eureka 单机启动

  • 这里我们不做spring其他的解释,详细请看git分支详细代码

点我下载源码


<dependency>
<groupid>org.springframework.cloud</groupid>
<artifactid>spring-cloud-starter-netflix-eureka-server</artifactid>
</dependency>
  • 在我们新建的项目中pom文件中新增如上gva。就会将eureka服务端功能注入。下面我们只需要添加一些配置启动就行了。

  • 添加依赖后我们在springboot项目中yml中添加如下配置


eureka:
instance:
hostname: localhost
client:
register-with-eureka: false #表示该模块作为eureka服务,自己是不需要想自己注册的,注册了只是徒增烦恼
fetch-registry: false # 表示自己就是注册中心。自己是管理者不是被管理者。
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
  • 最后我们在spiringboot启动类上开启eurekaserver就行了。@EnableEurekaServer

  • 能够访问说明我们的eureka服务正常启动。现在没有客户端注册上来。所以现在看到DS Replicas列表是空的。

单机注册

  • 上面我们已经单机启动了eureka服务。下面我们看看服务注册是否可以。我们已之前payment模块为例。

  • pom中添加client坐标


<dependency>
<groupid>org.springframework.cloud</groupid>
<artifactid>spring-cloud-starter-netflix-eureka-client</artifactid>
</dependency>
  • yml中填入地址

eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://localhost:7001/eureka
  • 主启动类上添加注解@EnableEurekaClient

集群注册

  • 现在我们多开几个payment进行注册

  • 因为我们是在idea中开发的。还没有打成jar包。也是为了方便调试这里通过idea直接复制的payment项目



  • 现在我们看看我们本地idea启动项目的情况 , payment已经有两个了分别是8001,8002

  • 现在我们看到eureka服务上也出现了8001,8002了

客户调用

  • 还记得我们的feature/cloud-pre上order模块是如何调用payment的吗。是的我们通过resetTemplate进行http方式调用的。现在我们还是通过他进行调用只不过调用地址是payment注册在eureka上的服务名。

  • 这里客户端如何注册和payment配置一样的。因为虽然是order调用payment,但是对于eureka来说payment和order都是客户端。所以配置都是一样的。

  • 现在在单机的eureka上我们看到了单机的order服务和集群的payment服务。下面我们order调用payment的地方做如下修改

  • 只是调用跟地址进行了修改。当然前提是restTemplate支持了负载均衡。

  • 下面结果如何读者可以自行测试了。http://localhost/order/getpayment/123针对这个接口调用多次。会发现返回结果里的服务端口会不断的8001,8002切换。因为restTemplate默认是轮询的。而我们这里payment提供了两个服务。到这里我们就实现了eureka单机版的服务注册及调用

Eureka集群注册

  • 上面是单机的eurake。下面我们看看eurake集群如何配置。对于eureka客户端来说注册到eureka集群上来说非常简单。

eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://localhost:7001/eureka,http://www.eureka2/eureka
  • 像上述一样defaultZone后面直接追加eureka服务就行了。正常集群都是布置在不同机器上的。所以域名或者ip都是不同的。如果读者在一台机器上部署可以通过nginx将不同服务分配到不同域名下。因为在eureka服务端上配置需要用到域名。

  • 客户端是直接追加。eureka服务端改动也不是很多只需要将hostname配置唯一就行了。


eureka:
instance:
hostname: www.zxhtom1.com #eureka服务端的实例名字
client:
register-with-eureka: false #表识不向注册中心注册自己
fetch-registry: false #表示自己就是注册中心,职责是维护服务实例,并不需要去检索服务
service-url:
defaultZone: http://eureka7002.com:7002/eureka/
  • 所以说如果是单机部署集群,我们就需要通过nginx转发下。这里不赘述

idea 如何同一个项目启动多次

  • 刚才在部署集群的时候为了方便演示。我们借助idea启动多个实例。在里面分配不同的端口。但是在部署eureka集群是就没法搞了。因为需要改变配置文件内容。我们可以在启动的时候指定外部配置文件

Eureka自我保护

为什么要自我保护

  • 上面我们发现有两个8002的payment。为什么会出现如此奇怪的问题呢。排查发现一开始我通过idea启动了8001,8002。然后我又通过引入外部配置文件的方式重新启动了8002。这个时候原来的8002实例其实已经挂了。这个时候eureka会认为出现50%的客户端没有准时发送心跳。50<85 这个时候eureka认为大批客户端可能因为网络波动导致没有及时回复。eureka会开启自我保护机制。
  • 虽然上面是个反面列子。也恰恰说明了为什么需要自我保护。加入这个时候8002在其他机器上因为网络延迟被踢出就会出现冤假错案。所以这也解释了为什么上述出现两个8002.

如何开启自我保护

  • 自我保护的功能是默认开启的。eureka.server.enable-self-preservation: false 我们通过此属性设置false就是关闭自我保护。

自我保护如何激活

  • 其实上面两个8002是一种意外。我们无意中触发了自我保护。

  • 自我保护机制条件 : 最近一分钟收到心跳数线程占总线程85%以下。

  • 低于85%说明没有指定活跃数进行心跳回复,所以认为是网络波动了。

  • 自我保护的临界值= renews(last min)/renews(threshold)

  • 通过计算我们知道是75% 。 如果不算上正常的8002 。 那就是50% 。 所以不管怎么样都会触发自我保护的。

  • 自我保护也满足的开篇提到的CAP原理中的A理论。eureka满足了高可用性原则。及时客户端真的宕机了也要留下。宁可多留也不错杀。这样就会导致数据不一致的情况。

上述源码

点我下载

老板让我重构项目,我想首先应该服务治理---eureka服务治理深入浅出的更多相关文章

  1. vue-cli脚手架构建了项目,想去除Eslint验证,如何设置?

    vue-cli脚手架构建了项目,想去除Eslint验证,如何设置? 在webpack.base.conf.js里面删掉下面: preLoaders: [ { test: /\.vue$/, loade ...

  2. iOS重构项目之路

    iOS重构项目之路 1.整理目录 按照功能模块对整个工程的目录进行分类,比如 2.整理资源文件 删除多余的图片文件,资源文件 图片资源尽量添加到Assets.xcassets中 删除项目中未引用的图片 ...

  3. Chris Richardson微服务翻译:重构单体服务为微服务

    Chris Richardson 微服务系列翻译全7篇链接: 微服务介绍 构建微服务之使用API网关 构建微服务之微服务架构的进程通讯 微服务架构中的服务发现 微服务之事件驱动的数据管理 微服务部署 ...

  4. 【spring cloud】子模块module -->导入一个新的spring boot项目作为spring cloud的一个子模块微服务,怎么做/或者 每次导入一个新的spring boot项目,IDEA不识别子module,启动类无法启动/右下角没有蓝色图标

    如题:导入一个新的spring boot项目作为spring cloud的一个子模块微服务,怎么做 或者说每次导入一个新的spring boot项目,IDEA不识别,启动类无法启动,怎么解决 下面分别 ...

  5. 【CuteJavaScript】Angular6入门项目(4.改造组件和添加HTTP服务)

    本文目录 一.项目起步 二.编写路由组件 三.编写页面组件 1.编写单一组件 2.模拟数据 3.编写主从组件 四.编写服务 1.为什么需要服务 2.编写服务 五.引入RxJS 1.关于RxJS 2.引 ...

  6. “快的打车”创始人陈伟星的新项目招人啦,高薪急招Java服务端/Android/Ios 客户端研发工程师/ mysql DBA/ app市场推广专家,欢迎大家加入我们的团队! - V2EX

    "快的打车"创始人陈伟星的新项目招人啦,高薪急招Java服务端/Android/Ios 客户端研发工程师/ mysql DBA/ app市场推广专家,欢迎大家加入我们的团队! - ...

  7. C#创建控制台项目引用Topshelf的方式,部署windows服务。

    上一篇是直接创建windows service服务来处理需求.调试可能会麻烦一点.把里面的逻辑写好了.然后受大神指点,用Topshelf会更好一些. 来公司面试的时候问我,为什么要用stringbui ...

  8. python-django项目-每次重启电脑需要启动的虚拟机服务_20191124

    python-django项目-每次重启电脑需要启动的虚拟机服务 看来第一步是确定虚拟机的ip问题,必须要是192.168.100.128,否则很多的配置都不能用了, 所以要配置虚拟机的ip, 第一步 ...

  9. MVC3+EF4.1学习系列(八)-----利用Repository and Unit of Work重构项目

    项目最基础的东西已经结束了,但是现在我们的项目还不健全  不利于测试 重复性代码多   层与层之间耦合性高  不利于扩展等问题.今天的这章 主要就是解决这些问题的.再解决这些问题时,自己也产生了很多疑 ...

随机推荐

  1. Ignatius and the Princess III HDU - 1028

    题目传送门:https://vjudge.net/problem/HDU-1028 思路:整数拆分构造母函数的模板题 1 //#include<bits/stdc++.h> 2 #incl ...

  2. 6、MyBatis教程之日志实现

    7.日志实现 思考:我们在测试SQL的时候,要是能够在控制台输出 SQL 的话,是不是就能够有更快的排错效率? 如果一个 数据库相关的操作出现了问题,我们可以根据输出的SQL语句快速排查问题. 对于以 ...

  3. Apache Hudi:CDC的黄金搭档

    1. 介绍 Apache Hudi是一个开源的数据湖框架,旨在简化增量数据处理和数据管道开发.借助Hudi可以在Amazon S3.Aliyun OSS数据湖中进行记录级别管理插入/更新/删除.AWS ...

  4. Linux 软链接link/ln -s

    在Linux中,链接分为软的和硬的,至于两者之间有什么差别,大家可以参考下https://www.ibm.com/developerworks/cn/linux/l-cn-hardandsymb-li ...

  5. .Net Core 路由处理

    用户请求接口路由,应用返回处理结果.应用中如何匹配请求的数据呢?为何能如此精确的找到对应的处理方法?今天就谈谈这个路由.路由负责匹配传入的HTTP请求,将这些请求发送到可以执行的终结点.终结点在应用中 ...

  6. day-01-初识Python与条件判断

    cpu 内存 硬盘 操作系统 cpu:计算机的运算和计算中心,相当于人类大脑.飞机 ​ 内存:暂时存储数据,临时加载数据应用程序,4G,8G,16G,32G ​ 速度快,高铁,断电即消失.造价很高 ​ ...

  7. Python基础(十四):while循环与break、continue关键字

    前面我们已经学习了for循环,今天再带着大家讲述一下while循环.那么for循环和while循环,到底有什么区别呢? Python中for循环和while循环本质上是没有区别的,但是在实际应用上,针 ...

  8. 如何快速搭建自己的ERP系统,4步源码快速安装odoo教程

    上一篇内容:了解什么是Odoo,为二次开发做准备 1.下载odoo源码 Github地址:https://github.com/odoo/odoo Gitee地址:https://gitee.com/ ...

  9. Java(279-298)【异常、线程】

    1.异常的概念&异常的体系 异常,就是不正常的意思.在生活中:医生说,你的身体某个部位有异常,该部位和正常相比有点不同,该部位的功能将 受影响.在程序中的意思就是: 异常 :指的是程序在执行过 ...

  10. 【NCRE】三级网络技术 选择题易错点记录(1)

    部分易错点 连接到一个集线器的多个节点不能同时发送数据帧 嵌入式安装插座用来连接双绞线 异步串行端口 PPP 同步串行端口 PPP/HPLC 对于频繁改变位置并使用DHCP获取IP地址的DNS客户端, ...