【SpringCloud】SpringCloud基础教程(3)
前言:
本文内容:Eureka:服务注册-信息配置-自我保护机制、集群环境配置、CAP原则及对比Zookeeper
推荐免费SpringCloud基础教程视频:【狂神说Java】SpringCloud最新教程IDEA版_哔哩哔哩_bilibili
Eureka:服务注册-信息配置-自我保护机制
服务注册
-
打开
springcloud-provider-dept-8001
的pom
文件引入eureka
1
2
3
4
5<!-- eureka-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency> -
在
application
中添加eureka
配置1
2
3
4
5
6
7# Eureka配置
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka/
instance:
instance-id: springcloud-provider-dept8001 -
开启注解支持,在主启动类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18package com.jokerdig.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
/**
* @author Joker大雄
* @data 2022/8/3 - 11:34
**/
// 启动类
//开启eureka
public class DeptProvider_8001 {
public static void main(String[] args) {
SpringApplication.run(DeptProvider_8001.class,args);
}
} -
先启动
7001
,然后启动8001
,运行测试1
SPRINGCLOUD-PROVIDER-DEPT n/a (1) (1) UP (1) - localhost:springcloud-provider-dept:8001
信息配置
-
打开
springcloud-provider-dept-8001
的pom
文件引入actuator
1
2
3
4
5<!-- actuator 完善监控信息-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency> -
在
application
中添加配置1
2
3
4# info信息配置
info:
app.name: jokerdig-springcloud
company.name: jokerdig.com -
运行测试
http://localhost:7001中点击springcloud-provider-dept8001
1
{"app":{"name":"jokerdig-springcloud"},"company":{"name":"jokerdig.com"}}
自我保护机制
自我保护机制的工作机制:如果在15分钟内超过85%的客户端节点都没有正常的心跳,那么Eureka就认为客户端与注册中心出现了网络故障,Eureka Server自动进入自我保护机制,此时会出现以下几种情况:
- Eureka Server不再从注册列表中移除因为长时间没收到心跳而应该过期的服务。
- Eureka Server仍然能够接受新服务的注册和查询请求,但是不会被同步到其它节点上,保证当前节点依然可用。
- 当网络稳定时,当前Eureka Server新的注册信息会被同步到其它节点中。
服务发现
-
打开
springcloud-provider-dept-8001
的DeptController
创建方法1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
private DiscoveryClient client;
// 注册进来的微服务
public Object Discovery(){
// 获取微服务列表
List<String> services = client.getServices();
System.out.println("discovery->"+services);
// 得到微服务信息 微服务id
List<ServiceInstance> instances = client.getInstances("SPRINGCLOUD-PROVIDER-DEPT");
for(ServiceInstance instance : instances){
System.out.println(
instance.getHost()+"\t"+
instance.getPort()+"\t"+
instance.getUri()+"\t"+
instance.getServiceId()
);
}
return this.client;
} -
在主启动类中配置注解
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20package com.jokerdig.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
/**
* @author Joker大雄
* @data 2022/8/3 - 11:34
**/
// 启动类
//开启eureka
// 服务发现
public class DeptProvider_8001 {
public static void main(String[] args) {
SpringApplication.run(DeptProvider_8001.class,args);
}
} -
先启动7001,在启动8001,进行测试
http://localhost:8001/dept/discovery
页面显示
1
{"discoveryClients":[{"services":["springcloud-provider-dept"],"order":0},{"services":[],"order":0}],"services":["springcloud-provider-dept"],"order":0}
控制台显示
1
2discovery->[springcloud-provider-dept]
localhost 8001 http://localhost:8001 SPRINGCLOUD-PROVIDER-DEPT
Eureka:集群环境配置
-
新建
Module
,springcloud-eureka-7002
和springcloud-eureka-7003
把7001的内容复制到7002和7003,并修改对应配置文件里的端口号
-
修改电脑Host(
C:\\Windows\\System32\\driversetc
)文件,添加以下代码(测试完最后记得删掉)1
2
3
4# eureka
127.0.0.1 eureka7001.com
127.0.0.1 eureka7002.com
127.0.0.1 eureka7003.com -
修改三个模块的
application.yaml
这里演示7001的,7002和7003类似,也是要修改的
1
2
3
4
5
6
7
8
9
10
11
12
13
14server:
port: 7001
# eureka配置
eureka:
instance:
hostname: eureka7001.com #服务端实例名称
client:
register-with-eureka: false # 是否向eureka注册中心注册自己
fetch-registry: false # 如果为false 则表示自己为注册中心
service-url:
# http://${eureka.instance.hostname}:${server.port}/eureka/
# 集群 需要取关联别人
defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/ -
打开
springcloud-provider-dept-8001
中的application
文件修改eureka
的配置1
2
3
4
5
6
7# Eureka配置
eureka:
client:
service-url:
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
instance:
instance-id: springcloud-provider-dept8001 -
分别启动7001,7002,7003和8001的模块进行测试
访问7001可以关联7002和7003,以此类推,就算其中一个无法使用了,另外两个并不受影响
Eureka:CAP原则及对比Zookeeper
回顾CAP
RDBMS(Mysql,Oracle,SQLServer)==>ACID
NoSQL(Redis,Mongdb)==>CAP
ACID是什么
- A(Atomicity) 原子性
- C(Consistency) 一致性
- I(Isolation) 隔离性
- D(Durability) 持久性
CAP是什么
- C(Consistency) 强一致性
- A(Availability) 可用性
- P(Partition tolerance) 分区容错性
CAP的三进而:CA AP CP
CAP理论的核心
- 一个分布式系统不可能同时很好的满足一致性,可用i性和分区容错性者三个需求
- 根据CAP原理,将NoSQL数据库分成了满足CA、CP、AP原则这三大类:
- CA:单点集群,满足一致性,可用性的系统,通常可扩展性较差
- CP:满足一致性,分区容错性的系统,通常性能不高
- AP:满足可用性,分区容错性的系统,通常可能对一致性要求低一些
Eureka相比Zookeeper的优势
著名的CAP理论指出,一个分布式系统不可能同时满足C(一致性)、A(可用性)和P(分区容错性)。
由于分区容错性在是分布式系统中必须要保证的,因此我们只能在A和C之间进行权衡。
在此Zookeeper
保证的是CP
, 而Eureka
则是AP
。
比较 | Zookeeper | Eureka |
---|---|---|
设计原则 | CP | AP |
优点 | 强一致性 | 服务高可用 |
缺点 | 网络分区会影响leader选举,超过阈值后集群不可用 | 服务节点之间的数据可能不一致,Client 和 Server 之间的数据可能不一致 |
适用场景 | 单机房集群,对数据一致想要求较高 | 云机房集群,跨机房部署,对服务的可用性要求较高 |
Eureka可以很好的应对因网络故障导致部分节点失去联系的情况,而不会像zookeeper那样使整个注册服务瘫痪。