白话SpringCloud | 第二章:服务注册与发现(Eureka)-上
前言
从本章节开始,正式进入
SpringCloud的基础教程。从第一章《什么是SpringCloud》中我们可以知道,一个微服务框架覆盖的东西是很多的,而如何去管理这些服务或者说API接口,就显得异常重要了。所以本章节,主要介绍下SpringCloud中使用Eureka实现服务的注册与发现。
服务治理
服务治理是微服务架构中最为核心和基础的模块。它主要用来实现各个微服务实例的自动化注册与发现。
来一张经典的图:

可以知道,随着服务的越来越多,越来越杂,服务之间的调用会越来越复杂,越来越难以管理。而当某个服务发生了变化,或者由于压力性能问题,多部署了几台服务,怎么让服务的消费者知晓变化,就显得很重要了。不然就会存在调用的服务其实已经下线了,但调用者不知道等异常情况。
这个时候有个服务组件去统一治理就相当重要了。简单来说,一个服务治理组件应该具备以下几个功能:
服务注册表
服务治理组件的核心,它用来记录各个微服务的信息,比如说微服务的名称、IP、端口等。服务注册组件提供查询API和管理API,查询API用来查询可用的微服务实例,管理API用于服务的注册和注销。
服务注册与发现
- 服务注册是指微服务在启动时,将自己的信息注册到服务治理组件上的过程。
- 服务发现是指查询可用微服务列表及其网络地址的机制。
服务检查
服务治理组件使用一定机制定时检测已注册的服务,是否在线,或者是否无法连接等,若发现无法访问,就会从服务注册表中移除该实例,进行下线操作。
Eureka实践
Eureka简单介绍
Eureka是Netflix开源的服务发现组件,本身是一个基于REST的服务。它包含Server和Client两部分。Spring Cloud将它集成在子项目Spring Cloud Netflix中,从而实现微服务的注册与发现。
题外话:有兴趣的同学,可以搜索看看这家在线影片租赁提供商:Netflix。全家桶里面大部分接触的都是这家公司开源的,老牛逼了!
Netflix官方github地址了解下:https://github.com/Netflix
Eureka服务端
也称为注册中心,用于提供服务的注册与发现。支持高可用配置,依托与强一致性提供良好的服务实例可用性,可以应对多种不同的故障场景。
Eureka客户端
主要处理服务的注册与发现。客户端服务通过注解和参数配置方式,嵌入在客户端的应用程序代码中,在应用程序启动时,向注册中心注册自身提供的服务并周期性地发送心跳来更新它的服务租约。同时,它也能从服务端查询当前注册的服务信息并把它们缓存到本地并周期性地刷新服务状态。
简单看下,Eureka总体架构:

从这个简图中,可以看出,Eureka有三部分组成:
- Service Provider: 暴露服务的提供方。
- Service Consumer:调用远程服务的服务消费方。
- EureKa Server: 服务注册中心和服务发现中心
而我们使用Eureka主要是实现服务治理功能,通过下图我们来大致了解下其治理体系:

简单来说,客户端通过注册中心,获取服务端服务的地址信息,再根据地址进行服务调用,而注册中心来维护各服务的状态,比如发送心跳验证健康状态,判断是否在线,同时记录其服务地址,以供查询。
开始讲解实例前,先说明下为了版本可统一管理,本系列教程创建了一个父类pom文件,利用Maven的dependencyManagement对模块版本进行了统一管理。后续若是升级版本时,正常就更新此父类pom版本即可。
创建Eureka服务端
创建一个Eureka服务端很简单,我们只需要简单几步即可完成。
创建个名为spring-cloud-eureka-server的SpringBoot项目。
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对象的值,大小写要一致,和其他对象不一样,这个要注意。

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

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客户端,其实就是服务的提供方,对外提供服务的应用。
创建个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类:

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本身支持Eureka、Consul、zookeeper等实现注册中心功能,若写死了某个注册中心的相关注解,之后替换时,还需要修改注解类。
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
或者直接查看EurekaClientConfigBean和EurekaInstanceConfigBean类相关默认配置:

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

「你说,英语不好连字段啥意思都不知道,多尴尬,学好英语很重要,(┬_┬)」
参考资料
总结
本文主要讲解了如何搭建
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/
白话SpringCloud | 第二章:服务注册与发现(Eureka)-上的更多相关文章
- 小D课堂 - 新版本微服务springcloud+Docker教程_3-05 服务注册和发现Eureka Server搭建实战
笔记 5.服务注册和发现Eureka Server搭建实战 简介:使用IDEA搭建Eureka服务中心Server端并启动,项目基本骨架介绍 官方文档:http://clou ...
- Spring Cloud(二):服务注册与发现 Eureka【Finchley 版】
Spring Cloud(二):服务注册与发现 Eureka[Finchley 版] 发表于 2018-04-15 | 更新于 2018-05-07 | 上一篇主要介绍了相关理论,这一篇开始我们 ...
- spring cloud 学习之 服务注册和发现(Eureka)
一:服务注册和发现(Eureka) 1:采用Eureka作为服务注册和发现组件 2:Eureka 项目中 主要在启动类加上 注解@EnableEurekaServer @SpringBootAppli ...
- 白话SpringCloud | 第三章:服务注册与发现(Eureka)-下
前言 上一章节,讲解了在单机模式下的服务注册与发现的相关知识点及简单示例.而在实际生产或者在这种微服务架构的分布式环境中,需要考虑发生故障时,各组件的高可用.而其实高可用,我的简单粗俗理解就是,通过系 ...
- SpringCloud(二)- 服务注册与发现Eureka
离上一篇微服务的基本概念已经过去了几个月,在写那篇博客之前,自己还并未真正的使用微服务架构,很多理解还存在概念上.后面换了公司,新公司既用了SpringCloud也用了Dubbo+Zookeeper, ...
- SpringCloud学习笔记:服务注册与发现Eureka(2)
1. Eureka简介 Eureka是一个用于服务注册和发现的组件,分为Eureka Server和Eureka Client,Eureka Server为Eureka服务注册中心,Eureka Cl ...
- springcloud干货之服务注册与发现(Eureka)
springcloud系列文章的第一篇 springcloud服务注册与发现 使用Eureka实现服务治理 作用:实现服务治理(服务注册与发现) 简介: Spring Cloud Eureka是Spr ...
- SpringCloud 学习(二) :服务注册与发现Eureka
Spring Cloud应用中可以支持多种的服务治理框架,比如Eureka.Consul.Zookeeper等,现在我们用的是consul,本文以SpringCloud Dalston.SR5版本介绍 ...
- SpringCloud(二) 服务注册与发现Eureka
1.eureka是干什么的? 上篇说了,微服务之间需要互相之间通信,那么通信就需要各种网络信息,我们可以通过使用硬编码的方式来进行通信,但是这种方式显然不合适,不可能说一个微服务的地址发生变动,那么整 ...
随机推荐
- 【转载】ruby 中数组函数示例(1)(转)
函数名称 说明 示例 & 数组与,返回两数组的交集 [1,2] & [2,3] =>[2] * 复制数组n次 [1,2]*2 => [1,2,1, ...
- service的生命周期以及两种service的差异
可以看到,两种service的生命周期都相对简单,有一点不同的是,Intentservice每次调用的时候都执行onstartcommand,而boundservice一旦启动了之后,就不会每次执行o ...
- SpringSecurity04 利用JPA和SpringSecurity实现前后端分离的认证和授权
1 环境搭建 1.1 环境说明 JDK:1.8 MAVEN:3.5 SpringBoot:2.0.4 SpringSecurity:5.0.7 IDEA:2017.02旗舰版 1.2 环境搭建 创建一 ...
- 2、Spark基本工作原理与RDD
一.基本工作原理 1.特点 分布式: 主要是基于内存(少数情况基于磁盘): spark与,MapReduce最大的不同在于迭代式计算: MR分为两个阶段,map和reduce,两个阶段完了我们,job ...
- 快速搭建LAMP
1.安装Apache sudo apt-get install apache2 2.安装Mysql sudo apt-get install mysql-server 中间会出现输入 Mysql 的 ...
- bash字符串匹配
#!/bin/shfoo(){ local basedir=$1 local all_entries=`ls -c` for entry in $all_entries do ...
- matlab基本语法和运算基础
转载自:http://blog.csdn.net/robertcalm/article/details/51582253 matlab语法比较随意,但正如其全名 matrix &laborat ...
- c#事件1
Private void button_clicked( object sender ,RouteEventArgs e) sender :引发事件的对象 源 e : 路由事件,提供可能重要 ...
- JSP读取Oracle数据库里的图片Blob字段并显示在页面上
1.java代码: /** * 打印模板获取电子签名 * @param request * @param resp * @param id * @return * @throws Exception ...
- 通过jdbc连接MySql数据库的增删改查操作
一.获取数据库连接 要对MySql数据库内的数据进行增删改查等操作,首先要获取数据库连接 JDBC:Java中连接数据库方式 具体操作如下: 获取数据库连接的步骤: 1.先定义好四个参数 String ...