Eureka 集群搭建「建议收藏」

Eureka 集群搭建「建议收藏」一、Eureka高可用集群在实际的生产环境中,eureka常常是以集群的方式提供服务的,目的就是要保证高可用性,同时它还保证了分区容错性。这也满足了一个健壮的分布式系统所要求的CAP理论原则,即eureka保证了高可用性,分区容错性。二、Eureka集群原理Eureka的工作细节Eureka本身可以分为两大部分,EurekaServer和EurekaClient。2.1EurekaServerEurekaServer主要对外提供了三个功能:服务注册:所有的

大家好,又见面了,我是你们的朋友全栈君。

一、Eureka 高可用集群

在实际的生产环境中,eureka 常常是以集群的方式提供服务的,目的就是要保证高可用性,同时它还保证了分区容错性。这也满足了一个健壮的分布式系统所要求的 CAP 理论原则,即 eureka 保证了高可用性,分区容错性。

二、Eureka 集群原理

Eureka 的工作细节

Eureka 本身可以分为两大部分,Eureka Server 和 Eureka Client。

2.1 Eureka Server

Eureka Server 主要对外提供了三个功能:

服务注册:所有的服务都注册到 Eureka Server 上面来。

提供注册表:注册表是所有注册上来的服务的列表,Eureka Client 在调用服务时,需要获取这个注册表,一般来说,这个注册表会被缓存下来,如果缓存失效,则直接获取最新的注册表。

同步状态:Eureka Client 通过注册、心跳等机制,和 Eureka Server 同步当前客户端的状态。

2.2 Eureka Client

Eureka Client 主要用来简化每个服务和 Eureka Server 的交互。 Eureka Client 会自动拉取、更新以及缓存 Eureka Server 中的信息,这样,即使 Eureka Server 所有节点都宕机,Eureka Client 依然能够获取到想要调用服务的地址(地址可能不准确)

2.2.1 服务注册

服务提供者将自己注册到注册中心(Eureka Server),需要注意,所谓的服务提供者,只是一个业务上的分类,本质上它就是一个 Eureka Client 。当 Eureka Client 向 Eureka Server 注册时,它需要提供一些自身的元数据信息,如 IP 地址、端口、名称、运行状态等。

2.2.2 服务续约

Eureka Client 注册到 Eureka Server 上之后,事情没有结束,刚刚开始而已。注册成功后,默认情况下,Eureka Client 每隔 30 秒就要向 Eureka Server 发行一条心跳信息,告诉 Eureka Server 我还在运行

如果 Eureka Server 连续 90 秒都没有收到 Eureka Client 的续约消息(连续 3 次都没发送),它会认为 Eureka Client 已经掉线了,会将掉线的 Eureka Client 从当前的服务注册表中剔除

服务续约,有两个相关属性(一般不做修改):

# eureka.instance.lease-renewal-interval-in-seconds 表示服务续约时间
eureka.instance.lease-renewal-interval-in-seconds = 30  
# eureka.instance.lease-expiration-duration-in-seconds 表示服务时效时间
eureka.instance.lease-expiration-duration-in-seconds = 90

2.2.3 服务下线

当 Eureka Client 下线时,它会主动发送一条信息,告诉 Eureka Server ,我下线了。

2.2.4 获取注册表信息

Eureka Client 从 Eureka Server 上获取服务的注册信息,并将其缓存到本地。本地客户端,在需要调用远程服务时,会从该信息中查找远程服务所对应的的 IP 地址、端口等信息。Eureka Client 上缓存的服务注册信息会定期更新(30 秒),如果 Eureka Server 返回的注册表信息与本地缓存的注册表信息不同的话,Eureka Client 会自动处理。

这里,也涉及两个属性,一个是是否允许获取注册表信息:

eureka.client.fetch-registry = true
# Eureka Client 上缓存的服务注册信息,定期更新的时间间隔,默认为 30 秒

eureka.client.registry-fetch-interval-seconds = 30
# Eureka 集群,实际上就是启动多个 Eureka 实例,多个 Eureka 实例之间,互相注册,互相同步数据,共同组成一个 Eureka 集群。

Eureka 集群原理

在这里插入图片描述
在这个集群架构中,Eureka Server 之间通过 Replicate 进行数据同步,不同的 Eureka Server 之间不区分主从节点,所有节点都是平等的。节点之间,通过置顶 serviceUrl 来相互注册,形成一个集群,进而提高节点的可用性
在 Eureka Server 集群中,如果某个节点宕机,Eureka Client 会自动切换到新的 Eureka Server 上。每个 Eureka Server 节点,都会互相同步数据。
Eureka Server 的连接方式,可以是单线的,就是 A->B->c,此时,A 的数据也会和 C 之间相互同步。但是一般不建议这么写(假如 B 宕机,则 A 和 C 也断开联系了)。在我们配置 serviceUrl 时,可以指定多个注册地址,即 A 可以注册到 B 上,也可以同时注册到 C 上。

三、Eureka 集群搭建配置

1、创建项目

在这里插入图片描述

2、父项目依赖

 <!-- 统一管理jar包版本 -->
    <properties>
        <spring.boot.version>2.3.2.RELEASE</spring.boot.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring.boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--spring cloud Hoxton.SR1-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Hoxton.SR1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

3、三个服务注册中心子模块依赖

<dependencies>
	<!--Eureka 服务端-->
	<dependency>
		<groupId>org.springframework.cloud</groupId>
		<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
	</dependency>
	<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
	</dependency>
</dependencies>

4、客户端服务提供者依赖

<dependencies>
	<!--Eureka 客户端-->
	<dependency>
		<groupId>org.springframework.cloud</groupId>
		<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
	</dependency>
	<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
	</dependency>
</dependencies>

5、三个服务注册中心配置

(1)修改 hosts 文件

由于只能在一台机器模拟三台服务器,此时必须要在主机的 hosts 文件中修改主机名,否则都默认为 localhost,则无法区分各个 Eureka 服务注册中心的实例。
windows 目录:C:\Windows\System32\drivers\etc\hosts,在末尾处添加如下映射配置。(修改主机名 hostname)

127.0.0.1 eureka8761
127.0.0.1 eureka8762
127.0.0.1 eureka8763 

(2)配置 application.properties 配置文件

1)8761

server: 
  port: 8761
  
eureka: 
  instance:
    hostname: eureka8761 	# eureka 服务端的实例名称
  client: 
    register-with-eureka: false     # false 表示不向本端注册中心注册自己。
    fetch-registry: false     # false 表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
    service-url: 
      # Eureka 实例之间互相注册,即把自己注册到另外两个服务注册中心实例中
      defaultZone: http://eureka8762:8762/eureka/,http://eureka8763:8763/eureka/

2)8762

server: 
  port: 8761
  
eureka: 
  instance:
    hostname: eureka8762 	# eureka 服务端的实例名称
  client: 
    register-with-eureka: false     # false 表示不向本端注册中心注册自己。
    fetch-registry: false     # false 表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
    service-url: 
      # Eureka 实例之间互相注册,即把自己注册到另外两个服务注册中心实例中
      defaultZone: http://eureka8761:8761/eureka/,http://eureka8763:8763/eureka/

3)8763

server: 
  port: 8763
  
eureka: 
  instance:
    hostname: eureka8761 	# eureka 服务端的实例名称
  client: 
    register-with-eureka: false     # false 表示不向本端注册中心注册自己。
    fetch-registry: false     # false 表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
    service-url: 
      # 有多台服务器时,用逗号隔开
      # Eureka 实例之间互相注册,即把自己注册到另外两个服务注册中心实例中,以便于客户端的数据同步
      defaultZone: http://eureka8761:8761/eureka/,http://eureka8762:8762/eureka/

(3)Eureka 服务端注解 @EnableEurekaServer

在 3 个服务端的子项目中的启动类上分别添加注解 @EnableEurekaServer

@EnableEurekaServer 
@SpringBootApplication 
public class ApplicationMain{ 
    

    public static void main(String[] args) { 
    
        SpringApplication.run(ApplicationMain.class, args);
    } 
 } 

6、启动服务集群

分别启动三个 Eureka 服务端项目。以 8761 节点为例:
在这里插入图片描述

在 hosts 文件中修改主机名后,我们可以用自定义的主机名进行访问(localhostname:8761)。如果不修改,只能用默认的 localhost:8761 进行访问。

7、将服务提供者注册到服务注册中心集群

(1)配置 application.properties 配置文件

server: 
  port: 8001
  
eureka:
  client:
    register-with-eureka: true  # 是否向注册中心注册自己
    fetchRegistry: true   # 是否从注册中心抓取已有的注册信息,默认true,集群必须设置为true
    service-url:
      # 集群中各个服务注册中心的地址
      defaultZone: http://eureka8761:8761/eureka,http://eureka8762:8762/eureka,http://eureka8763:8763/eureka
  instance:
    instance-id: servicer8001	 # 服务实例Id
    prefer-ip-address: true  #访问路径可以显示IP地址

实际上,defaultZone 中只配置集群中任意一个服务注册中心的地址,集群中其他的节点都会相互复制服务实例。

(2)Eureka 客户端注解 @EnableEurekaClient

在 3 个服务端的子项目中的启动类上分别添加注解 @EnableEurekaClient

@EnableEurekaClient 
@SpringBootApplication 
public class ApplicationMain{ 
    

    public static void main(String[] args) { 
    
        SpringApplication.run(ApplicationMain.class, args);
    } 
 } 

8、启动服务提供者注册到服务注册中心集群中

(1)8671 节点
在这里插入图片描述
(2)8672 节点
在这里插入图片描述

(3)8673 节点
在这里插入图片描述

9、服务注册与发现

1、在客户端项目启动类添加 @EnableDiscoveryClient

@EnableEurekaClient 
EnableDiscoveryClient
@SpringBootApplication 
public class ApplicationMain{ 
    

    public static void main(String[] args) { 
    
        SpringApplication.run(ApplicationMain.class, args);
    } 
 } 

2、查询使用注册的服务信息

要注入 DiscoveryClient 实例。

@RestController
@RequestMapping("payment")
public class PaymentController { 
   

    // 服务发现
    @Resource
    private DiscoveryClient discoveryClient;

    @GetMapping("discovery")
    public Object discovery() { 
   
        List<String> services = discoveryClient.getServices();
        services.forEach(System.out::println);
		// 获得服务名下的实例列表
        List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
        instances.forEach(instance -> { 
   
            System.out.println(instance.getServiceId() + "\t" + instance.getHost() + "\t" + instance.getPort() + "\t" + instance.getUri());
        });
        return this.discoveryClient;
    }

}

3、@EnableDiscoveryClient 和 @EnableEurekaClient

(1)共同点:都是能够让注册中心能够发现,扫描到该服务。
(2)不同点:@EnableEurekaClient 只适用于 Eureka 作为注册中心,@EnableDiscoveryClient 可以用于所有注册中心(eureka,zookeeper,consul 和 nacos)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/130535.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 三分钟学会用Python+OpenCV批量裁剪xml格式标注的图片

    三分钟学会用Python+OpenCV批量裁剪xml格式标注的图片文章目录前言xml文件格式代码思想完整代码效果展示总结前言在目标检测中,数据集常常使用labelimg标注,会生成xml文件。本文旨在根据xml标注文件来裁剪目标,以达到去除背景信息的目的。xml文件格式以下是一个标注好的图片生成的xml文件。具体含义见代码注释。<annotation><!–xml所属文件夹–> <folder>JPEGImages</folder>

  • Oracle锁表查询和解锁方法

    Oracle锁表查询和解锁方法我们这里一般用的PL/SQL,总是无意间把表锁住,所以我今天就整理了一下简单的解锁和查询锁表的方法;一、首先PL/SQL要以管理员的账号(system/admin等)登录,管理员的账号和密码根据个人设置而来,连接为一般选择Normal,也可选择SYSDBA;二、相关SQL语句:–以下几个为相关表SELECT*FROMv$lock;SELECT*FROMv$sqlarea;S…

  • 键盘win键无法使用,win+r不生效、win键没反应、Windows键失灵万能解决方案

    键盘win键无法使用,win+r不生效、win键没反应、Windows键失灵万能解决方案Windows键失灵的几种解决方案今早用抹布擦洗键盘,不断拍打键盘,清理完成后发现键盘win键无法使用1、请先按住键盘上的FN键不放,然后按一下win键,即可恢复正常2、有些笔记本是fn+f2,或者是fn+f6锁了win键,导致win键按了没反应,再按一次即可正常3、有些机械键盘的游戏模式会屏蔽win键可以使用fn+有游戏图标的那个键即可恢复正常4、根据不同的键盘和电脑,可能有一些别的特殊按键也会锁定win键,造成无法使用,可以依次尝试fn+某些功能键来解锁5、万能终…

  • 使用Iocomp工控图表工具绘制实时曲线

    使用Iocomp工控图表工具绘制实时曲线概述:本文为使用Iocomp工控图表工具绘制实时曲线探索及研究教程,为大家介绍了Iocomp控件、实时曲线绘制方法、Iocomp界面操作,属性分类等。帮助学习者更好的运用Iocomp。

  • 个人整理的一些net 开源项目

    个人整理的一些net 开源项目net开源商城:BrnMall地址 http://www.brnshop.com/ 技术架构很不错;官方提供技术支持,有博客有视频介绍;官方技术博客:http://www.cnblogs.com/wheretime/官方视频下载地址:http://pan.baidu.com/s/1dDCKQXj真乃业界良心之作;风格和天猫京东各大商城接近;后台都很好;

  • sublime 激活码(注册激活)

    (sublime 激活码)JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。建立在开源IntelliJ平台之上,过去15年以来,JetBrains一直在不断发展和完善这个平台。这个平台可以针对您的开发工作流进行微调并且能够提供…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号