服务治理是微服务架构中最为核心和基础的模块,它主要用来实现各个微服务实例的自动化注册和发现。

体系如下:

springcloud微服务框架的日志框架怎么实现 springcloud服务治理框架_Server

Spirng Cloud Eureka使用Netflix Eureka来实现服务注册与发现。它既包含了服务端组件,也包含了客户端组件,并且服务端与客户端均采用java编写,所以Eureka主要适用于通过java实现的分布式系统,或是JVM兼容语言构建的系统。Eureka的服务端提供了较为完善的REST API,所以Eureka也支持将非java语言实现的服务纳入到Eureka服务治理体系中来,只需要其他语言平台自己实现Eureka的客户端程序。

Eureka包含两个组件:Eureka Server 和 Eureka Client:
1。Eureka Client是一个Java客户端,用于简化与Eureka Server的交互;
2。Eureka Server提供服务发现的能力,各个微服务启动时,会通过Eureka Client向Eureka Server进行注册自己的信息(例如网络信息),Eureka Server会存储该服务的信息;
3。微服务启动后,会周期性地向Eureka Server发送心跳(默认周期为30秒)以续约自己的信息。如果Eureka Server在一定时间内没有接收到某个微服务节点的心跳,Eureka Server将会注销该微服务节点(默认90秒);
4。每个Eureka Server同时也是Eureka Client,多个Eureka Server之间通过复制的方式完成服务注册表的同步;
5。Eureka Client会缓存Eureka Server中的信息。即使所有的Eureka Server节点都宕掉,服务消费者依然可以使用缓存中的信息找到服务提供者。

一:服务注册中心

1.1  创建一个eureka-server的maven工程,引入spring-cloud-starter-netflix-eureka-server的依赖

<?xml version="1.0" encoding="UTF-8"?>
 <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>parent</artifactId>
         <groupId>com.cjc.spring.cloud</groupId>
         <version>1.0-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>    <groupId>com.cjc.spring.cloud</groupId>
     <artifactId>eureka-server</artifactId>
     <version>1.0-SNAPSHOT</version>    <dependencies>
         <dependency>
             <groupId>org.springframework.cloud</groupId>
             <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
         </dependency>
     </dependencies></project>

 

1.2  application.yml中添加配置

server:
   port: 8081
 spring:
   application:
     name: eureka-service
 eureka:
   client:
     register-with-eureka: false     #false表示不向注册中心注册自己。
     fetch-registry: false           #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
     serviceUrl:
       defaultZone: http://localhost:8081/eureka/
     healthcheck:
       enabled: true

 

register-with-eureka表示是否向注册中心注册本服务,fetch-registry表示是否从服务注册中心获取服务列表。defaultZone指服务注册中心地址。微服务名称即为spring.application.name的值。

1.3  启动一个服务注册中心

 只需要在springboot工程的启动application类上加一个注解@EnableEurekaServer,启动服务后访问http://localhost:8081/。

springcloud微服务框架的日志框架怎么实现 springcloud服务治理框架_Server_02

以后微服务的注册和发现就用这个eureka服务了。

1.4  Eurake 自我保护机制

某时某刻一个微服务不可用了,Eurake 不会立即清理,依旧会对该微服务的信息进行保存,默认情况下,如果 EurakeServer 在一定时间内没有接收到某个服务实例的心跳,EurakeServer 将会注销实例(默认90秒)。但是当网络分区故障发生时,微服务与 EurakeServer 之间无法正常通信,以上行为可能变的非常危险,因为微服务本身是健康的,此时本不应该注销这个服务。Eurake 通过“自我保护”来解决这个问题,当 EurakeServer 节点在短时间内丢失过多客户时(可能发生了网络分区故障),那么这个节点就会进入自我保护模式。一旦进入该模式,EurakeServer 就会保护服务注册表中的信息,不在删除服务注册表中的数据(也就是不会注销任何微服务)。当故障恢复后,该 EurakeServer 节点会自动退出自我保护模式。

1.5  Eurake 集群配置

Eurake 服务端的 application.yml 修改defaultZone,为defaultZone: http://localhost:8081/eureka/,http://localhost:8001/eureka/或者defaultZone: http://localhost:8001/eureka/。即将本注册中心注册到其他注册中心上,以进行微服务的互相注册和发现。

二: 服务提供者

2.1  创建一个user-action的mave工程,引用spring-cloud-starter-netflix-eureka-client

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

1.2  application.yml中添加配置

server:
   port: 8082
 spring:
   application:
     name: eureka-usereureka:
   client:
     register-with-eureka: true     #false表示不向注册中心注册自己。
     fetch-registry: true          #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
     serviceUrl:
       defaultZone: http://localhost:8081/eureka/

1.3  启动一个服务提供者

 只需要在springboot工程的启动application类上加一个注解@EnableEurekaClient,启动服务后访问http://localhost:8081/会发现多了一个服务。

springcloud微服务框架的日志框架怎么实现 springcloud服务治理框架_spring_03

1.3  服务同步

由于多个服务注册中心互相注册为服务,当服务提供者发送注册请求到一个服务注册中心时,它会将该请求转发给集群中相连的其他注册中心,从而实现服务注册中心之间的服务同步。通过服务同步,提供者的服务信息就可以通过集群中的任意一个服务注册中心获得。

1.4  服务续约

在注册服务之后,服务提供者会维护一个心跳用来持续高速Eureka Server,“我还在持续提供服务”,否则Eureka Server的剔除任务会将该服务实例从服务列表中排除出去。我们称之为服务续约。

下面是服务续约的两个重要属性:

(1)eureka.instance.lease-expiration-duration-in-seconds

leaseExpirationDurationInSeconds,表示eureka server至上一次收到client的心跳之后,等待下一次心跳的超时时间,在这个时间内若没收到下一次心跳,则将移除该instance。

默认为90秒
如果该值太大,则很可能将流量转发过去的时候,该instance已经不存活了。
如果该值设置太小了,则instance则很可能因为临时的网络抖动而被摘除掉。
该值至少应该大于leaseRenewalIntervalInSeconds
(2)eureka.instance.lease-renewal-interval-in-seconds

leaseRenewalIntervalInSeconds,表示eureka client发送心跳给server端的频率。如果在leaseExpirationDurationInSeconds后,server端没有收到client的心跳,则将摘除该instance。除此之外,如果该instance实现了HealthCheckCallback,并决定让自己unavailable的话,则该instance也不会接收到流量,默认30秒。