Eureka详细讲解 作者:哇塞大嘴好帥

Eureka详细讲解 作者:哇塞大嘴好帥(哇塞大嘴好帅)

作者:哇塞大嘴好帥(哇塞大嘴好帅)

​ Hi,我是哇塞大嘴好帥,也是我爱大嘴网的作者,我的所有博文欢迎大家转载。 但是一定要标明作者是我,谢谢大家对大嘴的支持,我们江湖见!
我的博客 http://www.dazuizui.com/hlogin/ 正在开发阶段,谢谢大家的支持。我发布的所有博文,港区社区(由于某些原因不能透露港区社区的url)与CSDN同步发布。

1.基础理论

1.2 什么是注册服务注册

​ Eureka采用了CS设计架构,EurekaServer做服务注册功能的服务,他就是服务注册中心,其他微服务通过EurekaClient连接到EurekaServer维持心跳。这样敲代码的就可以通过EurekaServer来监控个个微服务的运行状态。

1.3 Eureka 两大组件

Eureka Server 提供服务注册服务

​ 所有微服务会通过配置启动后,会在EurekaServer进行注册,这样EurekaServer中服务注册表中就会存储所有可用服务节点的信息,服务节点信息可以在界面中直观的看到

Eureka Client 通过注册成中心进行访问

​ 是一个Java客户端,用于简化Eureka Server的交互,客户端也具备一个内置的、使用轮询(round-robin)负载均衡器。在客户端启动后,将会向EurekaServer发送心跳(默认每次发送心跳间隔为30秒)。如果Eureka Server在多个心跳周期内没有收到某个微服务的心跳,EurekaServer将会从服务注册表中把这个服务节点移除(默认等待时间为90秒

2单机版的Eureka

2.1 Eureka Server 注册中心

Maven

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    <version>2.2.2.RELEASE</version>
</dependency>

applicatiom.yml文件

server:
  # 设置端口
  port: 7002
eureka:
  instance:
    #Eureka服务端名字
    hostname: 127.0.0.1
  client:
    # 是否向注册中心注册自己
    register-with-eureka: false
    # false表示自己就是注册中心
    fetch-registry: false
    service-url:
      # 设置与Eureka交互的地址
      defaultZone: http://127.0.0.1:7002/eureka

主方法

package com.dazuizui.eureka;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;


/**
 * @author 杨易达
 * @Time   2020/7/11 20:33
 * @Text   eureka的springboot启动类
 */
@EnableEurekaServer				//我是注册中心的启动类
@SpringBootApplication
public class EurekaApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaApplication.class, args);
    }

}

​ 启动注册中心启动类,请求 http://127.0.0.1:7002 如果看到以下Eureka主页画面就 恭喜您:证明您Eureka注册中心启动成功!!

2.2 Eureka Client 客户端加入注册中心

Maven

<!--Eureka客户端-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    <version>2.2.2.RELEASE</version>
</dependency>

application.yml

server:
  #设置端口
  port: 8001
eureka:
  client:
    # 是否将自己注册进Eureka
    register-with-eureka: true
    # 是否让EurekaServer抓取自己的注入信息,默认为true。如果是集群必须设置为true才能配合负载均衡
    fetch-registry: true
    service-url:
      # 设置与Eureka交互的地址  将自己注册到http://127.0.0.1:7002/eureka注册中心
      defaultZone: http://127.0.0.1:7002/eureka

主方法

package com.dazuizui.user;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.hystrix.EnableHystrix;

/**
 * @author 杨易达
 * @Time   2020/7/23 11:40
 * @Text   用户模板启动类
 */
@SpringBootApplication
@EnableEurekaClient				//声明自己是Eureka Client启动类 Eureka客户端
public class UserApplication {
    public static void main(String[] args) {
        SpringApplication.run(UserApplication.class, args);
    }
}

​ 启动顺序一定要先启动EurekaServer在去启动EurekaClient当我们成功把EurekaClient注册到了EurekaServer就会在EurekaServer显示实例中显示,如图

3.Eureka集群

​ 首先思考个问题,假如你有一个控制中心,它出现了故障,会导致整个服务环境不可用。

​ 解决办法: 搭建Eureka注册中心集群,实现负载均衡+故障容错

3.1 Eureka集群环境搭建

测试环境:2台服务器

Eureka集群一定是相互注册

​ 修改Eureka集群只需要修改配置文件即可,不需要修改其他。

第一台Eureka集群配置文件

server:
  port: 7001
spring:
  application:
    name: eureka-1
eureka:
  instance:
    hostname: Eureka-1 # eureka服务端实例名称
  client:
    #false表示不向注册中心注册自己
    register-with-eureka: false
    #false表示自己就是注册中心
    fetch-registry: false
    service-url:
      # 设置与 eureka server交互的地址
      defaultZone: http://第二台服务器ip:7002/eureka/

第二台Eureka集群配置文件

server:
  port: 7001
spring:
  application:
    name: eureka-2
eureka:
  instance:
    hostname: Eureka-2 # eureka服务端实例名称
  client:
    #false表示不向注册中心注册自己
    register-with-eureka: false
    #false表示自己就是注册中心
    fetch-registry: false
    service-url:
      # 设置与 eureka server交互的地址
      defaultZone: http://第一台服务器ip:7001/eureka/

​ 由于是相互注册,所有第一台EurekaServer要注册到第二台EurekaServer中,第二台要注册到第一台中,这样就实现了相互注册。

第一台服务器EurekaIndex

第二台服务器EurekaIndex

​ 第一台服务器的EurekaServer1DS Replicas指向了第二台服务器的Eureka Server,第二台服务器的Eureka Server指向了第一台服务器的注册中心 。 如果你实现了此功能,恭喜您,您的集群搭建成功。

3.2 将微服务注册到Eureka集群

微服务项目配置文件

server:
  port: 8001
spring:
  application:
    name: test1
eureka:
  client:
    #表示是否将自己注册进EurekaServer默认为true
    register-with-eureka: true
    #是否从EurekaServer抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用 负载均衡
    fetch-registry: true
    service-url:
      #注册中心地址	如果集群每个Eureka注册中心都写上用,间隔
      defaultZone:  http://服务器1ip:7001/eureka/,http://服务器2ip:7001/eureka/
  instance:
    prefer-ip-address: true

启动微服务,进入EurekaServer观察**EurekaServer ** Instances curre registered with Eureka

EurekaServer1

EurekaServer2

​ 我们会发现我们的微服务同时注册到了EurekaServer1EurekaServer2

​ 如果我们EurekaServer1集群挂掉了,EurekaServer2会代替EurekaServer1,并且等待EurekaServer2的上市

4.Eureka自我保护机制

自我保护模式默认是开启的。

​ 某一时刻微服务不可用了,Eureka不会立即清理,依旧会对微服务的信息保存

4.1 自我保护机制是什么样子的?

​ 如果在EurekaIndex.html看到了EMERGENCY!EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY`RE NOT.RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO SAFE 就代表进入了自我保护模式。

4.2 为什么产生自我保护机制?

​ 为了防止EurekaClientEurekaServer网络不通\不顺利的情况下,EurekaServer不会立刻将EurekaClient删除。

4.3 什么是自我保护机制?

​ 默认情况下,如果EurekaServer一定时间内没有接收到某个微服务的心跳EurekaServer会注销该实例(默认等待的时间是90秒)。

​ 如果网络发生了问题,如延迟,卡顿,拥挤等原因导致了不能与EurekaServer正常通信,如果没有自我保护机制就会将此微服务立即删除掉,如果此微服务是非健康的被删除是我们想要的,如果此微服务是健康的被删除了就不是我们想要的答案。通过Eureka自我保护机制就可以解决此问题了。

EurekaClient会定时给EurekaServer发送心跳包,翻译成人话就是告诉EurekaServer我还活着别给我绿了。

4.4 禁止自我保护

EurekaServer

eureka:
  client:
    #表示是否将自己注册进EurekaServer默认为true
    register-with-eureka: false
    #是否从EurekaServer抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用 负载均衡
    fetch-registry: false
    service-url:
      #注册中心地址
      defaultZone:  http://127.0.0.1:7001/eureka/
  server:
  	#关闭自我保护
  	enable-self-preservation: false 
  	#2000毫秒没有心跳直接删除
  	eviction-interval-timer-in-ms: 2000

EurekaClient

eureka:
  client:
    #表示是否将自己注册进EurekaServer默认为true
    register-with-eureka: true
    #是否从EurekaServer抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用 负载均衡
    fetch-registry: true
    service-url:
      #注册中心地址
      defaultZone:  http://127.0.0.1:7001/eureka/
  instance:
  	# 访问路径可以显示ip
    prefer-ip-address: true
    # 发送EurekaServer心跳的间隔
    lease-renewal-interval-in-seconds: 2
    # 服务上限 Eureka服务端在接收到最后一次心跳后的等待时间上限,默认为90秒
    lease-expiration-duration-in-seconds: 2

5.Eureka停止更新

The existing open source work on eureka 2.0 is discontinued. The code base and artifacts that were released as part of the existing repository of work on the 2.x branch is considered use at your own risk.

Eureka 1.x is a core part of Netflix’s service discovery system and is still an active project.

Google翻译:

有關eureka 2.0的現有開源工作已停止。 在2.x分支上作為現有工作資料庫的一部分發佈的代碼庫和工件被視為使用後果自負。

Eureka 1.x是Netflix服務發現系統的核心部分,仍然是一個活躍的項目。

6.Discovery服务发现

主启动类

​ 添加此注解

@EnableDiscoveryClient

测试

​ 为了节约时间,就在Controller进行测试

@Resource
private DiscoveryClient discoveryClient;

@GetMapping(value = "test1")
public String test1(){
    //获取所有实例
    System.out.println(discoveryClient.getServices());

    //获取指定实例信息
    List<ServiceInstance> instances = discoveryClient.getInstances("Eureka-1");
    for (ServiceInstance instance : instances) {
        System.out.println("ip"+instance.getHost()+"\t 实例昵称"+instance.getServiceId()+"\t 端口"+ instance.getPort()+"\t URL"+instance.getUri());
    }
    return "123";
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哇塞大嘴好帅(DaZuiZui)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值