Spring Cloud第一站Eureka
Eureka基础知识
- eureka现状
截至这篇文章为止Netflix已经停止了eureka的更新了。作为服务注册中心,因为eureka的停更,部分公司已经相继拥抱zookeeper、consul、nacos。 - eureka是什么
Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。SpringCloud将它集成在其子项目spring-cloud-netflix中,以实现SpringCloud的服务发现功能。 - eureka包含两大组件:Eureka Server 与 Eureka Client。
Eureka Server 提供服务注册服务,各个节点启动后,会在Eureka Server中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到。
Eureka Client是一个java客户端,用于简化与Eureka Server的交互,客户端同时也就是一个内置的、使用轮询(round-robin)负载算法的负载均衡器。
- 保护机制
在应用启动后,将会向Eureka Server发送心跳,默认周期为30秒,如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,Eureka Server将会从服务注册表中把这个服务节点移除(默认90秒)。
Eureka Server之间通过复制的方式完成数据的同步,Eureka还提供了客户端缓存机制,即使所有的Eureka Server都挂掉,客户端依然可以利用缓存中的信息消费其他服务的API。综上,Eureka通过心跳检查、客户端缓存等机制,确保了系统的高可用性、灵活性和可伸缩性。
Eureka 单机下构建
构建eureka server端
- 导入依赖坐标
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
- 编写yml配置
server:
port: 7001
eureka:
instance:
hostname: localhost #eureka服务端的实例名称
client:
#false 表示不向服务中心注册自己
register-with-eureka: false
#false 表示自己就是服务中心,不需要去检测服务,职责就是维护服务实例
fetch-registry: false
#设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
- 主启动类中加入 @EnableEurekaServer注解
浏览器中访问 http://localhost:7001 配置成功则可以看到
构建eureka client端 service provider
- 导入eureka 坐标
同server端导入 - 编写yml文件
eureka:
client:
register-with-eureka: true
fetch-registry: true
# 注册进入的eureka server地址
service-url:
defaultZone: http://localhost:7001/eureka/
- 主启动中加入 @EnableEurekaClient 注解
- 刷新 http://localhost:7001/ 页面
构建eureka client端 service consumer
操作步骤同上
可以看到
Eureka集群构建
eureka构建集群,其目的是为一台服务器中的eureka server挂掉了。可以使用另外的eureka 注册服务器。
互相指向,互相备份
本地模拟,eureka server 互相指向
修改了 etc/hosts 文件中的 127.0.0.1 ip,使其有了两个新的指向域名
127.0.0.1 eureka7001.com
127.0.0.1 eureka7002.com
其中7001端口号的yml文件中
其中7002端口号的yml文件中
使用浏览器分别访问,端口号7001、7002
http://localhost:7001 http://localhost:7002
可以看到两个eureka server 互相守望,表示注册成功
将eureka client端写入集群
修改yml 配置
service-url:
#有几个server端,就配置几个ip端口号进去
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/
到此,多eureka server 单生产者,模型产生了。此模型,当server服务器挂掉的时候,另一台服务器可以顶替。但是,当多个consumer请求去访问provide时,provider处理请求效率会大大降低。于是,多provider模型也应运而生。
多provider模型
多provider模型构建
新增application.name同8001端口的module,其他配置同8001端口
server:
port: 8002
servlet:
context-path: /
spring:
application:
name: provider-payment
修改,consumer连接服务的url
private static final String URI = "http://PROVIDER-PAYMENT";
在RestTemplate 配置中新增 @LoadBalanced注解
访问consumer时,就可以看到服务请求是轮循访问8001与8002端口号
修改eureka注册器中的status
instance:
instance-id: payment8002
prefer-ip-address: true
配置后,方便管理查看各服务器对应的ip与端口
配置位置
Eureka其他配置
eureka:
instance:
lease-expiration-duration-in-seconds: 90 #Eureka服务端在收到最后一次心跳后等待时间上限 ,单位为秒(默认是90秒),超时剔除服务
lease-renewal-interval-in-seconds: 30 #Eureka客户端向服务端发送心跳的时间间隔,单位为秒(默认是30秒)
server:
enable-self-preservation: true #保护机制默认开启(server端发送消息后,client没有回应,不会立马清除client)
推荐阅读
-
Spring Cloud如何使用Feign构造多参数的请求
-
Spring Cloud使用Feign实现Form表单提交的示例
-
Spring Cloud动态配置实现原理与源码分析
-
Spring-Cloud Eureka注册中心实现高可用搭建
-
Spring Cloud Ribbon实现客户端负载均衡的示例
-
Spring Cloud Gateway网关XSS过滤Filter
-
Spring Cloud 之 Feign.
-
基于Spring Cloud Netflix的TCC柔性事务和EDA事件驱动示例
-
微信授权就是这个原理,Spring Cloud OAuth2 授权码模式
-
spring-cloud项目搭建