1.Spring Cloud Eureka 简介
注册发现中心
Eureka 来源于古希腊词汇,意为“发现了”。在软件领域, Eureka 是 Netflix 在线影片
公司开源的一个服务注册与发现的组件,和其他 Netflix 公司的服务组件(例如负载均衡、
熔断器、网关等) 一起,被 Spring Cloud 社区整合为 Spring Cloud Netflix 模块。
Eureka 是 Netflix 贡献给 Spring Cloud 的一个框架!Netflix 给 Spring Cloud 贡
献了很多框架,后面我们会学习到!
2.Spring Cloud Eureka 和 Zookeeper 的区别
2.1 什么是 CAP 原则(面试)
在分布式 微服务里面 CAP 定理
问:为什么 zookeeper 不适合做注册中心?
CAP 原则又称 CAP 定理,指的是在一个分布式系统中,
一致性(Consistency)
可用性(Availability)
分区容错性(Partition tolerance)(这个特性是不可避免的)
CAP 原则指的是,这三个要素最多只能同时实现两点,不可能三者兼顾。
2.2 分布式特征
C : 数据的一致性 (A,B,C 里面的数据是一致的)
Zk 注重数据的一致性。
Eureka 不是很注重数据的一致性!
A: 服务的可用性(若 zk 集群里面的 master 挂了怎么办)Paxos(多数派)
在 zk 里面,若主机挂了,则 zk 集群整体不对外提供服务了,需要选一个新的出来(120s
左右)才能继续对外提供服务!
Eureka 注重服务的可用性,当 Eureka 集群只有一台活着,它就能对外提供服务
P:分区的容错性(在集群里面的机器,因为网络原因,机房的原因,可能导致数据不会里面
同步),它在分布式必须需要实现的特性!
Zookeeper 注重数据的一致性,CP zk(注册中心,配置文件中心,协调中心)
Eureka 注重服务的可用性 AP eureka (注册中心)
3.Spring Cloud 其他注册中心
Spring Cloud 还有别的注册中心 Consul ,阿里巴巴提供 Nacos 都能作为注册中心,我们的选择还是很多。
- Consul
- Nacos
但是我们学习还是选择 Eureka ,因为它的成熟度很高。面试时候问的也是它,不是别人!eureka nacos
4.Spring Cloud Eureka 快速入门
4.1 搭建 Eureka-server
搭建过程不做细说
4.1.2 选择依赖
4.1.3 分析 pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.12.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.ppowernode</groupId>
<artifactId>01-eureka-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>01-eureka-service</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<!-- 这里控制了 springcloud 的版本-->
<spring-cloud.version>Hoxton.SR12</spring-cloud.version>
</properties>
<dependencies>
<!-- eureka 注册中心的服务端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<!-- 依赖管理 cloud 的依赖,只是帮你去管理版本号以及子模块下的依赖-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<!-- 只要用了springclooud组件就加入一个springcloud的依赖-->
<artifactId>spring-cloud-dependencies</artifactId>
<!-- 用$取值springcloud的版本号-->
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
${spring-cloud.version} 读取的是 <spring-cloud.version>Hoxton.SR12</spring-cloud.version>这个
我学习的版本是 Hoxton.SR12,因此对应的SpringBoot版本是
2.3.12.RELEASE版本。
4.1.4 修改启动类
@SpringBootApplication
@EnableEurekaServer //开启eureka注册中心的功能
public class EurekaServiceApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServiceApplication.class, args);
}
}
4.1.5 修改配置文件
server:
port: 8761 #为什么是 8761? 默认是8761端口 默认自己注册自己
spring:
application:
name: eureka-server #服务名称 不能用特殊字符
4.1.6 访问测试
DS Replicas:集群
Application:应用名称
4.1.7 分析端口 8761
Eureka-Server 不仅提供让别人注册的功能,它也能注册到别人里面,自己注册自己
所以,在启动项目时,默认会注册自己,我们也可以关掉这个功能。
那么往哪个地址注册自己呢?我们看一下源码
指定注册地址后面必须加/eureka 不然注册不进去
4.2 搭建 Eureka-client
4.2.1 创建项目 client-a/-b 选择 依赖
4.2.2 分析 pom.xml
eureka客户端的依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
跟server的pom几乎一样除了这个是客户端的依赖。
4.2.3 修改启动类
@SpringBootApplication
@EnableEurekaClient //开启客户端功能
public class EurekaClientAApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaClientAApplication.class, args);
}
}
4.2.4 修改配置文件
server:
port: 8001 #客户端的端口没有要求
spring:
application:
name: eureka-client-a
#注册的含义是啥?就是将自己的一些信息(ip port)发送到eureka里面注册
#下面的意思就是 uereka客户端需要注册到端口为8761的eureka注册中心
eureka:
client:
service-url: #eureka 服务端和客户端的交互地址
defaultZone: http://localhost:8761/eureka/
#
4.2.5 访问测试
4.2.6 再创建项目 client-b
已经创建 不做叙述
如 client-a 一样,这里就不贴多余截图了,注意端口和服务名以及启动类上的注解,在测试
查看是否注册上去,在 eureka 里面是通过 spring.application.name 来区分服务的
4.3注册中心的状态认识
UP: 服务是上线的,括号里面是具体服务实例的个数,提供服务的最小单元
DOWN: 服务是下线的
UN_KONW: 服务的状态未知
4.4.1 服务的实例名称
4.5 常用配置文件设置
4.5.1 server 中常用的配
server:
port: 8761
#应用名称 一般写服务名字 不要特殊字符
spring:
application:
name: eureka-server
eureka: #eureka的配置分为三类 server clinet 实例的 euereka-server既是服务端又是客户端
server:
eviction-interval-timer-in-ms: 10000 #服务端间隔多少毫秒定期删除操作
renewal-percent-threshold: 0.85 #续约百分比 超过百分之85的服务没有续约 eureka就会保护服务 不会删除
instance: #实例配置
instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port} #主机名 应用名 端口号
hostname: localhost #主机名称或ip
prefer-ip-address: true # 以ip形式显示
lease-renewal-interval-in-seconds: 5 #服务实例续约的续约时间
4.5.2 client 中常用的配置
server:
port: XXXX
spring:
application:
name: eureka-client-a
eureka:
client:
service-url: # 指定注册地址
defaultZone: http://peer1:8761/eureka,http://peer2:8762/eureka,http://peer3:8763/eureka
register-with-eureka: true # #false表示不向注册中心注册自己。反之就是把自己也注册进去
fetch-registry: true #应用是否去注册中心拉去服务列表到本地
register-fetch-interval-seconds: 10 #为了缓解服务列表的脏读问题 时间越短脏读越少 性能消耗大 每隔10秒去注册中心拉去服务列表 表示 eureka-client 间隔多久去拉取服务注册信息
instance:
hostname: localhost #应用的主机名称 最好写ip
instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port}
prefer-ip-address: true # 以ip形式显示
lease-renewal-interval-in-seconds: 10 #表示 eureka server 至上一次收到 client 的心跳之后,等待下一次心跳的超时时间,在这个时间内若没收到下一次心跳,则将移除该实例
5.构建高可用的 Eureka-Server 集群
5.1 对刚才的 eureka-server 修改配置文件
5.1.1 server-1/A
5.1.2 server-2/B
5.1.3 server-3/C
5.1.4 测试访问查看
**发现并没有出现集群信息,只是同一个服务 server 启动了多台 没有数据交互 不是真正意
义上的集群原因是因为: http://localhost:8761/eureka/,http://localhost:8762/eureka/
这样写,eureka 认为只有一个机器,就是 localhost
所以这里面不能写成一样
修改 hosts 文件: C:\Windows\System32\drivers\etc
如果你修改了 hosts 文件 发现没有生效 记得在 cmd 里面刷新一下
5.1.5 重新修改配置文件
5.1.7 最终优化配置文件
没错前面的又白学了。。。。。。
5.2 集群的使用
5.2.1 改造 eureka-client-a 的配置文件
5.2.2 测试
不管哪一台 server 都注册成功了
5.2.3 宕机一台 server
Eureka server 的集群里面,没有主机和从机的概念,节点都是对等的,只有集群里面有一
个集群存活,就能保证服务的可用性。 (主机 (写) 从 (读))只要有一台存活,服务就能注册和调用
可以看到8761和8762还有client-a
了解一下一个分布式数据一致性协议 Paxos raftzk 是 Paxos
eureka 没有分布式数据一致性的机制 节点都是相同的
nacos raft
在有主从模式的集群中 一般都要遵循这样的协议 才可以稳定对外提供服务
Zookeeper Paxos
Nacos raft
6.Eureka 概念的理解
6.1 服务的注册
当项目启动时(eureka 的客户端),就会向 eureka-server 发送自己的元数据(原始数据)
(运行的 ip,端口 port,健康的状态监控等,因为使用的是 http/ResuFul 请求风格),
eureka-server 会在自己内部保留这些元数据(内存中)。(有一个服务列表)(restful 风
格,以 http 动词的请求方式,完成对 url 资源的操作)
6.2 服务的续约
项目启动成功了,除了向 eureka-server 注册自己成功,还会定时的向 eureka-server 汇
报自己,心跳,表示自己还活着。(修改一个时间)
6.3 服务的下线(主动下线)
当项目关闭时,会给 eureka-server 报告,说明自己要下机了
6.4 服务的剔除(被动下线,主动剔除)
当项目超过了指定时间没有向 eureka-server 汇报自己,那么 eureka-server 就会认为此
节点死掉了,会把它剔除掉,也不会放流量和请求到此节点了。
6.5什么是服务发现
根据服务名称发现服务的实例过程
客户端会在本地缓存服务端的列表
拉取列表是有间隔周期的 (导致服务上线 客户端不能第一时间感知到 (可以容忍))
其实每次做服务发现 都是从本地的列表来进行的
|
eureka-server配置文件
eureka-clinet-b
eureka-clinet-a
controller层代码
@RestController
public class DiscoveryController {
//注入服务发现组件,我们的 eureka 已经实现了这个接口,所以 IOC 里面有这个对象
@Resource
private DiscoveryClient discoveryClient;
/**
* 通过应用名称找到服务的ip和port 找谁写谁
* @param serviceName
* @return
*/
@RequestMapping("/test")
public String doDiscovery(String serviceName){
//通过服务发现 找到应用名称 为啥是集合 一个应用可以对应多个实例
List<ServiceInstance> instances = discoveryClient.getInstances(serviceName);
//
instances.forEach(System.out::println);
ServiceInstance serviceInstance =instances.get(0);
String ip = serviceInstance.getHost();
int port = serviceInstance.getPort();
System.out.println(ip+":"+port);
//找b的ip和端口
return instances.get(0).toString();
}
}
7.6.2 测试服务发现
已经找到client-b的信息了 简称服务发现。