白话SpringCloud | 第二章:服务注册与发现(Eureka)-上

前言

从本章节开始,正式进入SpringCloud的基础教程。从第一章《什么是SpringCloud》中我们可以知道,一个微服务框架覆盖的东西是很多的,而如何去管理这些服务或者说API接口,就显得异常重要了。所以本章节,主要介绍下SpringCloud中使用Eureka实现服务的注册与发现。

服务治理

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

来一张经典的图:

服务关系

可以知道,随着服务的越来越多,越来越杂,服务之间的调用会越来越复杂,越来越难以管理。而当某个服务发生了变化,或者由于压力性能问题,多部署了几台服务,怎么让服务的消费者知晓变化,就显得很重要了。不然就会存在调用的服务其实已经下线了,但调用者不知道等异常情况。

这个时候有个服务组件去统一治理就相当重要了。简单来说,一个服务治理组件应该具备以下几个功能:

服务注册表

服务治理组件的核心,它用来记录各个微服务的信息,比如说微服务的名称、IP、端口等。服务注册组件提供查询API和管理API,查询API用来查询可用的微服务实例,管理API用于服务的注册和注销。

服务注册与发现

  • 服务注册是指微服务在启动时,将自己的信息注册到服务治理组件上的过程。
  • 服务发现是指查询可用微服务列表及其网络地址的机制。

服务检查

服务治理组件使用一定机制定时检测已注册的服务,是否在线,或者是否无法连接等,若发现无法访问,就会从服务注册表中移除该实例,进行下线操作。

Eureka实践

Eureka简单介绍

EurekaNetflix开源的服务发现组件,本身是一个基于REST的服务。它包含ServerClient两部分。Spring Cloud将它集成在子项目Spring Cloud Netflix中,从而实现微服务的注册与发现。

题外话:有兴趣的同学,可以搜索看看这家在线影片租赁提供商:Netflix。全家桶里面大部分接触的都是这家公司开源的,老牛逼了!

Netflix官方github地址了解下:https://github.com/Netflix

Eureka服务端

也称为注册中心,用于提供服务的注册与发现。支持高可用配置,依托与强一致性提供良好的服务实例可用性,可以应对多种不同的故障场景。

Eureka客户端

主要处理服务的注册与发现。客户端服务通过注解和参数配置方式,嵌入在客户端的应用程序代码中,在应用程序启动时,向注册中心注册自身提供的服务并周期性地发送心跳来更新它的服务租约。同时,它也能从服务端查询当前注册的服务信息并把它们缓存到本地并周期性地刷新服务状态。

简单看下,Eureka总体架构:

Eureka总体架构

从这个简图中,可以看出,Eureka有三部分组成:

  • Service Provider: 暴露服务的提供方。
  • Service Consumer:调用远程服务的服务消费方。
  • EureKa Server: 服务注册中心和服务发现中心

而我们使用Eureka主要是实现服务治理功能,通过下图我们来大致了解下其治理体系:

治理体系

简单来说,客户端通过注册中心,获取服务端服务的地址信息,再根据地址进行服务调用,而注册中心来维护各服务的状态,比如发送心跳验证健康状态,判断是否在线,同时记录其服务地址,以供查询。

开始讲解实例前,先说明下为了版本可统一管理,本系列教程创建了一个父类pom文件,利用MavendependencyManagement对模块版本进行了统一管理。后续若是升级版本时,正常就更新此父类pom版本即可。

创建Eureka服务端

创建一个Eureka服务端很简单,我们只需要简单几步即可完成。

创建个名为spring-cloud-eureka-serverSpringBoot项目。

0.加入pom依赖。

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

这里注意,和E版不同,E版是引入:spring-cloud-starter-eureka-server

1.添加配置文件配置。

spring.application.name=eureka-service
# 修改端口
server.port=1000

# 实例的主机名称
eureka.instance.hostname=127.0.0.1

## 不要向注册中心注册自己
eureka.client.register-with-eureka=false
## 表示不去检索其他的服务,因为服务注册中心本身的职责就是维护服务实例,它也不需要去检索其他服务
eureka.client.fetch-registry=false

# 指定服务注册中心地址 这里直接指向了本服务
eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/

友情提示:由于eureka.client.service-url在配置类org.springframework.cloud.netflix.eureka.EurekaClientConfigBean是个map对象,所以呢,使用IDE的提示功能是不会出现的,而且要注意map对象的值,大小写要一致,和其他对象不一样,这个要注意。

EurekaClientConfigBean

所以从源码可以看出,默认不写时,是注册至:DEFAULT_URL中,默认就是http://localhost:8761/eureka

DEFAULT_URL

2.启动类,添加注解@EnableEurekaServer。

/**
 * Eureka服务端
 * @author oKong
 *
 */
@SpringBootApplication
@EnableEurekaServer
@Slf4j
public class EureakServiceApplication {
    
    public static void main(String[] args) throws Exception {
        SpringApplication.run(EureakServiceApplication.class, args);
        log.info("spring-cloud-eureka-service启动!");
    }
}

3.启动应用,访问:http://127.0.0.1:1000/,

eureka界面

目前为止一个单机Eureka服务端就搭建完毕了。是不是很简单,基本就几行代码。从上图也可以看出,目前还没有服务注册上去,所以应用列表是空的。接下来,创建个客户端同时注册到此注册中心下。

创建Eureka客户端

Eureka客户端,其实就是服务的提供方,对外提供服务的应用。

创建个spring-cloud-eureka-client工程项目。

0.加入pom依赖

    <!-- 客户端依赖 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    <!-- 引入web,提供一个简单的api接口 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>    

1.配置文件添加注册中心配置。

spring.application.name=eureka-client
server.port=2000

# 注册中心地址
eureka.client.service-url.defaultZone=http://127.0.0.1:1000/eureka
# 启用ip配置 这样在注册中心列表中看见的是以ip+端口呈现的
eureka.instance.prefer-ip-address=true
# 实例名称  最后呈现地址:ip:2000
eureka.instance.instance-id=${spring.cloud.client.ip-address}:${server.port}

友情提示:这里有个坑,变量spring.cloud.client.ipAaddress在F版中应该写成spring.cloud.client.ip-address。具体原因就是字段名修改了。

org.springframework.cloud.client.HostInfoEnvironmentPostProcessor类:

HostInfoEnvironmentPostProcessor

2.启动类加入注解EnableDiscoveryClient。

/**
 * 服务提供者示例-eureka客户端
 * @author oKong
 *
 */
@SpringBootApplication
//注意这里也可使用@EnableEurekaClient
//但由于springcloud是灵活的,注册中心支持eureka、consul、zookeeper等
//若写了具体的注册中心注解,则当替换成其他注册中心时,又需要替换成对应的注解了。
//所以 直接使用@EnableDiscoveryClient 启动发现。
//这样在替换注册中心时,只需要替换相关依赖即可。
@EnableDiscoveryClient
@Slf4j
public class EurekaClientApplication {

    public static void main(String[] args) throws Exception {
        SpringApplication.run(EurekaClientApplication.class, args);
        log.info("spring-cloud-eureka-client启动!");
    }

}

注意:这里也可使用@EnableEurekaClient注解,但一般不这么用,直接使用@EnableDiscoveryClient实现自动发现。因为SpringCloud本身支持EurekaConsulzookeeper等实现注册中心功能,若写死了某个注册中心的相关注解,之后替换时,还需要修改注解类。

3.编写一个简单的api接口。

/**
 * 简单api示例
 * @author oKong
 *
 */
@RestController
public class DemoController {

    @GetMapping("/")
    public String index() {
        return "spring-cloud-eureka-client!";
    }
}

4.启动应用,再次访问:http://127.0.0.1:1000/ ,可以看见服务被注册上去了。

加入注册中心

Eureka自我保护模式

在开发阶段,很经常会出现以下文字:

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

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

自我保护模式是一种对网络异常的安全保护措施。使用自我保护模式,而让Eureka集群更加的健壮、稳定。

开发阶段可以通过配置:eureka.server.enable-self-preservation=false关闭自我保护模式。

生产阶段,理应以默认值进行配置。

至于具体具体的配置参数,可至官网查看:http://cloud.spring.io/spring-cloud-static/Finchley.RELEASE/single/spring-cloud.html#_appendix_compendium_of_configuration_properties

或者直接查看EurekaClientConfigBeanEurekaInstanceConfigBean类相关默认配置:

默认配置类

至于字段中文说明,大家可查看网站:微服务架构:Eureka参数配置项详解,里面很详细的说明了。

「你说,英语不好连字段啥意思都不知道,多尴尬,学好英语很重要,(┬_┬)」

参考资料

  1. http://cloud.spring.io/spring-cloud-static/Finchley.RELEASE/single/spring-cloud.html#spring-cloud-eureka-server

  2. https://blog.csdn.net/sunhuiliang85/article/details/76222517

  3. https://www.areatao.com/article/5b45718d7ab07c574d5888d0

总结

本文主要讲解了如何搭建Eureka注册中心,及使用Eureka客户端注册服务至注册中心。配置和使用都相对来说很简单的,主要还是要理解下Eureka为我们做了什么,提供了什么服务治理策略。目前我们搭建的是单机版的注册中心,本来想继续写Eureka的高可用和其访问安全的。奈何今天又出差了,晚上回酒店迟了。写完本章最后一个章节觉得困了,就分为上下章节吧。谅解,谅解呀,(┬_┬)

最后

目前互联网上大佬都有分享SpringCloud系列教程,内容可能会类似,望多多包涵了。原创不易,码字不易,还希望大家多多支持。若文中有错误之处,还望提出,谢谢。

老生常谈

  • 个人QQ:499452441
  • 微信公众号:lqdevOps

公众号

个人博客:http://blog.lqdev.cn

源码示例:https://github.com/xie19900123/spring-cloud-learning

原文地址:http://blog.lqdev.cn/2018/09/06/SpringCloud/chapter-two/

posted @ 2018-09-06 08:14 oKong_趔趄的猿 阅读(...) 评论(...) 编辑 收藏