SpringCloud服务注册中心

Eureka

Eureka是一种服务治理的实现,在传统的rpc远程调用框架中,管理每个服务与服务之间依赖关系比较复杂,所以需要使用服务治理,管理服务之间的依赖关系,可以实现服务调用、负载均衡、容错等

Eureka包含组件

Eureka Server提供服务注册服务

各个微服务节点通过配置启动后,会在Eureka Server中进行注册,这样Eureka Server中的服务注册表中会保存着所以可用的服务节点信息,节点信息可用在Eureka管理界面中看到

Eureka Client通过注册中心访问

是一个java客户端,用于简化Eureka Server的交互,客户端同时也具备一个内置的、轮询的负载均衡算法,在应用启动后,会定期向Eureka Server发送心跳(默认30秒),如果Eureka Server在多个心跳周期没有收到该节点的心跳,Eureka Server会将从服务注册表中把这个服务节点移除(默认90秒)

单机Eureka构建

依赖引入

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

yml编写

在这里插入图片描述

启动类编写

注意启动类中需要加上@EnableEurekaServer注解表示该类是Eureka Server

在这里插入图片描述

测试

通过访问7001能够成功访问表示Eureka Server部署成功

在这里插入图片描述

提供者注册到Eureka

依赖引入

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

yml编写

在这里插入图片描述

修改启动类

在启动类上增加@EnableEurekaClient的注解

在这里插入图片描述

测试

可在Eureka中看到已注册上的服务

在这里插入图片描述

消费者注册到Eureka

依赖引入

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

yml编写

在这里插入图片描述

修改启动类

在启动类上增加@EnableEurekaClient的注解

在这里插入图片描述

测试

可在Eureka中看到已注册上的服务

在这里插入图片描述

集群Eureka构建

修改Host文件

在这里插入图片描述

修改yml

在注册时需要多个eureka相互注册

在这里插入图片描述

测试

若看到2给eureka相互指向,那么表示该eureka配置成功

在这里插入图片描述

服务注册到Eureka

服务注册需要向集群的Eureka注册,那么需要将所以的Eureka地址都写上

在这里插入图片描述

actuator微服务信息完善

在前面使用Eureka中可以发现,注册上去的服务存在一些问题,如服务名称比较乱,以及注册的服务不知道是什么IP地址,如果在大量的服务注册时这个问题会导致排查移除时很难处理

在这里插入图片描述

可通过修改yml来解决这个问题

在这里插入图片描述

修改后可以发现在Eureka可以看到服务的IP以及标准的服务名称,方便以后问题排查

在这里插入图片描述

服务发现Discovery

Discovery可以获取到Eureka上的注册的服务实例完成信息,这个后期是非常用于的东西

修改启动类

在这里插入图片描述

编写测试

通过discoveryClient可以从Eureka获取实例列表,以及根据主机名获取该名称下的所有实例的信息详细,包括ip、端口、serviceid、uri等

在这里插入图片描述

在这里插入图片描述

Eureka自我保护机制

概述

当Eureka中看到这段红色话表示Eureka发送了自我保护机制,当触发了这种机制那么Eureka将不会剔除任何一个已经下线了的服务,属于CAP理论中的AP分支

在这里插入图片描述

自我保护思想

在默认情况下,如果Eureka Server在一定时间内没有收到某个微服务的实例心跳,Eureka Server就会将该实例从实例列表中剔除(默认90秒),但是当网络分区故障发送(延时、卡顿、拥挤)的时Eureka Server会发现大片服务没有心跳,这时如果大片剔除这些服务很危险,所以Eureka Server就会启动自我保护机制,认为这些服务都是存活的不会将任何一个服务剔除

禁止自我保护

#eureka注册中心配置
eureka:
  server:
    #关闭自我保护机制
    enable-self-preservation: false
    #剔除检查间隔时间调整2000毫秒
    eviction-interval-timer-in-ms: 2000
    
#eureka客户端配置
eureka:
  instance:
    #Eureka客户端发送心跳的时间间隔(默认30s)
    lease-renewal-interval-in-seconds: 1
    #Eureka服务端收到最后一个心跳时间,超时将剔除服务(默认90s)
    lease-expiration-duration-in-seconds: 2

Zookeeper

Zookeeper做为SpringCloud的注册中心目的是为了让一些交旧的dubbo项目以最少的成本从RPC转微服务,也可以减少转微服务的学习成本,在使用Zookeeper作为注册中心那么需要一些预备知识,Zookeeper安装与部署

预备知识:Zookeeper-快速入门(服务安装、单机部署、集群部署)

提供者注册到ZK

依赖引入

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
    <!--该问题用于解决zookeeper与部署版本不一致导致启动保存问题-->
    <!--排查自带的zookeeper:3.5.3-beta包-->
    <exclusions>
        <exclusion>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<!--添加自己生产环境中的所用的zookeeper对应版本jar包-->
<dependency>
    <groupId>org.apache.zookeeper</groupId>
    <artifactId>zookeeper</artifactId>
    <version>3.4.9</version>
    <exclusions>
        <exclusion>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
        </exclusion>
        <exclusion>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
        </exclusion>
    </exclusions>
</dependency>

编写yml

在这里插入图片描述

启动类编写

在这里插入图片描述

测试

可看到服务名称没正常的注册到服务Zookeeper中表示成功

在这里插入图片描述

消费者注册到ZK

依赖引入

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
    <!--该问题用于解决zookeeper与部署版本不一致导致启动保存问题-->
    <!--排查自带的zookeeper:3.5.3-beta包-->
    <exclusions>
        <exclusion>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<!--添加自己生产环境中的所用的zookeeper对应版本jar包-->
<dependency>
    <groupId>org.apache.zookeeper</groupId>
    <artifactId>zookeeper</artifactId>
    <version>3.4.9</version>
    <exclusions>
        <exclusion>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
        </exclusion>
        <exclusion>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
        </exclusion>
    </exclusions>
</dependency>

编写yml

在这里插入图片描述

启动类编写

在这里插入图片描述

controller编写

controller也是使用restTemple进行发送请求,这里服务名称与Eureka不同,Zookeeper是小写的

在这里插入图片描述

测试

能够成功调用8004服务

在这里插入图片描述

获取实例列表信息也没有问题

在这里插入图片描述

服务节点信息查看

在Zookeeper中若有服务注册上来都会被放在/services/服务名称/UUID(每个服务生成唯一的ID)路径中,通过get方式可以可以获取到某一个节点详细信息

在这里插入图片描述

在这里插入图片描述

Consul

Consul是一套分布式服务发现和配置管理系统,由HashiGorp公司用GO语言开发

提供了微服务系统中的服务治理、配置中心、控制总线等功能,这些功能中每一个都可以单独根据需要使用,也可以使用构建全方位的服务网格

提供者注册到Consul

依赖引入

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>

编写yml

在这里插入图片描述

启动类编写

在这里插入图片描述

测试

可Consul服务端看到已注册上来的服务名称表示成功

在这里插入图片描述

消费者注册到Consul

依赖引入

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>

编写yml

在这里插入图片描述

启动类编写

在这里插入图片描述

controller编写

controller也是使用restTemple进行发送请求

在这里插入图片描述

测试

可Consul服务端看到已注册上来的服务名称表示成功

在这里插入图片描述

测试远程调用

在这里插入图片描述

在这里插入图片描述

三款注册中心对比

组件名语言CAP服务健康检查对外暴露接口Spring Cloud集成
EurekaJavaAP可配支持HTTP已集成
ConsulGoCP支持HTTP/DNS已集成
ZookeeperJavaCP支持客户端已集成
Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐