文章目录
- 1、Eureka基础知识
-
- 2、Eureka介绍及原理
-
- 3、单机版Eureka 构建步骤
- 4、集群版Eureka 构建步骤
- Eureka集群原理说明
- EurekaServer集群环境构建步骤
- 将支付服务8001微服务发布到上面2台Eureka集群配置中
- 将订单服务80微服务发布到上面2台Eureka集群配置中
- 测试01
- 支付服务提供者8001集群环境构建
- 负载均衡
- 测试02
- 5、actuator微服务信息完善
-
- 6、服务发现Discovery
-
- 7、Eureka自我保护
-
SpringCloud(二)入门案例之支付模块与订单模块的调用:https://blog.csdn.net/weixin_45606067/article/details/108483126
1、Eureka基础知识
什么是服务治理
Spring Cloud封装了Netflix公司开发的Eureka模块来实现服务治理
在传统的 rpc 远程调用框架中,管理每个服务与服务之间依赖关系比较复杂,管理比较复杂,所以需要使用服务治理,管理服务于服务之间依赖关系,可以实现服务调用、负载均衡、容错等,实现服务发现与注册。
什么是服务注册
Eureka采用了CS的设计架构,Eureka Sever作为服务注册功能的服务器,它是服务注册中心。而系统中的其他微服务,使用 Eureka 的客户端连接到 Eureka Sever并维持心跳连接。这样系统的维护人员就可以通过Eureka Server来监控系统中各个微服务是否正常运行。
在服务注册与发现中,有一个注册中心。当服务器启动的时候,会把当前自己服务器的信息比如服务地址通讯地址等以别名方式注册到注册中心上。另一方(消费者服务提供者),以该别名的方式去注册中心上获取到实际的服务通讯地址,然后再实现本地RPC调用RPC远程调用框架核心设计思想:在于注册中心,因为使用注册中心管理每个服务与服务之间的一个依赖关系(服务治理概念)。在任何rpc远程框架中,都会有一个注册中心(存放服务地址相关信息(接口地址)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200910155308706.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTYwNjA2Nw==,size_16,color_FFFFFF,t_70#pic_center)
Eureka两大组件
Eureka包含两个组件:Eureka Server
和 Eureka Client
Eureka Server 提供服务注册服务
各个微服务节点通过配置启动后,会在EurekaServer中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观看到。
EurekaClient 通过注册中心进行访问
是一个Java客户端,用于简化Eureka Server的交互,客户端同时也具备一个内置的、使用轮询(round-robin)负载算法的负载均衡器。在应用启动后,将会向Eureka Server发送心跳(默认周期为30秒)。如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,EurekaServer将会从服务注册表中把这个服务节点移除(默认90秒))
2、Eureka介绍及原理
理解
Eureka就像一个物业管理公司,其他微服务就像小区的住户,每个住户入住时都要向物业管理公司注册,并定时向物业公司交管理费
介绍
- Eureka是一个基于REST的服务,用于定位服务,以实现云端中间层服务发现和故障转移。
- Eureka主管服务注册与发现,在微服务中,以后这两者只需要使用服务的标识符(就是那个在每个服务的yml文件中取得服务名称),就可以访问到服务,不需要修改服务调用的配置文件
- Eureka遵循AP原则(高可用,分区容错性),因为使用了自我保护机制所以保证了高可用
原理
- Eureka使用的是C-S结构(客户端-服务端)
- 两大组件:Eureka Server(提供注册服务)、 Eureka Client(JAVA客户端,负责发送心跳)
- 系统中的其他微服务使用Eureka客户端连接到Eureka服务端维持心跳连接(即注册)。SpringCloud的其他模块可以通过Eureka Server 来发现系统中的微服务并加以调用
3、单机版Eureka 构建步骤
IDEA生成eurekaServer端服务注册中心类似物业公司
- 建Module:cloud-eureka-server7001
- 改Pom
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>com.kuang.springcloud</groupId>
<artifactId>cloud-api-commons</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
</dependencies>
注意:1.X 和2.X 的对比说明
![在这里插入图片描述](https://img-blog.csdnimg.cn/2020091016154586.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTYwNjA2Nw==,size_16,color_FFFFFF,t_70#pic_center)
- 写YML
理解:物业公司肯定不向自己注册自己,并肯定知道自己在哪,不用参加检索
server:
port: 7001
eureka:
instance:
hostname: localhost
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
- 主启动
注意:要在类前加@EnableEurekaServer标注,表示是Eureka服务。
@SpringBootApplication
@EnableEurekaServer
public class EurekaMain7001 {
public static void main(String[] args) {
SpringApplication.run(EurekaMain7001.class, args);
}
}
- 测试
http://localhost:7001/
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200910191100752.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTYwNjA2Nw==,size_16,color_FFFFFF,t_70#pic_center)
EurekaClient端 cloud-provider-pavment8001
将注册进EurekaServer成为服务提供者provider,类似尚硅谷学校对外提供授课服务
- 选中cloud-provider-payment8001
- 改pom
在之前的坐标基础上加上Eureka-client的
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200911083923594.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTYwNjA2Nw==,size_16,color_FFFFFF,t_70#pic_center)
- 写YML
理解:小区用户要找到物业管理处的地址进行注册
eureka:
client:
register-with-eureka: true
fetchRegistry: true
service-url:
defaultZone: http://localhost:7001/eureka
在之前基础上添加上面配置即可
- 主启动
添加 @EnableEurekaClient
注解
@SpringBootApplication
@EnableEurekaClient
public class PaymentMain8001 {
public static void main(String[] args) {
SpringApplication.run(PaymentMain8001.class, args);
}
}
- 测试
先启动EurekaServer
http://localhost:7001/
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200911090145711.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTYwNjA2Nw==,size_16,color_FFFFFF,t_70#pic_center)
微服务注册名配置说明
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200911085605419.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTYwNjA2Nw==,size_16,color_FFFFFF,t_70#pic_center)
- 自我保护机制
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200911090529431.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTYwNjA2Nw==,size_16,color_FFFFFF,t_70#pic_center)
EurekaClient端cloud-consumer-order80
将注册进EurekaServer成为服务消费者consumer,类似来尚硅谷上课消费的各位同学
- 选中cloud-consumer-order80
- Pom
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
spring:
application:
name: cloud-order-service
eureka:
client:
register-with-eureka: true
fetchRegistry: true
service-url:
defaultZone: http://localhost:7001/eureka
bug
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200911092304233.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTYwNjA2Nw==,size_16,color_FFFFFF,t_70#pic_center)
4、集群版Eureka 构建步骤
Eureka集群原理说明
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200911092850175.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTYwNjA2Nw==,size_16,color_FFFFFF,t_70#pic_center)
问题:微服务RPC远程服务调用最核心的是什么
高可用,试想你的注册中心只有一个only one,它出故障了那就呵呵了,会导致整个微服务环境不可用,所以。
解决办法:搭建Eureka注册中心集群,实现负载均衡+故障容错。
EurekaServer集群环境构建步骤
- 新建cloud-eureka-server7002
- 改Pom
坐标参考cloud-eureka-server7001 - 修改映射配置
找到C:\Windows\System32\drivers\etc路径下的hosts文件
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200911094830661.png#pic_center)
修改映射配置添加进hosts文件
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200911094652174.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTYwNjA2Nw==,size_16,color_FFFFFF,t_70#pic_center)
- 写YML
7001
server:
port: 7001
eureka:
instance:
hostname: eureka7001.com
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://eureka7002.com:7002/eureka/
7002
server:
port: 7002
eureka:
instance:
hostname: eureka7002.com
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://eureka7001.com:7001/eureka/
@SpringBootApplication
@EnableEurekaServer
public class EurekaMain7002 {
public static void main(String[] args) {
SpringApplication.run(EurekaMain7002.class, args);
}
}
- 测试
启动服务
http://eureka7001.com:7001/
http://eureka7002.com:7002/
将支付服务8001微服务发布到上面2台Eureka集群配置中
修改Yml文件配置集群版
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200911101050327.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTYwNjA2Nw==,size_16,color_FFFFFF,t_70#pic_center)
将订单服务80微服务发布到上面2台Eureka集群配置中
修改Yml文件配置集群版
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200911101050327.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTYwNjA2Nw==,size_16,color_FFFFFF,t_70#pic_center)
测试01
先要启动EurekaServer,7001/7002服务
再要启动服务提供者provider,8001
再要启动消费者,80
http://eureka7001.com:7001/
http://eureka7002.com:7002/
http://localhost/consumer/payment/get/1
支付服务提供者8001集群环境构建
- 新建cloud-provider-payment8002
- 改Pom
参照cloud-provider-payment8001 - 写YML
参照cloud-provider-payment8001,注意把端口改成8002 - 主启动
- 业务类
直接粘贴8001的 - 修改8001/ 8002 的Controller
@Value("${server.port}")
private String serverPort;
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200911104421739.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTYwNjA2Nw==,size_16,color_FFFFFF,t_70#pic_center)
- 测试即可
http://eureka7001.com:7001/
http://eureka7002.com:7002/
http://localhost:8002/payment/get/1
http://localhost/consumer/payment/get/1
负载均衡
Bug
订单服务访问地址不能写死
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200911105723797.png#pic_center)
使用 @LoadBalanced 注解赋予RestTemplate负载均衡的能力
ApplicationContextConfig类中添加,这里提前说一下Ribbon的负载均衡功能。
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
测试02
先要启动EurekaServer,7001/7002服务
再要启动服务提供者provider,8001
再要启动消费者,80
http://localhost/consumer/payment/get/1
结果:负载均衡效果达到,8001/ 8002端口交替出现
Ribbon 和Eureka整合后Consumer可以直接调用服务而不用再关心地址和端口号,且改服务还有负载功能。
5、actuator微服务信息完善
主机名称:服务名称修改
instance:
instance-id: payment8001
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200911150841896.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTYwNjA2Nw==,size_16,color_FFFFFF,t_70#pic_center)
- 修改之后
![在这里插入图片描述](https://img-blog.csdnimg.cn/2020091115065422.png#pic_center)
访问信息有IP信息提示
- 当前问题
没有IP提示 - 修改8001 、 8002的YML文件
instance:
instance-id: payment8002
prefer-ip-address: true
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200911151516691.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTYwNjA2Nw==,size_16,color_FFFFFF,t_70#pic_center)
- 修改之后
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200911151731824.png#pic_center)
6、服务发现Discovery
功能
对于注册进eureka里面的微服务,可以通过服务发现来获取该服务的信息
实现
- 修改cloud-provider-payment8001的Controller
@Resource
private DiscoveryClient discoveryClient;
@GetMapping(value = "/payment/discovery")
public Object discovery(){
List<String> services = discoveryClient.getServices();
for (String element : services) {
log.info("*****element:"+element);
}
List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
for (ServiceInstance instance : instances) {
log.info(instance.getServiceId()+"\t"+instance.getHost()+"\t"+instance.getPort()+"\t"+instance.getUri());
}
return this.discoveryClient;
}
- 8001主启动类
@EnableDiscoveryClient - 自测
先要启动EurekaServer
在启动8001主启动类
http://localhost:8001/payment/discovery
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200911160416795.png#pic_center)
7、Eureka自我保护
故障现象
概述
保护模式主要用于一组客户端和Eureka Server之间存在网络分区场景下的保护。—旦进入保护模式,Eureka Server将会尝试保护其服务注册表中的信息,不再删除服务注册表中的数据,也就是不会注销任何微服务。
如果在Eureka Server的首页看到以下这段提示,则说明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
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200911161156494.png#pic_center)
导致原因
为什么会产生Eureka自我保护机制?
为了防止EurekaClient可以正常运行,但是与EurekaServer网络不通情况下,EurekaServer不会立刻将EurekaClient服务剔除
什么是自我保护模式?
默认情况下,如果EurekaServer在一定时间内没有接收到某个微服务实例的心跳,EurekaServer将会注销该实例(默认90秒)。但是当网络分区故障发生(延时、卡顿、拥挤)时,微服务与EurekaServer之间无法正常通信,以上行为可能变得非常危险了——因为微服务本身其实是健康的,此时本不应该注销这个微服务。Eureka通过“自我保护模式”来解决这个问题——当EurekaServer节点在短时间内丢失过多客户端时(可能发生了网络分区故障),那么这个节点就会进入自我保护模式。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200911162028394.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTYwNjA2Nw==,size_16,color_FFFFFF,t_70#pic_center)
在自我保护模式中,Eureka Server会保护服务注册表中的信息,不再注销任何服务实例。
它的设计哲学就是宁可保留错误的服务注册信息,也不盲目注销任何可能健康的服务实例。
综上,自我保护模式是一种应对网络异常的安全保护措施。它的架构哲学是宁可同时保留所有微服务(健康的微服务和不健康的微服务都会保留)也不盲目注销任何健康的微服务。使用自我保护模式,可以让Eureka集群更加的健壮、稳定。
一句话:某时刻某一个微服务不可用了,Eureka不会立刻清理,依旧会对该微服务的信息进行保存
属于CAP里面的AP分支
怎么禁止自我保护
注册中心EurekaServer端7001
出厂默认,自我保护机制是开启的,eureka.server.enable-self-preservation=true
使用eureka.server.enable-self-preservation=false 可以禁止自我保护模式
关闭效果
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200911163634523.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTYwNjA2Nw==,size_16,color_FFFFFF,t_70#pic_center)
在 eurekaServer端7001 处设置关闭自我保护机制
![在这里插入图片描述](https://img-blog.csdnimg.cn/2020091116410236.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTYwNjA2Nw==,size_16,color_FFFFFF,t_70#pic_center)
这里为了方便测试,修改为单机版。
生产者客户端eurekaClient端8001
默认
eureka.instance.lease-renewal-interval-in-seconds: 30 #单位为秒
eureka.instance.lease-expiration-duration-in-seconds: 90 #单位为秒
配置
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200911165035721.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTYwNjA2Nw==,size_16,color_FFFFFF,t_70#pic_center)
这里我们也修改为单机版。方便后续的测试
测试
- 7001和8001 都配置完成
- 先启动7001 在启动8001
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200911165242104.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTYwNjA2Nw==,size_16,color_FFFFFF,t_70#pic_center)
- 先关闭8001,马上就被删除了
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200911165305340.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTYwNjA2Nw==,size_16,color_FFFFFF,t_70#pic_center)
如果有收获!!! 希望老铁们来个三连,点赞、收藏、转发。
创作不易,别忘点个赞,可以让更多的人看到这篇文章,顺便鼓励我写出更好的博客
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)