eureka 是什么?
eureka 是 Netfix 的子模块之一也是核心模块, eureka 有 2 个组件, 一个 eurekaServer(独立的一个微服务), 这个服务主要是用来定位服务以实现中间层服务器的负载平衡和故障转移. 另外一个是是 eurekaClient(我们自己的微服务), 是用来与 server 进行交互的, 使服务之间的交互变的非常简单, 只需要通过服务标识符即可在 server 中拿到想要的微服务.
角色关系图:
如何使用?
在 spring-cloud 项目里面加入依赖:
eureka 客户端(需要注册的服务 pom 中添加):
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency>
eureka 服务端(eureka 独立服务 pom 中添加):
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency>
eureka 服务端项目里面加入以下配置:
- server:
- port: 3000
- eureka:
- server:
- enable-self-preservation: false #关闭自我保护机制
- eviction-interval-timer-in-ms: 4000 #设置清理间隔(单位: 毫秒 默认是 60*1000)
- instance:
- hostname: localhost
- client:
- registerWithEureka: false #不把自己作为一个客户端注册到自己身上
- fetchRegistry: false #不需要从服务端获取注册信息(因为在这里自己就是服务端, 而且已经禁用自己注册了)
- serviceUrl:
- defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka
然后在 spring-boot 启动项目上 加入注解:@EnableEurekaServer 就可以启动项目了
- @EnableEurekaServer
- @SpringBootApplication
- public class AppEureka {
- public static void main(String[] args) {
- SpringApplication.run(AppEureka.class);
- }
- }
启动即可看到注册中心页面.
eureka 客户端配置:
- server:
- port: 6000
- eureka:
- client:
- serviceUrl:
- defaultZone: http://localhost:3000/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: server-power #此实例注册到 eureka 服务端的 name
接下来就可以在微服务项目的启动类中添加 @EnableEurekaClient 即可启动, 正常即可看到如下页面
这里我们能看见 名字叫 server-power 的(图中将其大写了) id 为 power-1 的服务 注册到我们的 Eureka 上面来了至此, 一个简单的 eureka 已经搭建好了.
eureka 集群
eureka 集群原理
服务启动后向 Eureka 注册, Eureka Server 会将注册信息向其他 Eureka Server 进行同步, 当服务消费者要调用服务提供者, 则向服务注册中心获取服务提供者地址, 然后会将服务提供者地址缓存在本地, 下次再调用时, 则直接从本地缓存中取, 完成一次调用.
eureka 集群配置
现在我们配置 3 个 Eureka Server, 端口分别是 3000,30001,30002
3 个 Eureka Server 之间的关系分别是相互注册的关系, 如下图
可能看着有点抽象, 我们来看看具体配置
- server:
- port: 3000
- eureka:
- server:
- enable-self-preservation: false
- eviction-interval-timer-in-ms: 4000
- instance:
- hostname: eureka3000.com
- client:
- registerWithEureka: false
- fetchRegistry: false
- serviceUrl:
- defaultZone: http://eureka3001.com:3001/eureka,http://eureka3002.com:3002/eureka
这里需要注意的是这个配置
defaultZone: http://eureka3001.com:3001/eureka,http://eureka3002.com:3002/eureka
可以这样理解:
eureka3000 配置 eureka3001 和 eureka3002
eureka3001 配置 eureka3000 和 eureka3002
eureka3002 配置 eureka3000 和 eureka3001
这里 方便理解集群 我们做了一个域名的映射 (条件不是特别支持我使用三台笔记本来测试...) 至于域名怎么映射的话 这里简单提一下吧 修改你的 hosts 文件(win10 的目录在 C:\Windows\System32\drivers\etc 其他系统的话自行百度一下把) 附上我的 hosts 文件:
- 127.0.0.1 eureka3000.com
- 127.0.0.1 eureka3001.com
- 127.0.0.1 eureka3002.com
我们回到主题, 我们发现 集群配置与单体不同的点在于 原来是把服务注册到自己身上, 而现在是注册到其它服务身上
至于为什么不注册自己了呢?, 回到最上面我们说过, eureka 的 server 会把自己的注册信息与其他的 server 同步, 所以这里我们不需要注册到自己身上, 因为另外两台服务器会配置本台服务器.(这里可能有点绕, 可以参考一下刚刚那张集群环境的图, 或者自己动手配置一下, 另外两台 eureka 的配置与这个是差不多的, 就不发出来了, 只要注意是注册到其他的服务上面就好了)
当三台 eureka 配置好之后, 全部启动一下就可以看见效果了:
服务端配置好集群后接下来需要配置客户端:
客户端的配置就简单了, 只需要将之前单体的 eureka server 配置中的注册地址配置三个地址即可.
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka
改为: defaultZone: http://localhost:3000/eureka/,http://eureka3001.com:3001/eureka,http://eureka3002.com:3002/eureka
这里需要注意的是这里配置三个地址并不代表当前客户端需要在 Eureka Server 注册三次, 这里只需要注册一次就可以了, 但是为什么要写三个地址呢. 因为这样就可以做到高可用的配置: 打个比方有 3 台服务器. 但是突然宕机了一台, 但是其他 2 台还健在, 依然可以注册我们的服务, 换句话来讲, 只要有一台服务还建在, 那么就可以注册服务.
来源: http://www.bubuko.com/infodetail-3415550.html