Eureka 是一种基于 REST(具象状态传输)的服务,主要用于在 AWS 云中用于定位服务,以便对中间层服务器进行负载平衡和故障转移。我们将此服务称为 Eureka Server。 Eureka 还附带了一个基于 Java 的客户端组件,即 Eureka Client,它使与服务的交互变得更加容易。 客户端还有一个内置的负载均衡器,可以进行基本的循环负载均衡。 在 Netflix,一个更复杂的负载均衡器封装了 Eureka,以提供基于流量、资源使用、错误条件等多个因素的加权负载均衡,以提供卓越的d性。
有了服务注册与发现,只要通过服务的标识符,就可以访问到该服务,而不需要修改服务调用的配置文件了。类似于Dubbo的注册中心,例如zookeeper
Eureka 由两个组件组成:Eureka 服务端和 Eureka 客户端。
- Eureka 服务端就是注册中心。
- Eureka 客户端是一个 java 客户端,用来简化与服务端的交互、作为轮询负载均衡器,并提供服务的故障切换支持。
三大角色
- Eureka Server担任注册中心的角色,提供了服务的发现和注册功能
- Service Provider 服务提供者,将自身的服务注册到Eureka Server,同时通过心跳检查(默认周期为 30s)服务的运行状态
- Service Consumer 服务调用者,从Eureka Server 得到注册的服务列表,找到对应的服务地址在调用并使用
- 项目存在许多中间层服务,想向 AWS ELB 注册或暴露来自外部世界的流量。
- 需要一个简单的循环负载平衡解决方案,根据负载平衡需求编写自己的 Eureka 包装器。
- 不需要粘性会话并将会话数据加载到外部缓存(如 memcached)中。
- 架构适合使用基于客户端的负载均衡器的模型,那么 Eureka 就可以很好地适应这种用法。
新建一个 maven项目 :cloud-eureka-7001
- 导入eureka依赖
SpringCloud
com.sunl
1.0-SNAPSHOT
4.0.0
cloud-eureka-7001
8
8
org.springframework.cloud
spring-cloud-starter-eureka-server
1.4.7.RELEASE
org.springframework.boot
spring-boot-devtools
- 编写 application.yml
server:
port: 7001
# Eureka 配置
eureka:
instance:
hostname: localhost #Eureka 服务端的实例名
client:
register-with-eureka: false # 表示是否向Eureka 注册中心注册自己
fetch-registry: false # fetch-registry如果为false,则表示自己未注册中心
service-url: # 监控页面
# 单机:public static final String DEFAULT_URL = "http://localhost:8761/eureka/";
# 配置监控页面的地址,都是用的上面设定的值
defaultZone : http://${eureka.instance.hostname}:${server.port}/eureka/
- 在主启动类上配置上 Eureka 服务 :
@EnableEurekaServer
package com.sun.cloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
/**
* @program: SpringCloud
* @description: 启动类
* @author: Sunl
* @create: 2022-05-15 12:26
**/
@SpringBootApplication
@EnableEurekaServer
public class EurekaServer_7001 {
public static void main(String[] args) {
SpringApplication.run(EurekaServer_7001.class,args);
}
}
- 启动,测试http://localhost:7001/
- 导入eureka依赖
org.springframework.cloud
spring-cloud-starter-eureka
1.4.7.RELEASE
- 在 application.yml 中, 添加 Eureka 的配置
# Eureka 的配置,服务要注册到哪里
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka/
instance:
instance-id: cloud-provider-dept-8001 # 修改eureka上的默认描述信息
- 在主启动类中开启 Eureka 服务 :
@EnableEurekaClient
,服务启动会自动注册到 Eureka Server
@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
public class DeptProvider_8001{}
-
启动测试,http://localhost:8001/,刷新 Eureka 的监控页面
-
完善服务加载信息
导入依赖
org.springframework.boot
spring-boot-starter-actuator
2.6.7
编写配置
info: # 完善监控信息
app.name: sunl-springCloud
company.name: sumuyi.top
重新启动,并点击UP(1) - cloud-provider-dept-8001
{
"app": {
"name": "sunl-springCloud"
},
"company": {
"name": "sumuyi.top"
}
}
3.3 获取 SpringCloud 实例化的信息
- 在控制层添加接口
@Autowired
private DiscoveryClient discoveryClient;
//注册进来的微服务,获取一些消息
@GetMapping("/dept/discovery")
public Object discovery(){
//获取微服务列表清单
List services = discoveryClient.getServices();
System.out.println("discovery=>services:" + services);
//得到一个具体的微服务信息,通过具体的微服务id
List instances = discoveryClient.getInstances("CLOUD-PROVIDER-DEPT");
instances.forEach(instance ->{
System.out.println(
instance.getServiceId() + "\t" +
instance.getInstanceId() + "\t" +
instance.getHost() + "\t" +
instance.getPort() + "\t" +
instance.getUri() + "\t" +
instance.getMetadata()
);
});
return this.discoveryClient;
}
- 主启动类中开启注解支持 :
@EnableDiscoveryClient
- 启动项目 localhost:8001/dept/discovery
discovery=>services:[cloud-provider-dept]
CLOUD-PROVIDER-DEPT cloud-provider-dept-8001 windows10.microdone.cn 8001 http://windows10.microdone.cn:8001 {management.port=8001}
4. 集群的配置
- 新建两个模块 : cloud-eureka-7002, cloud-eureka-7003
- 导入依赖
- 编写配置文件
- 开启注解
- 以上步骤请参考 模块cloud-eureka-7001的创建
在配置实例中添加prefer-ip-address 和 ip-address 属性,来模拟不同的电脑
server:
port: 7002
# Eureka 配置
eureka:
instance:
hostname: localhost #Eureka 服务端的实例名
# 当需要指定 ip-address 时,prefer-ip-address为 true ; 不使用时为 false
prefer-ip-address: true
ip-address: 127.0.0.2
client:
register-with-eureka: false # 表示是否向Eureka 注册中心注册自己
fetch-registry: false # fetch-registry如果为false,则表示自己未注册中心
service-url: # 监控页面
# public static final String DEFAULT_URL = "http://localhost:8761/eureka/";
defaultZone: http://127.0.0.1:7001/eureka/,http://127.0.0.3:7003/eureka/
- 修改提供者的配置文件属性,将服务注册到上述新建的两个注册中心
# Eureka 的配置,服务要注册到哪里
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:7001/eureka/,http://127.0.0.2:7002/eureka/,http://127.0.0.3:7003/eureka/
instance:
instance-id: cloud-provider-dept-8001 # 修改eureka上的默认描述信息
info:
app.name: sunl-springCloud
company.name: sumuyi.top
- 启动上述四个项目
这是因为某些情况下,某个服务提供者突然挂了,就会出现这种情况,但这时,注册中心不会直接删除这个服务,而是把这个微服务节点进行保护。一旦进入自我保护模式,Eureka Server 就会保护服务注册表中的信息,不删除服务注册表中的数据(也就是不会注销任何微服务)。当网络故障恢复后,该 Eureka Server 节点会再自动退出自我保护模式。
可以添加如下两条设置关闭自我保护,以及将心跳检测时间从默认的90秒设置为2秒
eureka:
server:
enable-self-preservation: false #防止由于Eureka的机制导致Client被错误显示在线 仅在开发环境使用
eviction-interval-timer-in-ms: 2000 #2秒心跳检测
6.Eureka和ZooKeeper的区别
RDBMS(MySql,Oracle,SqlServer等关系型数据库)遵循的原则是:ACID原则(A:原子性。C:一致性。I:独立性。D:持久性。)。
NoSql(redis,Mogodb等非关系型数据库)遵循的原则是:CAP原则(C:强一致性。A:可用性。P:分区容错性)。
在分布式领域有一个很著名的CAP定理:C:数据一致性。A:服务可用性。P:分区容错性(服务对网络分区故障的容错性)。
在这个特性中任何分布式系统只能保证两个。
Eureka和Zookeeper就是CAP定理中的实现,Eureka(保证AP),Zookeeper(保证CP)。
详情请见 Eureka和ZooKeeper的区别
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)