SpringCloud-微服务的注册与发现Eureka
一、SpringCloud简介
Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring Cloud并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。
二、微服务的注册与发现-Eureka
Eureka是Netflix开源的服务发现组件,本身是基于Rest的服务,它包含服务端和客户端两部分;在SpringCloud中将它集成在其中,从而实现了微服务的发现与注册;
- Eureka的GitHub:https://github.com/Netflix/Eureka


Eureka Server
- 服务端-没有存储,内存保持,每服务实例需要发送心跳去续约
- 客户端-在内存中缓存着eureka的注册信息,因此不必每请求到eureka查找服务
- eureka之间会做注册服务同步,从而保证状态一致,客户端只需访问一个eureka
Service Provider
- 会向Eureka Server做Register(服务注册)、Renew(服务续约)、Cancel(服务下线)等操作
Service Consumer
- 会向Eureka Server获取注册服务列表,并消费服务
三、简单实战
1、编写服务端(SpringCloud使用的是Edgware SR3版本)
在pom.xml中加入以下依赖:

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.13.RELEASE</version>
</parent> <dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Edgware.SR3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

在配置文件application.xml中添加以下配置:

server.port=8781
#表示是否将自己注册在EurekaServer上,默认为true。由于当前应用就是EurekaServer,所以置为false
eureka.client.register-with-eureka=false
#表示表示是否从EurekaServer获取注册信息,默认为true。单节点不需要同步其他的EurekaServer节点的数据
eureka.client.fetch-registry=false
#设置Eureka的地址
eureka.client.service-url.defaultZone=http://localhost:8781/eureka

添加启动类,并加上启动Eureka注解:

@SpringBootApplication
@EnableEurekaServer
public class Application {</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> main(String[] args) {
SpringApplication.run(Application.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">, args);
}
}

启动项目,打开http://localhost:8781/,如下:

2、编写客户端(SpringCloud使用的版本与服务端一致)
在pom.xml中加入依赖:

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-parent</artifactId>
<version>1.5.13.RELEASE</version>
</parent> <dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Edgware.SR3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

在配置文件application.xml加入要注入的配置中心的url等配置:
server.port=8782
#对该应用另起别名
spring.application.name=client-8782
#注入目标,配置服务中心url,与服务端的配置保持一致
eureka.client.service-url.defaultZone=http://localhost:8781/eureka/
创建客户端启动类ClientApplication.java,并加入客户端被发现注解:

@SpringBootApplication
@EnableDiscoveryClient
public class ClientApplication {</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> main(String[] args) {
SpringApplication.run(ClientApplication.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">, args);
}
}

启动应用,接着打开之前Eureka的注册页面http://localhost:8781/,如下:

发现刚刚启动的客户端已经注册在了服务端了。
当我将客户端关闭后,再次打开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进入了自我保护机制,默认情况下,如果EurekaServer在一定时间内没有接收到某个微服务实例的心跳时,EurekaServer将会注销该实例(默认90s)。但是当网络发生故障时,微服务与EurekaServer之间无法通信,这样就会很危险了,因为微服务本身是很健康的,此时就不应该注销这个微服务,而Eureka通过自我保护机制来预防这种情况,当网络健康后,该EurekaServer节点就会自动退出自我保护模式;
这时再次将客户端微服务启动,刷新服务注册中心会发现,自我保护状态已取消。
综上所述,我们可以看出来Eureka的两个组件EurekaServer和EurekaClient的作用:
- EurekaServer 提供服务发现的能力,各个微服务启动时,会向EurekaServer注册自己的信息(例如:ip、端口、微服务名称等),EurekaServer会存储这些信息;
- EurekaClient是一个Java客户端,用于简化与EurekaServer的交互;
- 微服务启东后,会定期性(默认30s)的向EurekaServer发送心跳以续约自己的“租期”;
- 如果EurekaServer在一定时间内未接收某个微服务实例的心跳,EurekaServer将会注销该实例(默认90s);
- 默认情况下,EurekaServer同时也是EurekaClient。多个EurekaServer实例,互相之间通过复制的方式,来实现服务注册表中数据的同步;
- EurekaClient也会缓存服务注册表中的信息;
综上,Eureka通过心跳检查、客户端缓存等机制,提高了系统的灵活性、可伸缩性和可用性,所以作为一个微服务架构,需要一个服务注册中心来统筹管理服务;
3、Eureka高可用
复制上面server项目,分别命名:eureka-keepalived-server-1,eureka-keepalived-server2;
复制上面client项目,命名为:eureka-keepalived-client;
修改hosts文件:
127.0.0.1 localhost server1 server2
修改application.properties配置文件(注意需要将eureka.client.register-with-eureka、eureka.client.fetch-registry注释掉):
eureka-keepalived-server-1的配置文件:

server.port=8781
spring.application.name=eureka-server-1
spring.profiles.active=server1
#eureka.client.register-with-eureka=false
#eureka.client.fetch-registry=false
#指定主机名
eureka.instance.hostname=server1
#设置EurekaServer的地址,将自身注册到Server2
eureka.client.service-url.defaultZone=http://server2:8782/eureka

eureka-keepalived-server-2的配置文件:

server.port=8782
spring.application.name=eureka-server-2
#指定hostname
spring.profiles.active=server2
#eureka.client.register-with-eureka=false
#eureka.client.fetch-registry=false
#指定主机名
eureka.instance.hostname=server2
#设置EurekaServer的地址,将自己注册在Server2上
eureka.client.service-url.defaultZone=http://server1:8781/eureka

eureka-keepalived-client的配置文件:

server.port=8783
#对该应用另起别名
spring.application.name=client-8783
#注入目标,配置服务中心url,与服务端的配置保持一致,这里可以写多个,以“,”分隔,如http://server1:8781/eureka/,http://server2:8782/eureka/
eureka.client.service-url.defaultZone=http://server1:8781/eureka/

分别启动两个服务端server2、server1,访问,server1:8781/,server2:8782/,如下:


启动客户端,发现客户端分别在两个服务端都有相应的注册,而我们的客户端实际只指定了一个Server;


至此,完成了Eureka的高可用;
示例代码:https://gitee.com/lfalex/springcloud-example.git
参考书籍:《SpringCloud与Docker微服务架构实战》周力著
SpringCloud-微服务的注册与发现Eureka的更多相关文章
- SpringCloud-微服务的注册与发现Eureka(二)
一.SpringCloud简介 Spring Cloud是一系列框架的有序集合.它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册.配置中心.消息总线.负载均 ...
- SpringCloud 教程 | 第一篇: 服务的注册与发现Eureka(转载)
SpringCloud 教程 | 第一篇: 服务的注册与发现Eureka(Finchley版本) 转载请标明出处:http://blog.csdn.net/forezp/article/details ...
- 【微服务】之二:从零开始,轻松搞定SpringCloud微服务系列--注册中心(一)
微服务体系,有效解决项目庞大.互相依赖的问题.目前SpringCloud体系有强大的一整套针对微服务的解决方案.本文中,重点对微服务体系中的服务发现注册中心进行详细说明.本篇中的注册中心,采用Netf ...
- springCloud学习-服务的注册与发现(Eureka)
1.小记 这段时间有空,把springcloud的知识整理一下,好记性不如烂笔头,也让自己对springcloud有个清晰的认识.此次的整理记录主要借鉴了这位大佬的博客 https://blog.cs ...
- 分享知识-快乐自己:微服务的注册与发现(基于Eureka)
1):微服务架构 服务提供者.服务消费者.服务发现组件这三者之间的关系: 各个微服务在启动时,将自己的网络地址等信息注册到服务发现组件中,服务发现组件会存储这些信息. 服务消费者可从服务发现组件查询服 ...
- SpringCloud入门1-服务注册与发现(Eureka)
前言 Oracle转让Java,各种动态语言的曝光率上升,Java工程师的未来在哪里?我觉得Spring Cloud让未来有无限可能.拖了半年之久的Spring Cloud学习就从今天开始了.中文教材 ...
- SpringCloud学习1-服务注册与发现(Eureka)
由于样式兼容性问题,本文后半部分被截断,可到个人博客找到本文: https://blog.rmiao.top/springcloud-eureka/ 前言 Oracle转让Java,各种动态语言的曝光 ...
- 服务的注册与发现Eureka(二)
1.服务治理概念 在传统rpc远程调用中,服务与服务依赖关系,管理比较复杂,所以需要使用服务治理,管理服务与服务之间依赖关系,可以实现服务调用.负载均衡.容错等,实现服务发现与注册. 2.服务的注册与 ...
- SpringCloud 教程 | 第一篇: 服务的注册与发现Eureka(Finchley版本)
一.spring cloud简介 鉴于<史上最简单的Spring Cloud教程>很受读者欢迎,再次我特意升级了一下版本,目前支持的版本为Spring Boot版本2.0.3.RELEAS ...
随机推荐
- RabbitMQ 五种工作模式
官网介绍:https://www.rabbitmq.com/getstarted.html 五种工作模式的主要特点 简单模式:一个生产者,一个消费者 work模式:一个生产者,多个消费者,每个消费者获 ...
- 安装Ubuntu16.04卡在logo界面
问题背景 笔者在使用U盘UEFI模式安装Ubuntu16.04时,遇到一个问题,即在BIOS里的boot设置U盘为第一启动项之后,启动,并没有顺利进入系统,而是卡在了logo界面.(PS:其实我等了它 ...
- javascript 数组的方法(一)
栈方法(后进先出) ArrayObj.push():就是向数组末尾添加新的元素,返回的是数组新的长度. ArrayObj.pop():就是向数组中删除数组最后一个元素并且返回该元素.如果数组为空就返回 ...
- Java基础(业务问题)
幂等的处理方式 一.查询与删除操作是天然幂等 二.唯一索引,防止新增脏数据 三.token机制,防止页面重复提交 四.悲观锁 for update 五.乐观锁(通过版本号/时间戳实现, 通过条件限制 ...
- 为互联网业务而生:阿里云全球首发云Cassandra服务!
引言:十年沉淀.全球宽表排名第一.阿里云首发云Cassandra服务 ApsaraDB for Cassandra是基于开源Apache Cassandra,融合阿里云数据库DBaaS能力的分布式No ...
- HZOI20190821模拟28题解
题面:https://www.cnblogs.com/Juve/articles/11390839.html 所有官方正解在我的文件里 A. 虎 算法1:我们发现非关键边与黑色边去掉以后,答案就是将所 ...
- c++容器的操作方法总结
一.map 1.创建 typedef map<int,string> descrbe_map_; descrbe_map_ devMap; 或者 map<string,string& ...
- 【python之路44】tornado的用法 (二)
参考:https://www.cnblogs.com/sunshuhai/articles/6253815.html 一.代码目录构建 代码目录设置如下图: #!/usr/bin/env python ...
- HDU 6003 Problem Buyer
贪心题(好久不做了) 题解 考虑最一般的,判断合法性? 经典贪心问题:左端点升序,左端点相同,右端点降序,c[i]升序 优先队列,每次选择覆盖x的右端点最小的区间. 称此方法为“区间匹配贪心” 最小的 ...
- 二、深入asyncio协程(任务对象,协程调用原理,协程并发)
由于才开始写博客,之前都是写笔记自己看,所以可能会存在表述不清,过于啰嗦等各种各样的问题,有什么疑问或者批评欢迎在评论区留言. 如果你初次接触协程,请先阅读上一篇文章初识asyncio协程对asy ...