euraka是什么:
Spring Cloud 封装了 Netflix 公司开发的 Eureka 模块来实现服务注册和发现,eureka里有2个组件,一个是EurekaServer(一个独立的项目) 这个是用于定位服务以实现中间层服务器的负载平衡和故障转移,Eureka Server 作为服务注册功能的服务器,它是服务注册中心。另一个便是EurekaClient(我们的微服务) 它是用于与Server交互的,可以使得交互变得非常简单:只需要通过服务标识符即可拿到服务。举个通俗的例子:Eureka Server在微服务的角色类似于公司前台,客户想访问公司的某个部门或者人,都需要去前台咨询;然后前台告诉客户,被访问对象的信息。
项目地址:springcloud+tx-lcn实践
在springcloud中的使用:
服务端依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
服务端配置文件:
server:
port: 8761
eureka:
server:
enable-self-preservation: false #关闭自我保护机制
eviction-interval-timer-in-ms: 60*1000 #设置清理间隔(单位:毫秒 默认是60*1000)
instance:
hostname: localhost
client:
registerWithEureka: false #不把自己作为一个客户端注册到自己身上
fetchRegistry: false #不需要从服务端获取注册信息(因为在这里自己就是服务端,而且已经禁用自己注册了)
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka
另外服务端还需在启动类上加上@EnableEurekaServer注解
@EnableEurekaServer
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class);
}
}
客户端依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
客户端配置:
server:
port: 9002
eureka:
client:
serviceUrl:
defaultZone: http://127.0.0.1:8761/eureka #eureka服务端提供的注册地址 参考服务端配置的这个路径
instance:
instance-id: power-1 #此实例注册到eureka服务端的唯一的实例ID
prefer-ip-address: true #是否显示IP地址
leaseRenewalIntervalInSeconds: 10 #eureka客户需要多长时间发送心跳给eureka服务器,表明它仍然活着,默认为30 秒 (与下面配置的单位都是秒)
leaseExpirationDurationInSeconds: 30 #Eureka服务器在接收到实例的最后一次发出的心跳后,需要等待多久才可以将此实例删除,默认为90秒
spring:
application:
name: web #此实例注册到eureka服务端的name
另外还需在客户端启动类上添加 @EnableEurekaClient 注解,标注其为一个Eureka客户端。
这样一个基础的eureka就搭建好了,访问http://127.0.0.1:8761/,结果如图:
Eureka集群
集群原理:
服务启动后向Eureka注册,Eureka Server会将注册信息向其他Eureka Server进行同步,当服务消费者要调用服务提供者,则向服务注册中心获取服务提供者地址,然后会将服务提供者地址缓存在本地,下次再调用时,则直接从本地缓存中取,完成一次调用
集群配置:
将原有eureka的defaultZone改为http://127.0.0.1:8762/eureka ,并新增 一个eureka服务,配置如下
server:
port: 8762
eureka:
instance:
prefer-ip-address: true
instance-id: ${spring.cloud.client.ip-address}:${server.port}
hostname: ${spring.cloud.client.ip-address}
client:
service-url:
defaultZone: http://127.0.0.1:8761/eureka ##向http://127.0.0.1:8761/eureka 注册自己
register-with-eureka: false
server:
enable-self-preservation: false
eviction-interval-timer-in-ms: 5000
response-cache-update-interval-ms: 3000
将项目启动之后会看到如下效果:
相应的,客户端也需要添加配置:
client:
serviceUrl:
defaultZone: http://127.0.0.1:8761/eureka,http://127.0.0.1:8762/eureka
Eureka总结:
Eureka在设计的时候遵循的是AP原则,即可用性。Eureka各个节点(服务)是平等的, 没有主从之分,几个节点down掉不会影响正常工作,剩余的节点(服务) 依然可以提供注册与查询服务,而Eureka的客户端在向某个Eureka注册或发现连接失败,则会自动切换到其他节点,也就是说,只要有一台Eureka还在,就能注册可用(保证可用性), 只不过查询到的信息不是最新的(不保证强一致),除此之外,Eureka还有自我保护机制,如果在15分钟内超过85%节点都没有正常心跳,那么eureka就认为客户端与注册中心出现了网络故障,此时会出现一下情况:
1: Eureka 不再从注册列表中移除因为长时间没有收到心跳而过期的服务。
2:Eureka 仍然能够接收新服务的注册和查询请求,但是不会被同步到其它节点上(即保证当前节点可用)
3: 当网络稳定后,当前实例新的注册信息会被同步到其它节点中