0
点赞
收藏
分享

微信扫一扫

Eureka的单机以及集群的使用详解

彭维盛 2022-04-20 阅读 50
javaspring

一、Eureka的基础知识
1.服务治理
Spring Cloud 封装了 Netflix 公司开发的 Eureka 模块来实现服务治理。在传统的rpc远程调用框架中,管理每个服务与服务之间依赖关系比较复杂,管理比较复杂,所以需要使用服务治理,管理服务于服务之间依赖关系,可以实现服务调用、负载均衡、容错等,实现服务发现与注册。
2.服务注册
Eureka采用了CS的设计架构,Eureka Server 作为服务注册功能的服务器,它是服务注册中心。而系统中的其他微服务,使用 Eureka的客户端连接到 Eureka Server并维持心跳连接。这样系统的维护人员就可以通过 Eureka Server 来监控系统中各个微服务是否正常运行。在服务注册与发现中,有一个注册中心。当服务器启动的时候,会把当前自己服务器的信息 比如 服务地址通讯地址等以别名方式注册到注册中心上。另一方(消费者|服务提供者),以该别名的方式去注册中心上获取到实际的服务通讯地址,然后再实现本地RPC调用RPC远程调用框架核心设计思想:在于注册中心,因为使用注册中心管理每个服务与服务之间的一个依赖关系(服务治理概念)。
3.Eureka的两个组件
Eureka Server和Eureka Client,Eureka Server提供服务注册服务各个微服务节点通过配置启动后,会在EurekaServer中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观看到。 EurekaClient通过注册中心进行访问是一个Java客户端,用于简化Eureka Server的交互,客户端同时也具备一个内置的、使用轮询(round-robin)负载算法的负载均衡器。在应用启动后,将会向Eureka Server发送心跳(默认周期为30秒)。如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,EurekaServer将会从服务注册表中把这个服务节点移除(默认90秒)
二、Eureka服务注册中心搭建
1.创建一个maven父工程springcloud,父工程下只有pom。在父工程中加入依赖。要注意版本。

    <dependencyManagement>
        <dependencies>
            <!--spring boot 2.2.2-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.2.2.RELEASE</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>

子模块继承之后,提供作用:锁定版本+子modlue不用写groupId和version
2.创建子模块cloud-eureka-server7001
在这里插入图片描述
2.添加依赖。在子模块cloud-eureka-server7001添加以下依赖

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

如图: 注意父工程和依赖

3.在resources目录,创建application.yml文件,配置如下内容:

server:
  port: 7001
eureka:
  instance:
    hostname: eureka7001.com #eureka服务端的实例名称
  client:
    register-with-eureka: false     #false表示不向注册中心注册自己。
    fetch-registry: false   #false表示自己端就是注册中心,职责就是维护服务实例,不需要去检索服务
    service-url:
      defaultZone: http://localhost:7001/eureka/

4.添加主启动类
在这里插入图片描述
5.启动。启动成功后,访问 http://localhost:7001/
标红的地方会显示注册进来的客户端,目前还没有
在这里插入图片描述
三、Eureka服务端的服务注册与发现
1.创建子模块cloud-client8001
在这里插入图片描述
2.修改pom,添加依赖。注意依赖和注册中心不同

<dependencies>
    <!--eureka-client-->
    <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>

在这里插入图片描述
3.在resources目录,创建application.yml文件,配置如下内容:

server:
  port: 8001

spring:
  application:
    name: cloud-client

eureka:
  client:
    #表示是否将自己注册进EurekaServer默认为true。
    register-with-eureka: true
    #是否从EurekaServer抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
    fetchRegistry: true
    service-url:
      defaultZone: http://localhost:7001/eureka
  instance:
      instance-id: client8001
      #访问路径可以显示IP地址
      prefer-ip-address: true

在这里插入图片描述

4.添加主启动类
在这里插入图片描述
5.测试
首先启动cloud-eureka-server7001
在启动cloud-client8001
启动完成之后刷新注册中心
在这里插入图片描述
这样就完成了cloud-client8001的服务注册与发现。

四、Eureka集群的搭建
1.参考cloud-eureka-server7001 来新建cloud-eureka-server7002
7001的application.ymll
在这里插入图片描述
7002的application.yml
在这里插入图片描述
2.因为使用一台电脑,所以要修改hosts文件,找到C:\Windows\System32\drivers\etc路径下的hosts文件,添加以下内容
在这里插入图片描述

3.参考cloud-client8001 新建cloud-client8002
修改application.yml 将单机改为集群

defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka

8001
在这里插入图片描述
8002
在这里插入图片描述
4.为了方便,在8001和8002写入了相同的controller

@RestController
public class Client8001Controller {
    @Value("${server.port}")
    private String serverPort;

    @GetMapping("/client/get")
    public String clientGet(){
        return "你好,我是"+serverPort;
    }
}

在这里插入图片描述
5.创建一个子模块cloud-payment80为客户端
在pom中添加和8001、8002相同的依赖
添加application.yml

server:
  port: 80

spring:
  application:
    name: cloud-payment80

eureka:
  client:
    #表示是否将自己注册进EurekaServer默认为true。
    register-with-eureka: false
    #是否从EurekaServer抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
    fetchRegistry: true
    service-url:
      #单机
      #defaultZone: http://localhost:7001/eureka
      #集群
      defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka

在这里插入图片描述

添加主启动

@SpringBootApplication
@EnableEurekaClient
public class PaymentMain80 {
    public static void main(String[] args) {
        SpringApplication.run(PaymentMain80.class,args);
    }
}

在这里插入图片描述

在cloud-payment80添加配置类ApplicationContextConfig,这里添加配置类是为了负载均衡

@Configuration
public class ApplicationContextConfig {
    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }
}

在这里插入图片描述
6.编写客户端cloud-payment80的controller

@RestController
public class PaymentController {

    public static final String PAYMENT_URL = "http://CLOUD-CLIENT";

    @Resource
    private RestTemplate restTemplate;

    @GetMapping("/payment/client/get")
    public String payment() {
        return restTemplate.getForObject(PAYMENT_URL + "/payment/get",String.class);
    }
}

在这里插入图片描述

PAYMENT_URL= “http://CLOUD-CLIENT” 通过在eureka上注册过的微服务名称调用,也就是注册中心中的Application(服务端8001中application.yml中的spring.application.name)

7.启动服务注册中心7001、7002
测试登录地址
http://localhost:7001/
在这里插入图片描述
http://localhost:7002/
在这里插入图片描述
出现以上结果表示集群搭建成功
8.启动服务端8001、8002、以及客户端80
刷新注册中心
在这里插入图片描述
出现以上就代表这服务端和客户端都注册进了注册中心
9.测试80客户端负载均衡访问服务端8001和服务端8002
因为Ribbon和Eureka整合后客户端可以直接调用服务不需要在写端口号
http://localhost/payment/client/get
在这里插入图片描述
在这里插入图片描述

五、Eureka的自我保护机制(以下采用单机7001和8001)
1.保护模式主要用于一组客户端和Eureka Server之间存在网络分区场景下的保护。一旦进入保护模式,Eureka Server将会尝试保护其服务注册表中的信息,不再删除服务注册表中的数据,也就是不会注销任何微服务。
即:某一个时刻,某一个微服务不可用了,eureka不会立即清理,依旧会对该微服务的信息进行保存!
在这里插入图片描述
2.CAP原则又称CAP定理,指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可得兼
Eureka保证AP
Eureka看明白了这一点,因此在设计时就优先保证可用性。Eureka各个节点都是平等的,几个节点挂掉不会影响正常节点的工作,剩余的节点依然可以提供注册和查询服务。而Eureka的客户端在向某个Eureka注册或时如果发现连接失败,则会自动切换至其它节点,只要有一台Eureka还在,就能保证注册服务可用(保证可用性),只不过查到的信息可能不是最新的(不保证强一致性)。

3.Eureka自我保护机制工作机制
如果在15分钟内超过85%的节点都没有正常的心跳,那么Eureka就认为客户端与注册中心出现了网络故障,此时会出现以下几种情况:
(1) Eureka不再从注册列表中移除因为长时间没收到心跳而应该过期的服务
(2) Eureka仍然能够接受新服务的注册和查询请求,但是不会被同步到其它节点上(即保证当前节点依然可用)
(3)当网络稳定时,当前实例新的注册信息会被同步到其它节点中

4.关闭Eureka的自我保护机制
Eureka的保护机制默认是打开的,使用eureka.server.enable-self-preservation = false 可以禁用自我保护模式
修改注册中心7001配置文件
在这里插入图片描述
修改服务端8001的配置文件
在这里插入图片描述
5.启动注册中心7001、服务端8001
在这里插入图片描述
发现这里的英文已经变化 。THE SELF PRESERVATION MODE IS TURNED OFF(自我保护模式被关闭了),关闭成功。
6.关闭服务端8001,刷新注册中心,发现8001已经被注册中心剔除。
在这里插入图片描述

举报

相关推荐

0 条评论