一、注册中心

  1、注册中心演变过程

  2、注册中心必备功能

  ① 服务的上线

  ② 服务的下线

  ③ 服务的剔除

  ④ 服务的查询

  ⑤ 注册中心HA

  ⑥ 注册中心节点数据同步

  ⑦ 服务信息的存储,比如mysql,redis,zookeeper,内存map等

  3、RPC远程调用过程

  ① 负载均衡策略:随机,轮询,一致性Hash等;

  ② 容错机制:失败重试,失败自动切换等;

  ③ 透明代理: 调用远程方法跟调用本地的方法一样;

  ④ 协议: 双方约定好的协议,比如http协议,dubbo协议等;

  ⑤ 协议编解码:按照指定的协议进行编解码;

  ⑤ 序列化反序列化:网络传输的都是流,分字节流和字符流,所以需要对传输的数据做序列化,接收的流做反序列化;

  ⑥ 网络传输: 知道对方的ip+port就可以建立网络连接也就是socket连接,然后可以发起网络请求和接收对应的响应;

  ⑦ 线程池:io线程负责io连接,读取事件,等读取完成后交给线程池去处理相应的业务,类似netty的reactor模型;

二、Eureka详解

  1、Eureka核心的Rest Api接口列表

请求名称 请求方式 HTTP地址 请求描述
注册服务 POST /eureka/apps/{appID} 传递JSON或者XML格式的参数内容,HTTP code为204表示成功
删除服务 DELETE /eureka/apps/{appID}/{instanceID}  HTTP code为200时表示成功
发起心跳  PUT  /eureka/apps/{appID}/{instanceID}  HTTP code为200时表示成功
 查询服务  GET  /eureka/apps  HTTP code为200时表示成功,返回XML/JSON数据
 查询指定appID的服务列表  GET  /eureka/apps/{appID}  HTTP code为200时表示成功,返回XML/JSON数据
 查询指定appID&instanceID的服务  GET  /eureka/apps/{appID}/{instanceID}  获取指定appID以及instanceID的服务信息,HTTP code为200时表示成功,返回XML/JSON数据
 查询指定instanceID服务列表  GET  /eureka/apps/instances/{instanceID}  获取指定instanceID的服务信息,HTTP code为200时表示成功,返回XML/JSON数据
 变更服务状态  PUT  /eureka/apps/{appID}/{instanceID}/status?value=DOWN  服务上线、服务下线等状态改变,HTTP code为200时表示成功

  2、Eureka服务端和客户端

  2.1 搭建Eureka服务端

  第一步:加依赖

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

  第二步:加注解

@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}

  第三步:编写配置文件

server:
#Eureka服务端应用的端口默认是8761
port: 8761
eureka:
client:
#表示是否将自己注册到EurekaServer,默认为true,由于当前应用就是EurekaServer,故而设为false
registerWithEureka: false
#表示是否从EurekaServer获取注册信息,默认为true,因为这是一个单点的EurekaServer,不需要同步其他的EurekaServer节点的数据
fetchRegistry: false
#注册地址
serviceUrl:
defaultZone: http://localhost:8761/eureka/

  2.2 搭建Eureka客户端

  第一步:加依赖

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

  第二步:加注解

/**
* spring-cloud F版本可不写 @EnableDiscoveryClient
* @desc: 用户服务启动
* @author: toby
*/
@SpringBootApplication
public class UserApplication {
public static void main(String[] args) {
SpringApplication.run(UserApplication.class, args);
}
}

  第三步:编写配置文件

#eureka
eureka:
client:
#注册到Eureka服务端的地址
serviceUrl:
defaultZone: http://localhost:8761/eureka
instance:
#点击具体的微服务,右下角是否显示ip
prefer-ip-address: true

  第四步:使用RestTemplate调用,需要加@LoadBalanced注解

 /**
* 负载均衡加上@LoadBalanced
* @return
*/
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}

  当然实际项目中都是采用FeignClient来调用的。

  启动Eureka服务端和客户端:

  3、Eureka部署架构

  3.1 架构图

  3.2 Region

区域 编码
亚太(东京) ap-northeast-1
亚太(新加坡) ap-southeast-1
亚太(悉尼) ap-southeast-2
欧洲(爱尔兰) eu-west-1
南美(圣保罗) sa-east-1
美东(北佛杰尼亚) us-east-1
美西(北加利佛尼亚) us-west-1
美西(俄勒冈) us-west-2

  3.3 核心功能

  ① 服务注册(Register):Eureka Client会通过发送REST请求向Eureka Server注册自己的服务,提供自身IP、端口、微服务名称等信息。Eureka Server接收到注册请求后,就会把这些信息存储在一个双层的Map中。

  ② 服务续约(Renew):在服务注册后,Eureka Client会维护一个心跳来持续通知Eureka Server,说明服务一直处于可用状态,防止被剔除。Eureka Client在默认的情况下会每隔30秒(eureka.instance.leaseRenewallIntervalInSeconds)发送一次心跳来进行服务续约。

  ③ 服务同步(Replicate):Eureka Server集群中多个Eureka Server之间会互相进行注册,不同Eureka Server之间会进行服务同步,用来保证Eureka Server集群内的所有实例中的数据一致性(从这个架构来看,Eureka Server所有实例所处的角色都是对等的,没有类似Zookeeper、选举过程,也不存在主从,所有的节点都是主节点。Eureka官方将Eureka Server集群中的所有实例称为"对等体(peer)")。

  ④ 获取服务(Get Registry):服务消费者(Eureka Client)在启动的时候,会发送一个REST请求给Eureka Server,获取上面注册的服务清单,并且缓存在Eureka Client本地,默认缓存30秒(eureka.client.registryFetchIntervalSeconds)。同时,为了性能考虑,Eureka Server也会维护一份只读的服务清单缓存,该缓存每隔30秒更新一次。

  ⑤ 服务调用(Make Remote Call):服务消费者在获取到服务清单后,就可以根据清单中的服务列表信息,查找到其他服务的地址,从而进行远程调用。

  ⑥ 服务下线(Cancel):当Eureka Client需要关闭或重启时,就不希望在这个时间段内再有请求进来,所以,就需要提前先发送REST请求给Eureka Server,告诉Eureka Server自己要下线了,Eureka Server在收到请求后,就会把该服务状态置为下线(DOWN),并把该下线事件传播出去。

  ⑦ 服务剔除(Evict):服务实例可能会因为网络故障等原因导致不能提供服务,而此时该实例也没有发送请求给Eureka Server来进行服务下线,所以,还需要有服务剔除的机制。Eureka Server在启动的时候会创建一个定时任务,每隔一段时间(默认60秒),从当前服务清单中把超时没有续约(默认90秒,eureka.instance.leaseExpirationDurationInSeconds )的服务剔除。

  ⑧ 自我保护:既然Eureka Server会定时剔除超时没有续约的服务,那就有可能出现一种场景,网络一段时间内发生了异常,所有的服务都没能够进行续约,Eureka Server就把所有的服务都剔除了,这样显然不太合理。所以,就有了自我保护机制,当短时间内,统计续约失败的比例,如果达到一定阈值,则会触发自我保护的机制,在该机制下,Eureka Server不会剔除任何的微服务,等到正常后,再退出自我保护机制。自我保护开关(eureka.server.enableself-preservation: false)

三、Eureka高可用

  启动eureka-8761,eureka-8762 2个服务

  1、eureka-8761配置文件如下:

spring:
application:
name: eureka-ha
server:
#Eureka服务端应用的端口默认是8761
port: 8761
eureka:
client:
#表示是否将自己注册到EurekaServer,表示8761的服务端需要向8762注册自己
registerWithEureka: true
#表示是否从EurekaServer获取注册信息,默认为true,需要从8762获取数据
fetchRegistry: true
#注册地址
serviceUrl:
defaultZone: http://localhost:8762/eureka/

  2、eureka-8762配置文件如下:

spring:
application:
name: eureka-ha
server:
#Eureka服务端应用的端口默认是8761
port: 8762
eureka:
client:
#表示是否将自己注册到EurekaServer,表示8762的服务端需要向8761注册自己
registerWithEureka: true
#表示是否从EurekaServer获取注册信息,默认为true,需要从8761获取数据
fetchRegistry: true
#注册地址
serviceUrl:
defaultZone: http://localhost:8761/eureka/

  3、eureka-client需要向2个注册中心注册服务(其实写一个就可以,因为eureka集群中的实例之前会同步数据)

#eureka
eureka:
client:
#注册到Eureka服务端的地址
serviceUrl:
defaultZone: http://localhost:8761/eureka,http://localhost:8762/eureka

  启动后:

Spring Cloud系列(二):Eureka应用详解的更多相关文章

  1. Spring Cloud 系列之 Eureka 实现服务注册与发现

    如果你对 Spring Cloud 体系还不是很了解,可以先读一下 Spring Cloud 都有哪些模块 Eureka 是 Netflix 开源的服务注册发现组件,服务发现可以说是微服务架构的核心功 ...

  2. Spring Cloud系列之Eureka服务治理

    写在前面 Spring Cloud Eureka是基于Netflix Eureka做的二次封装.主要包含两部分: 服务注册中心 eureka server 服务提供者 eureka client ps ...

  3. elasticsearch系列二:索引详解(快速入门、索引管理、映射详解、索引别名)

    一.快速入门 1. 查看集群的健康状况 http://localhost:9200/_cat http://localhost:9200/_cat/health?v 说明:v是用来要求在结果中返回表头 ...

  4. <Spring Cloud>入门二 Eureka Client

    1.搭建一个通用工程 1.1 pom 文件 <?xml version="1.0" encoding="UTF-8"?> <project x ...

  5. 深入理解JAVA I/O系列二:字节流详解

    流的概念 JAVA程序通过流来完成输入/输出.流是生产或消费信息的抽象,流通过JAVA的输入输出与物理设备链接,尽管与它们链接的物理设备不尽相同,所有流的行为具有相同的方式.这样就意味一个输入流能够抽 ...

  6. [转]Java程序员从笨鸟到菜鸟之(八十三)细谈Spring(十二)OpenSessionInView详解及用法

    首先我们来看一下什么是OpenSessionInView?    在hibernate中使用load方法时,并未把数据真正获取时就关闭了session,当我们真正想获取数据时会迫使load加载数据,而 ...

  7. Spring Cloud系列(三):Eureka源码解析之服务端

    一.自动装配 1.根据自动装配原理(详见:Spring Boot系列(二):Spring Boot自动装配原理解析),找到spring-cloud-starter-netflix-eureka-ser ...

  8. Spring Cloud系列(四):Eureka源码解析之客户端

    一.自动装配 1.根据自动装配原理(详见:Spring Boot系列(二):Spring Boot自动装配原理解析),找到spring-cloud-netflix-eureka-client.jar的 ...

  9. Spring Boot 启动(二) 配置详解

    Spring Boot 启动(二) 配置详解 Spring 系列目录(https://www.cnblogs.com/binarylei/p/10198698.html) Spring Boot 配置 ...

  10. Spring Cloud(二):服务注册与发现 Eureka【Finchley 版】

    Spring Cloud(二):服务注册与发现 Eureka[Finchley 版]  发表于 2018-04-15 |  更新于 2018-05-07 |  上一篇主要介绍了相关理论,这一篇开始我们 ...

随机推荐

  1. 基于postman的api自动化测试实践

    测试的好处 每个人都同意测试很重要,但并不是所有人都会去做.每当你添加新的代码,测试可以保证你的api按照预期运行.通过postman,你可以为所有api编写和运行测试脚本. postman中的测试 ...

  2. RabbitMQ入门指南

    消息队列(Message Queue,以下简称MQ)常用于异步系统的数据传递.若不用MQ,我们只能[在应用层]使用轮询或接口回调等方式处理,这在效率或耦合度上是难以让人满意的.当然我们也可以在系统间保 ...

  3. Ingress-nginx 与 Nginx-ingress

    一.概述 Ingress-nginx:它是由Kubernetes社区基于Nginx Web服务器开发的,并补充了一组用于实现额外功能的Lua插件,作为“官方”默认控制器支持当然最优. Github:h ...

  4. 在CG/HLSL中访问着色器的内容

    着色器在Properties代码块中声明 材质球的各种特性.如果你想要在着色器程序中使用这些特性,你需要在CG/HLSL中声明一个变量,这个变量需要与你要使用的特性拥有同样的名字和对的上号的类型.比如 ...

  5. Volatile关键字&&DCL单例模式,volatile 和 synchronized 的区别

    Volatile 英文翻译:易变的.可变的.不稳定的. 一.volatile 定义及用法 多个线程的工作内存彼此独立,互不可见,线程启动的时候,虚拟机为每个内存分配一块工作内存,不仅包含了线程内部定义 ...

  6. bootstrap的时间控件使用(双日历)

    这段时间看了下bootstrap的时间控件,发现使用起来还是很简单的,趁着有时间的时候整理了一下,方便自己以后忘记的时候查阅... 废话不多说先上效果图 接下来是代码实现 第一步当然是导入css.js ...

  7. C. News Distribution(并查集)

    In some social network, there are nn users communicating with each other in mm groups of friends. Le ...

  8. hdu6704 2019CCPC网络选拔赛1003 K-th occurrence 后缀自动机+线段树合并

    解题思路: fail树上用权值线段树合并求right/endpos集合,再用倍增找到待查询串对应节点,然后权值线段树求第k大. #include<bits/stdc++.h> using ...

  9. 未读消息(小红点),前端与 RabbitMQ实时消息推送实践,贼简单~

    前几天粉丝群里有个小伙伴问过:web 页面的未读消息(小红点)怎么实现比较简单,刚好本周手头有类似的开发任务,索性就整理出来供小伙伴们参考,没准哪天就能用得上呢. 之前在 <springboot ...

  10. .Net在Windows上使用Jenkins做CI/CD的那些事

    背景 最近入职了一家新公司,公司各个方面都让我非常的满意,我也怀着紧张与兴奋的心情入职后,在第一天接到了领导给我的第一个任务——把整个项目的依赖引用重新整理并实施项目的CI/CD. 本篇的重点主要分享 ...