5

烟花散尽13141的个人空间

 3 years ago
source link: https://my.oschina.net/kwx870775401/blog/5020371
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

[TOC]

分布式是现在互联网架构的首选。在分布式中我们会有三方理论简称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满足了高可用性原则。及时客户端真的宕机了也要留下。宁可多留也不错杀。这样就会导致数据不一致的情况。

点我下载


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK