EUREKA工作原理:
由于业务的需要,最近在进行项目重构,为了以后系统的高可用性、稳定性等,以及最终选型基于微服务架构体系进行开发重构,本次采用 “服务注册与发现——Eureka” 。
Eureka简介:Eureka是基于REST(Representational State Transfer)服务,主要以AWS云服务为支撑,提供服务发现并实现负载均衡和故障转移。我们称此服务为Eureka服务。
Eureka核心组件:Eureka Server Eureka Client
Eureka Server:Eureka Server提供服务注册功能,各个服务节点启动后,会向Eureka Server进行服务注册,Eureka Server保存各个服务节点的信息以及使用“心跳”机制进行服务监控,保持Eureka Client中的服务及时更新。需要注意是:单节点的Eureka Server是不需要将自己注册到Eureka注册中心,因为它本身就是一个服务。它自己就已经是个注册中心,把当前服务注册到当前服务充当注册中心,这个逻辑有点说不通。(Enreka Server集群除外)
Eureka Client:Eureka Client是一个与Eureka Server进行交互的应用,所有注册进来的服务在Eureka Client里都能够直观的看到,当Eureka Client中的服务节点启动过后,它会一直与Eureka Server进行服务节点生命状态的“汇报”工作,每30秒的频率向Eureka发送“心跳”指令告诉它:“我正处于健康状态”,如果Ereka Server在90秒内没有收到Eureka Client 发送的“心跳”指令,会将该服务节点当成“死亡状态”进行剔除。Enreka Client中的服务包含两个角色:分别是:Application Server(服务提供者)以及Application Client(服务消费者),服务没有固定的角色,它可能是服务消费者,也可能是服务提供者。同时,Eureka Client本身具备“负载均衡器”,消费者只需要告诉Eureka Client我需要什么样的服务就可以了,不用考虑某个服务节点压力过大的问题。
Eureka Client中Application Client调用Application Server时的机制:
一旦服务注册到了 Eureka Server 注册中心,Eureka Client都会从注册中心拉取一份最新的“服务列表”保存在本地缓存中,所以Application Client每次调用服务时,都会先查询自己“本地缓存”中是否存在服务列表,如果没有,则会向Eureka Server中拉取服务列表,这种机制的好处就是每次服务调用都不一定会访问Eureka Server,大大减少了控制中的压力。但单节点Eureka注册中心会存在一个弊端,就是当Eureka Server因为某种因素宕机后,Application Client还是能够正常访问服务,但问题来了,如果向Eureka Server注册了一个新的服务又会怎么样?答案当时是:注册失败!所以Eureka集群的搭建就很有必要。(下期讲解双节点Eureka集群搭建及工作原理)
Eureka原理架构图:
当服务向Eureka Server进行注册时,Eureka Client中的服务会相互复制服务信息以及地址,达到一致性的效果,所以当Eureka Server宕机后,服务之间的调用也不会出现任何问题。
单节点Eureka Server搭建:
Eureka Server搭建:
File——new——Project
接下来需要注意的是,因为我们要搭建Eureka Server(注册中心),所以以下选择一点要选上。
接下来直接Finish,然后就能直观地看到:
找到启动类,在启动类加上 @EnableEurekaServer (表明该模块为Eureka注册中心)
Eureka Server application.properties配置:
现在我们就可以启动项目进行验证该配置是否正确,在浏览器输入:服务器地址+端口号。
以上可以看到Eureka Server搭建成功!
Eureka Client搭建:
接下来我们进行Eureka Client搭建,将它作为服务注册进去,和Eureka Server搭建基本一致。由于Eureka是我们这次重构用到的技术,所以以下的Eureka Client就用我现在已有的模块,你们可以自己搭建模块进行测试。下面我将把"smarthospital-basicdata"与"smarthospital-treatment"分别作为Application Server和Application Client 注册到我们的控制中心。
找到Eureka Client启动类(smarthospital-basicdata):
在启动类上加上@EnableDiscoveryClient,表明它是一个Eureka Client。也可以加@EnableEurekaClient,他们的作用都是一样的,唯一的区别就是:pringCloud中的“Discovery Service”有多种实现(@EnableDiscoveryClient),比如:eureka, consul, zookeeper。而@EnableEurekaClient只能为eureka作用;如果你的注册中心确定是Eureka的话,建议使用@EnableEurekaClient, 比较单一。
Eureka Client application.properties配置:
下面我们启动该Eureka Client试试:
在注册中心可以清晰的看到,basicdata这条实例以及注册到我们的注册中心里了。
我们再将"smarthospital-treatment"注册进来(和上面步骤一样,只需要改下端口号和服务名,其他不变)。
可以看到第二个服务已经注册进来了,接下来我们进行服务之间的调用:
我们现在要用TREATMENT调用BASICDATA,找到服务提供者提供的Controller。
比如我们要调用该接口,现在我们在smarthospital-treatment中的接口(interface)里将地址配置好。
在上图中我们可以看到@FeignClient注解,这个注解是服务调用时所需要的注解,要调用哪个服务的接口就写哪个服务名。
现在我们可以在实现类里将FeignOperativeService注入进来,然后进行测试。(具体实现细节不写了)
然后进行smarthospital-treatment实现类对应的Controller调用,试试有没有服务调用成功,如果数据存在,则成功。
可以看到数据已经成功获取,Eureka Client 服务之间调用成功!
以上就是Eureka Server 与 Eureka Client 之间的关系,如有问题,请指出。谢谢大家阅读!