01、SpringCloud 系列:Eureka - 集群、服务发现

SpringCloud 系列列表:

文章名文章地址
01、Eureka - 集群、服务发现https://blog.csdn.net/qq_46023503/article/details/128319023
02、Ribbon - 负载均衡https://blog.csdn.net/qq_46023503/article/details/128332288
03、OpenFeign - 远程调用https://blog.csdn.net/qq_46023503/article/details/128387961
04、Hystrix - 断路器https://blog.csdn.net/qq_46023503/article/details/128408601
05、Sleuth - 链路追踪https://blog.csdn.net/qq_46023503/article/details/128409339
06、Gateway - 网关https://blog.csdn.net/qq_46023503/article/details/128430842
07、Alibaba - 介绍https://blog.csdn.net/qq_46023503/article/details/128434080
08、Nacos - 安装、启动https://blog.csdn.net/qq_46023503/article/details/128460411
09、Nacos - 配置文件中心https://blog.csdn.net/qq_46023503/article/details/128460649
10、Nacos - 注册中心https://blog.csdn.net/qq_46023503/article/details/128460494

1 Spring Cloud Eureka 简介

注册发现中心 Eureka 来源于古希腊词汇,意为“发现了”。在软件领域, Eureka 是 Netflix 在线影片公司开源的一个服务注册与发现的组件,和其他 Netflix 公司的服务组件(例如负载均衡、 熔断器、网关等) 一起,被 Spring Cloud 社区整合为 Spring Cloud Netflix 模块。 Eureka 是 Netflix 贡献给 Spring Cloud 的一个框架!Netflix 给 Spring Cloud 贡献了很多框架

2 Spring Cloud Eureka 概念的理解

2.1 服务的注册

当项目启动时(eureka 的客户端),就会向 eureka-server 发送自己的元数据(原始数据) (运行的 ip,端口 port,健康的状态监控等,因为使用的是 http/ResuFul 请求风格), eureka-server 会在自己内部保留这些元数据(内存中)。(有一个服务列表)(restful 风 格,以 http 动词的请求方式,完成对 url 资源的操作)

2.2 服务的续约

项目启动成功了,除了向 eureka-server 注册自己成功,还会定时的向 eureka-server 汇报自己,心跳,表示自己还活着。(修改一个时间)

2.3 服务的下线(主动下线)

当项目关闭时,会给 eureka-server 报告,说明自己要下机了

2.4 服务的剔除(被动下线,主动剔除)

当项目超过了指定时间没有向 eureka-server 汇报自己,那么 eureka-server 就会认为此节点死掉了,会把它剔除掉,也不会放流量和请求到此节点了

3 Spring Cloud Eureka 和 Zookeeper 的区别

3.1 什么是 CAP 原则(面试)

CAP 原则又称 CAP 定理指的是,这三个要素最多只能同时实现两点,不可能三者兼顾

  • 一致性(Consistency)
  • 可用性(Availability)
  • 分区容错性(Partition tolerance)(这个特性是不可避免的)

3.2 数据的一致性

  • Zk 注重数据的一致性。
  • Eureka 不是很注重数据的一致性。

3.3 服务的可用性

Eureka 注重服务的可用性,当 Eureka 集群只有一台活着,它就能对外提供服务

3.4 分区的容错性

在集群里面的机器,因为网络原因,机房的原因,可能导致数据不会里面同步,它在分布式必须需要实现的特性

4 Spring Cloud Eureka 快速入门

在这里插入图片描述

4.1 搭建 Eureka-server

1、创建项目,可以先创建一个Maven工程,在Maven工程中创建子模块
在这里插入图片描述

2、选择依赖
在这里插入图片描述

3、修改 pom.xml
在这里插入图片描述

4、修改启动类
在这里插入图片描述

5、修改配置文件
在这里插入图片描述

6、访问测试
http://localhost:8761
在这里插入图片描述

Eureka-Server 不仅提供让别人注册的功能,它也能注册到别人里面,自己注册自己,所以,在启动项目时,默认会注册自己,配置中可以关掉这个功能。

4.2 搭建 Eureka-client

1、创建项目
在这里插入图片描述

2、选择依赖
在这里插入图片描述

3、修改 pom.xml
在这里插入图片描述

4、修改启动类
在这里插入图片描述

5、修改配置文件
在这里插入图片描述

6、访问测试
http://localhost:8761
在这里插入图片描述

5 常用配置

eureka:
  client:
    service-url: #eureka 服务端和客户端的交互地址,集群用,隔开
      defaultZone: http://localhost:8761/eureka
    fetch-registry: true #是否拉取服务列表
    register-with-eureka: true #是否注册自己(单机 eureka 一般关闭注册自己,集群注意打开)
  server:
    eviction-interval-timer-in-ms: 30000 #清除无效节点的频率(毫秒)--定期删除
    enable-self-preservation: true # server 的自我保护机制,避免因为网络原因造成误剔除,生产环境建议打开
    renewal-percent-threshold: 0.85 # 85%,如果在一个机房的 client 端,15 分钟内有 85%的 client 没有续约,那么则可能是网络原因,认为服务实例没有问题,不会剔除他们,宁可放过一万,不可错杀一个,确保高可用
  instance:
    hostname: localhost # 服务主机名称
    instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port} # 实例 id
    prefer-ip-address: true # 服务列表以 ip 的形式展示
    lease-renewal-interval-in-seconds: 10 # 表示 eureka client 发送心跳给 server 端的频率
    lease-expiration-duration-in-seconds: 20 #表示 eureka server 至上一次收到 client 的心跳之后,等待下一次心跳的超时时间,在这个时间内若没收到下一次心跳,则将移除该实例

5 构建高可用的 Eureka-Server 集群

在这里插入图片描述
1、创建三个 eureka-server 服务,端口分别为8761、8762、8763
注意:服务名称需要保持一致

2、每一个服务中的 service-url – defaultZone 写入其他两个的地址(也可以写上自己的,localhost 用对应配置的 peer 代替)

注意
地址写 localhost,eureka 会认为只有一个机器,所以这里面不能写成一样,要修改 hosts 文件: C:\Windows\System32\drivers\etc,如果你修改了 hosts 文件,发现没有生效,记得在 cmd 里面刷新一下:ipconfig /flushdns
在这里插入图片描述
最终显示
在这里插入图片描述

6 集群的使用

1、改造 client 的配置文件

eureka:
  client:
    service-url: #主要修改的地方,让客户端注册所有的服务端
      defaultZone: http://peer1:8761/eureka,http://peer2:8762/eureka,http://peer3:8763/eureka

2、测试
不管那一台机器都注册成功了

3、宕机一台机器
Eureka server 的集群里面,没有主机和从机的概念,节点都是对等的,只有集群里面有一个集群存活,就能保证服务的可用性。 (主机 (写) 从 (读)) 只要有一台存活,服务就能注册和调用

7 服务发现

概述

根据服务名称发现服务的实例过程叫服务发现。客户端会在本地缓存服务端的列表。拉取列表是有间隔周期的,导致服务上线,客户端不能第一时间感知到 (可以容忍),其实每次做服务发现,都是从本地的列表来进行。主要通过 DiscoveryClient 类来操作
在这里插入图片描述

服务发现例子

配置一台服务端(a),在配置两台客户端(b,c),b 通过得到 c 的服务名称来得到 c 的服务实例

1、客户端 b 控制层代码

@RestController
public class TestController {
    /**
     * 注入服务发现组件,我们的 eureka 已经实现了这个接口,所以 IOC 里面有这个对象
     */
    @Autowired
    private DiscoveryClient discoveryClient;
    /**
     * 服务发现
     */
    @GetMapping("find")
    public String find(String serviceId) {
        //调用服务发现
        List<ServiceInstance> instances = discoveryClient.getInstances(serviceId);
        instances.forEach(System.out::print);
        return instances.toString();
    }
}

2、访问
访问格式为:客户端 b 地址:b 的端口号/find?serviceId=客户端 c 的名字
如:http://localhost:8002/find?serviceId=eurekaclientc
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

玄天灵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值