1.Spring Cloud构建微服务架构(一)服务注册与发现

文中所有项目均使用:

IDEA编辑器基于java8进行构建Maven进行依赖管理Git进行版本管理

Spring Cloud版本:Hoxton.BUILD-SNAPSHOT

Spring Boot 版本:2.2.1.BUILD-SNAPSHOT

服务治理

服务治理是微服务架构中最为核心和基础的模块。它主要用来实现发现各个微服务实例的自动注册与发现。一个服务治理组件应该具有以下功能:

服务注册表:

服务治理组件的核心内容,用于记录微服务的各个信息(服务名称、ip、端口等)。并对外提供查询API和管理API,查询API用于查询可用的微服务实例,管理API用于注册和注销微服务实例。

服务注册发现:

服务注册是指微服务在启动时,将自己的信息注册到服务治理组件上的过程。

服务发现是指查询可用微服务列表及其网络地址的机制

服务检查:

服务治理组件使用一定的检查机制检测注册的微服务是否正常运行,若无法访问,就会从注册表移除该实例。

Eureka实践

什么是Eureka?

在开头的解释中提到,Eureka是发现、找到的意思,Eureka组件是NetFlix开源的服务发现组件,本身基于REST的服务。它包含Server和Client两部分。Spring Cloud将它集成在子项目Spring Cloud NetFlix中,从而实现微服务的注册和发现。

Eureka架构

从上图可以看出eureka分为三部分:

Server Provider: 微服务的提供者,可以是一个spring boot程序或者符合Eureka的通信机制的其他服务提供者

Server Consumer:微服务的消费者,从服务注册中心获取服务列表,从而发现要从何处调用要使用的服务

Eureka Server:服务注册中心和服务发现中心

 

从上图来看,可以这样简单理解:

服务消费者从服务注册中心获取到注册在线的服务列表,在获得服务信息之后通过调用服务提供者提供的服务进行业务处理,服务提供者在开启服务之后,会在服务注册中心注册(续约或者下线)自己提供的服务。服务注册中心来维护注册的服务状态,比如发送心跳检测验证健康状态,判断是否在线(宕机),同时记录服务的相关信息以供消费者进行查询。

创建一个Eureka服务端(注册发现中心)

创建一个eureka服务端非常简单,只需简单的几步即可完成

0.准备工作

作者将eureka作为springcloud项目的一个模块来进行创建,所以先建一个名为springcloud的空的spring boot项目。然后创建一个名为eurekaserver的module。

1.在pom文件中加入依赖

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

注意:请注意版本,不同版本写法可能不同

2.添加配置文件配置

eureka: 
    instance: 
        hostname: 127.0.0.1 # 实例的主机名称 
        client: 
            register-with-eureka: false  # 不要向注册中心注册自己(服务注册发现中心自己本身也是一个服务) 
            service-url: 
                defaultZone:  http://${eureka.instance.hostname}:${server.port}/eureka/ # 指定服务注册中心地址 本服务本身即使注册中心服务,所以指向自身
spring: 
    application: 
        name: eureka-service #服务名称
        server: 
            port: 38761 # 服务的端口(默认8761)

3.启动类添加@EnableEurekaServer

@SpringBootApplication
@EnableEurekaServer
@Slf4j
public class EurekaserverApplication { 
    public static void main(String[] args) { 
        SpringApplication.run(EurekaserverApplication.class, args);
        log.info("EurekaserverApplication启动");
    }
}

启动类一共使用了3个注解

@SpringBootApplication: Spring Boot 入口类的启动注解

@EnableEurekaServer: 表示这个应用是一个Eureka的服务注册发现的一个应用,即该应用即为服务注册发现中心

@Slf4j: lombok 日志注解

在应用启动之后可以在控制台看到在程序中打印的日志

4.在应用启动成功之后,访问127.0.0.1:38761

 

至此,一个单机版的Eureka服务端就创建好了,基本就几行代码就完成了。但我们发现目前没有应用实例注册到我们刚创建的Eureka服务上。所以接下来,在创建一个客户端来演示应用服务如何注册到我们创建的Eureka服务端。

创建一个应用服务(Eureka 客户端)

同理在上面的项目上在创建一个名称为config(后续的配置文件中心服务)的module,作为Eureka的客户端(也就是服务提供者)注册到刚刚创建的Eureka服务端上。

1.pom文件引入依赖

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

2.配置文件添加配置

server: 
    port: 38762 #服务端口
spring: 
    application: 
        name: config-server #服务名称
    eureka: 
        client: 
            service-url: 
                defaultZone: http://localhost:38761/eureka/ #eureka服务端的地址

3.配置启动类

@SpringBootApplication
@EnableDiscoveryClient
@Slf4j
public class ConfigserverApplication { 
    public static void main(String[] args) {
        SpringApplication.run(ConfigserverApplication.class, args);
        log.info("ConfigserverApplication启动");
    }
}

待控制台打印信息出

 再去访问127.0.0.1:38761可以看到

 可以看到名为CONFIG-SERVER(对应配置文件中的server.name)已经注册到了Eureka服务上了

Eureka的自我保护模式

在开发阶段,可以经常在页面上看到

EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.

默认情况下,如果Eureka Server在一定时间内没有接收到某个微服务实例的心跳,Eureka Server将会注销该实例(默认90秒)。但是当网络分区故障发生时,微服务与Eureka Server之间无法正常通信,这就可能变得非常危险了,因为微服务本身是健康的,此时本不应该注销这个微服务。

Eureka Server通过“自我保护模式”来解决这个问题,当Eureka Server节点在短时间内丢失过多客户端时(可能发生了网络分区故障),那么这个节点就会进入自我保护模式。一旦进入该模式,Eureka Server就会保护服务注册表中的信息,不再删除服务注册表中的数据(也就是不会注销任何微服务)。当网络故障恢复后,该Eureka Server节点会自动退出自我保护模式。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值