Spring Cloud Eureka 部分总结

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 都能作为注册中心,我们的选择还是很多。

  1. Consul
  2. 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的信息了 简称服务发现。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值