Eureka学习笔记

    科技2025-06-10  24

    Eureka服务注册与实现

    一. Eureka基础知识

    1. 什么是服务治理

    封装了Netfix公司的Eureka模块来实现服务治理

    多个消费者与多个服务提供者之间的相互调用,需要一个管理机制

    可以实现服务调用,负载均衡,容错等,实现服务发现与注册

    2. 什么是服务注册与发现

    Eureka采用了CS的设计架构,Eureka Server作为服务注册功能的服务器,是服务注册中心系统中其他微服务,使用Eureka的客户端连接到Eureka Server维护人员可以提供Eureka Server 来监控系统中各个微服务是否正常运行

    有一个注册中心,当服务器启动时,会将当前自己服务器的信息,以别名的方式注册到注册中心上另一方以改别名的方式去注册中心上获取到时机的服务通讯地址服务治理概念 使用注册中心管理每个服务与服务之间的一个依赖关系在任何rpc远程框架中,都会有一个注册中心

    3. Eureka的两个组件

    Eureka Server提供服务注册服务 各个微服务节点通过配置启动后,会在Eureka Server中进行注册服务注册表中会存储所有可用服务节点的信息,可在界面直观看到 Eureka Client通过注册中心访问 是一个Java客户端,客户端同时具备一个内置的,使用轮询负载算法的负载均衡器应用启动后,会向Eureka Server发送心跳(默认30秒),如果在Eureka Server在多个心跳周期内没有接收到某个节点的心跳,会从服务注册表中将这个节点移除(超过一定时间不交费,就会把你清了)

    二. 单机Eureka构建步骤

    IDEA生成Eureka Server端服务注册中心类似于物业公司Eureka Client端 cloud-provider-payment8001 将注册禁Eureka Server成为服务提供者;类似于商城对外提供授课服务Eureka Client端 cloud-consumer-order80 将注册禁Eureka Server成为服务消费者;类似于来购物消费的人

    三. 集群Eureka构建

    1. 集群原理说明

    先启动Eureka注册中心启动服务提供者启动后会将自身学习注册进中心消费者在需要调用接口时,使用服务别名去注册中心获取时机的RPC远程调用地址消费者获得调用地址后,底层实际是利用HttpClient技术实现远程调用消费者获得服务地址后会缓存在本地JVM中,默认30秒更新一次调用地址

    微服务RPC远程服务调用最核心的是高可用

    如果注册中心只有一个,如果出故障了,会导致整个服务环境不可用搭建Eureka注册中心集群,实现负载均衡+故障容错

    集群的原理

    2. 注册中心集群环境

    需要修改hosts文件

    修改注册中心yml配置

    注册中心需要相互注册

    修改微服务的yml

    3. 提供者模块集群

    复制一个新的模块

    改一下端口号即可

    控制层改一下方便得知是调用的是哪个提供者模块

    消费者模块配置类开启负载均衡机制

    调用时地址不可写死

    @LoadBalanced 注解

    负载均衡效果达到,端口交替出现

    四. actuator微服务信息完善

    主机名称:服务名称修改

    yml文件中添加

    *

    设置访问信息有IP提示

    yml文件中添加即可

    instance: instance-id: payment8002 prefer-ip-address: true # 访问路径可以显示IP地址

    五. 服务发现Discovery

    对于注册进Eureka里面的微服务,可以通过Discovery来获取改服务的信息

    六. Eureka自我保护

    1. 故障现象

    一旦进入保护模式,不会删除服务注册表中的数据

    某时刻有一个微服务不可用了,Eureka不会立即清理,依旧会对该微服务的信息进行保存属于CAP里面的AP分支 保证高可用

    2. 为什么会产生自我保护机制

    宁可放过一个,绝不可错杀一千;使得Eureka集群更加健壮,稳定

    在Eureka Client与Eureka Server网络不通的情况下,Eureka Server不会立刻将其踢出

    3. 什么是自我保护模式

    当Eureka Server节点在短时间内丢失过多客户端时,则会进入自我保护模式微服务本身是没毛病的,只是由于网络分区故障导致无法正常通信

    4. 禁止自我保护功能

    自我保护机制默认开启

    注册中心配置

    server: # 关闭自我保护机制,保证不可用服务被及时踢出 enable-self-preservation: false # 间隔时间 eviction-interval-timer-in-ms: 2000

    提供者微服务配置

    instance: instance-id: payment8001 prefer-ip-address: true # 访问路径可以显示IP地址 # Eureka客户端向服务端发送心跳的时间间隔,单位为秒(默认30) lease-expiration-duration-in-seconds: 1 # Eureka服务端在收到最后一次心跳后等待时间上限,单位为秒(默认90)超时踢出服务 lease-renewal-interval-in-seconds: 2

    如果提供者发送宕机,则注册中心立马踢出该提供者(灭绝师太模式)

    七. Zookeeper代替Eureka

    1. 注册中心Zookeeper

    是一个分布式协调工具,可以实现注册中心功能关闭Liunx服务器防火墙后启动Zookeeper服务器Zookeeper服务器取代Eureka服务器,zk作为服务注册中心

    2. 将提供者注册进Zookeeper

    依赖(注意依赖版本不要小于虚拟机或者服务器上的版本)

    <!--SpringBoot整合Zookeeper客户端--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId> <exclusions> <!--先排除自带的zookeeper3.5.3--> <exclusion> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> </exclusion> </exclusions> </dependency> <!--添加zookeeper3.4.9版本--> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.5.7</version> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> </exclusions> </dependency>

    yml文件

    server: port: 8004 spring: application: # 服务别名---注册zookeeper到注册中心的名称 name: cloud-provider-payment cloud: zookeeper: # 默认localhost:2181 connect-string: 121.19.209.178:2181

    主启动类(开启@EnableDiscoveryClient)

    @SpringBootApplication @EnableDiscoveryClient // 该注解用于向使用consul或者zookeeper作为注册中心时注册服务 public class PaymentMain8004 { public static void main(String[] args) { SpringApplication.run(PaymentMain8004.class,args); } }

    控制层

    @RestController public class PaymentController { @Value("${server.port}") private String serverPort; /** * http://localhost:8004/payment/zk * * @return */ @RequestMapping(value = "payment/zk") public String paymentZk() { return "SpringCloud with zookeeper:" + serverPort + "\t" + UUID.randomUUID().toString(); } }

    3. 将消费者注册进Zookeeper

    yml及pom文件与提供者大概一致

    配置类

    使用RestTemplate使用远程调用 @Configuration public class ApplicationContextBean { @Beanjava @LoadBalanced public RestTemplate getRestTemplate() { return new RestTemplate(); } }

    控制层

    @RestController @Slf4j public class OrderZkController { public static final String INVOKE_URL = "http://cloud-provider-payment"; @Resource private RestTemplate restTemplate; @GetMapping(value = "consumer/payment/zk") public String paymentInfo() { String result = restTemplate.getForObject(INVOKE_URL + "/payment/zk", String.class); return result; }java }

    4. 服务节点是临时节点还是持久节点

    是临时节点

    当你服务停止之后,并不会立刻踢你,zookeeper会在一定时间范围里给你发心跳包,如果发着发着没有回音,则踢出

    @GetMapping(value = “consumer/payment/zk”) public String paymentInfo() { String result = restTemplate.getForObject(INVOKE_URL + “/payment/zk”, String.class); return result; }java

    }

    4. 服务节点是临时节点还是持久节点

    是临时节点

    当你服务停止之后,并不会立刻踢你,zookeeper会在一定时间范围里给你发心跳包,如果发着发着没有回音,则踢出

    比Eureka更加干脆

    Processed: 0.011, SQL: 8