Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。SpringCloud将它集成在其子项目spring-cloud-netflix中,以实现SpringCloud的服务发现功能。 Eureka包含两个组件:Eureka Server和Eureka Client。Eureka Server 负责统一管理服务信息;Eureka Client负责和Eureka Server通信维护服务信息。
说明
eureka的单机版和集群版的区别只是配置不一样而已,因此这里将公共的部分提取到前面;下面示例使用的Spring-Cloud的版本是Hoxton.SR8,Spring-Boot的版本是2.3.4.RELEASE。示例项目的源代码
添加如下maven依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</exclusion>
<exclusion>
<groupId>com.netflix.ribbon</groupId>
<artifactId>ribbon-eureka</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.github.ben-manes.caffeine</groupId>
<artifactId>caffeine</artifactId>
</dependency>
编写启动类:
@EnableEurekaServer
@SpringBootApplication
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
@EnableEurekaServer:这个注解标识将其作为eureka server启动。
application.yml配置示例如下
Eureka单机版配置
server:
port: 8761
eureka:
instance:
hostname: localhost
client:
# 是否将自己注册到Eureka Server 默认为true
registerWithEureka: false
# 是否从Eureka Server查询注册信息
fetchRegistry: false
# 配置eureka服务的地址
serviceUrl:
defaultZone: http://127.0.0.1:${server.port}/eureka/
server:
# 自我保护机制,开发环境建议关闭
enable-self-preservation: false
spring:
cloud:
loadbalancer:
ribbon:
enabled: false
之后直接访问http://127.0.0.1:8761 即可进入eureka的界面。
Eureka集群版配置
server:
port: 8761
eureka:
instance:
# 这里也可以使用域名
prefer-ip-address: true
instance-id: 127.0.0.1:8761
client:
# 是否将自己注册到Eureka Server 默认为true
registerWithEureka: false
# 是否从Eureka Server查询注册信息
fetchRegistry: true
# 配置eureka服务注册地址;多个使用英文逗号分开
serviceUrl:
defaultZone: http://127.0.0.1:8761/eureka/,http://127.0.0.1:8762/eureka/,http://127.0.0.1:8763/eureka/
spring:
cloud:
loadbalancer:
ribbon:
enabled: false
关于配置eureka服务注册地址是否可以配置它自己的问题?
答案是可以的,因为eureka server构建的集群节点信息PeerEurekaNodes里面,在定时更新注册中心节点信息的时候,会自动检查注册地址中是否有它自己的注册地址,有的话会将其去掉的;所以可以配置它自己的注册地址。
接上面的问题,为什么eureka要将注册地址中自己的注册地址去掉:查看eureka client的注册过程,eureka server会在更新自己本地注册表后,将这个注册信息依次推送到集群中其他的eureka server上去。因此要把自己的地址过滤掉(自己发送给自己干啥)
fetchRegistry:应该配置为true还是false呢?
因为我们知道eureka client每次只会向其中一台机器发送注册信息,心跳也是只会向一台机器发送;而注册中心集群间的注册表同步是在收到客户端发送的信息后,在自己处理完成后,再将这个信息转发给集群中其他节点(如果失败会不停的重试);如果fetchRegistry配置为true,那么在eureka server启动的时候会主动的从任意一个其他的节点拉取注册信息同步到自己本地。如果fetchRegistry配置为false则不会进行此操作。但是需要说明的是如果fetchRegistry配置为true时会启动eureka client中大量的线程资源,而这些资源消耗就为了刚刚启动的一次注册表同步;这视乎是不太划算的,因为基于eureka server节点间的注册信息同步机制同样是可以实现注册表同步的,只是有些延迟(时间较短,完全可以接受)。因此如果不是非常特别的要求,建议将fetchRegistry配置为false,减少系统资源的消耗。
Eureka 客户端端的使用
Eureka服务端无论是单机版部署还是集群部署,客户端的配置都是一样的。添加maven依赖如下:
<!--eureka注册中心客户端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</exclusion>
<exclusion>
<groupId>com.netflix.ribbon</groupId>
<artifactId>ribbon-eureka</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- Spring Cloud LoadBalancer is currently working with the default cache. You can switch to using Caffeine cache, by adding it to the classpath.-->
<dependency>
<groupId>com.github.ben-manes.caffeine</groupId>
<artifactId>caffeine</artifactId>
</dependency>
application.yml配置如下:
# 注册中心eureka配置
eureka:
client:
serviceUrl:
# 多个节点使用英文逗号分开
defaultZone: http://127.0.0.1:8761/eureka/,http://127.0.0.1:8762/eureka/,http://127.0.0.1:8763/eureka/
最后在启动类上添加启用注册中心的注解:@EnableDiscoveryClient
。
这里推荐使用
@EnableDiscoveryClient
而不是@EnableEurekaClient
;因为@EnableEurekaClient
只能用于eureka,而@EnableDiscoveryClient
是通用的(以后如果更换注册中心后,这个注解是无需更改的)。