> 文档中心 > 微服务实战|Eureka注册中心及集群搭建

微服务实战|Eureka注册中心及集群搭建

目录

一、SpringCloud体系简介

二、Eureka服务端开发

创建项目父工程

创建服务端子工程

三、Eureka服务端集群搭建

四、创建Eureka客户端

五、项目启动验证

六、Spring cloud版本介绍


一、SpringCloud体系简介

微服务架构已在云原生架构中发挥着举足轻重的作用,而SpingCloud无疑是微服务架构的集大成者,云计算最佳业务实践。

SpringCloud体系主要包括以下组件:

  • 服务注册与发现:如Eureka、Consul、Nacos、zookeeper等;
  • 服务配置管理:如SpringCloud config、zookeeper、Nacos、Apollo等;
  • 服务调用:如Feign、Ribbon、RestTemplate等;
  • 服务熔断:如Hystrix、Sentinel等;
  • 服务网关:如SpringCloud Gateway、Zuul等;
  • 客户端负载均衡:如Ribbon等;
  • 服务链路跟踪:如Sleuth等;
  • 服务消息总线:如SpringCloud Bus等;
  • 分布式消息:如SpringCloud Stream+RocketMQ等;
  • 分布式事务:如Seata等。

Eureka是Netflix开发的服务发现框架,SpringCloud将它集成在自己的子项目spring-cloud-netflix中,实现SpringCloud的服务发现功能。Eureka包含Eureka ServerEureka Client两个组件。

  • Eureka Server提供服务注册服务,各个节点启动后,会在Eureka Server中进行注册,这样Eureka Server中的服务注册表中将会存储所有可用服务节点的信息。
  • Eureka Client是一个java客户端,用于与Eureka Server交互,客户端同时也有一个内置的、使用轮询(round-robin)负载算法的负载均衡器。在应用启动后,将会向Eureka Server发送心跳,默认周期为30秒,如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,Eureka Server将会从服务注册表中把这个服务节点移除(默认90秒)。

二、Eureka服务端开发

创建项目父工程

  1. 新建maven父项目parent,用于统一管理依赖。
  2. 引入pom依赖,这里使用的SpringCloud版本是Hoxton.SR3
4.0.0    com.cxy965    parent    pom    1.0-SNAPSHOT    A maven project to study maven.     org.springframework.boot spring-boot-starter-parent 2.3.2.RELEASE          UTF-8 UTF-8 1.8 Hoxton.SR3                org.springframework.cloud  spring-cloud-dependencies  ${spring-cloud.version}  pom  import            org.springframework.boot  spring-boot-starter-tomcat  ${tomcat.scope}          

创建服务端子工程

  • 创建注册中心第一个服务端项目registry
  • 引入eureka-server的依赖
    com.cxy965    registry    1.0-SNAPSHOT     com.cxy965 parent 1.0-SNAPSHOT ../parent/pom.xml              org.springframework.cloud     spring-cloud-starter-netflix-eureka-server     
  • 编写启动类,增加@EnableEurekaServer注解,表示为服务端
package com.cxy965.demo;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;/** * @Author:公众号:程序员965 * @create 2022-06-06 **/@EnableEurekaServer@SpringBootApplicationpublic class RegistryApplication {    public static void main(String[] args) { SpringApplication.run(RegistryApplication.class, args);    }}
  • 新建application.yml配置文件,定义端口等信息
server:  port: 8001spring:  application:    name: registryeureka:  instance:    hostname: 0.0.0.0    lease-renewal-interval-in-seconds: 10 #服务的注册涉及到心跳连接,默认为每30s    lease-expiration-duration-in-seconds: 30 #服务被移除的时间默认为90s  client:    healthcheck:      enabled: true #开启心跳    register-with-eureka: false    fetch-registry: false    serviceUrl:      defaultZone:  http://${eureka.instance.hostname}:${server.port}/eureka/    registry-fetch-interval-seconds: 30 #eureka client间隔多久去拉取服务注册信息,默认为30秒

这样第一个Eureka服务端就开发完成了,接下来我们创建集群。

三、Eureka服务端集群搭建

如果要搭建服务端集群,需要开启 Eureka 集群配置,各服务端启动时 Eureka Server 会将注册信息向其它 Eureka Server 进行同步,因此搭建高可用集群架构只需要将 Eureke Server 配置指向其它可用的 serviceUrl 即可。

  • 复制上面 Eureka 单个服务端项目,创建集群第一个服务eurekaserver1;
  • 修改application.yml配置文件;

在上面 Eureka 单个服务端项目的基础上,修改配置文件中的 register-with-eurekafetch-registry以及serviceUrl.defaultZone参数,如下:

server:  port: 8001spring:  application:    name: registryeureka:  instance:    hostname: 0.0.0.0    lease-renewal-interval-in-seconds: 10 #服务的注册涉及到心跳连接,默认为每30s    lease-expiration-duration-in-seconds: 30 #服务被移除的时间默认为90s  client:    healthcheck:      enabled: true #开启心跳    register-with-eureka: true    fetch-registry: true    serviceUrl:      defaultZone:  http://localhost:8002/eureka/,http://localhost:8003/eureka/    registry-fetch-interval-seconds: 30 #eureka client间隔多久去拉取服务注册信息,默认为30秒
  • 同样的,再复制eurekaserver1为eurekaserver2,eurekaserver3两个项目;
  • 将eurekaserver2、eurekaserver3的端口分别改成8002、8003;
  • 将eurekaserver2、eurekaserver3的注册地址分别改成8001/8003和8001/8002;

分别启动eurekaserver1、eurekaserver2、eurekaserver3三个项目即可。

注意,因为为本地测试项目,三个项目均部署在本地localhost,作为高可用集群环境,为避免服务器崩溃后集群中其他项目可用,需部署在不同服务器上,部署在不同服务器后,端口可以改为相同的。

四、创建Eureka客户端

  • 创建第一个客户端项目client
  • 与服务端不同的是,客户端需要引入eureka-client的依赖
     org.springframework.boot spring-boot-starter-web         org.springframework.cloud spring-cloud-starter-netflix-eureka-client    
  • 编写启动类,注意增加的是@EnableEurekaClient注解,表示此为客户端
import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.netflix.eureka.EnableEurekaClient;/** * @Author:公众号:程序员965 * @create 2022-06-06 **/@EnableEurekaClient@SpringBootApplicationpublic class AppApplication {    public static void main(String[] args) { SpringApplication.run(AppApplication.class, args);    }}
  • 创建application.yml配置文件,注册至服务端
server:  port: 8002spring:  application:    name: appeureka:  client:    service-url:      defaultZone: http://localhost:8001/eureka/

五、项目启动验证

分别启动服务端和客户端,打开浏览器中输入http://localhost:8001/;显示客户端注册成功:

总结:Eureka Server之间通过复制的方式完成数据的同步,Eureka还提供了客户端缓存机制,即使所有的Eureka Server都挂掉,客户端依然可以利用缓存中的信息消费其他服务的API。综上,Eureka通过心跳检查、客户端缓存等机制,确保了系统的高可用性、灵活性和可伸缩性。


六、Spring cloud版本介绍

在2020年4月之前,为了避免与子项目混淆,SpringCloud版本是依据伦敦地铁站名命名,并按照字母顺序发布:比如Angle、Brixton、Camden、Edgware、Finchley、GreenWich、Hoxton等。版本号中的字母含义:

  • SNAPSHOT: 快照版本,不稳定、尚处于开发中的版本; 
  • M: MileStone,M1表示第1个里程碑版本;
  • RC:Release Candidate,候选版本,一般标注PRE表示预览版,几乎不会再加入新的功能,只修复bug;
  • RELEASE:正式版本,如在发布Edgware SR1之前,会先发布Edgware RELEASE;
  • SR: Service Release,单个项目的发布点累积到一个临界值,或者其中有一个关键的bug需要提供给所有人时将发布SR版本,如SR1版本可能解决了一批关键bug,一般同时标注GA;
  • GA:General Availability,正式发布的稳定版本(有的软件可能会标识为 Stable 版本或者 Production 版本,其意思和 GA 相同);

 可能版本发布太快,地铁站名不够用了,2020年4月后发布的版本改为日历化版本(Calendar Versioning的命名方式,格式为“YYYY.MINOR.MICRO-SNAPSHOT/M1/RC2”。

  • YYYY:代表4 位年份;
  • MINOR:表示一个每年以 0 开始递增的数字;
  • MICRO:表示版本号的后缀, .0 类似于 .RELEASE 一样,.2 类似于 .SR2。
  • 快照和预发布版本号也由之前的.改为-,如:2020.0.0-SNAPSHOT/M1/RC2;

版本发布可能的顺序如下:

SNAPSHOT-->M-->RC-->RELEASE-->SR--GA

 这么多版本如何选择?

最新的且标注GA的版本,最好选择SR后面的数字较大的版本。