Spring-cloud之Eureka服务搭建、集群
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台还健在,依然可以注册我们的服务,换句话来讲, 只要有一台服务还建在,那么就可以注册服务。