Spring Clould简单使用之Eureka注册中心


#Eureka注册中心

原理图

1525597885059

介绍

SpringCloud Eureka是SpringCloud Netflix服务套件中的一部分,它基于Netflix Eureka做了二次封装,主要负责完成微服务架构中的服务治理功能。Spring Cloud Eureka是Spring Cloud Netflix项目下的服务治理模块。而Spring Cloud Netflix项目是Spring Cloud的子项目之一,主要内容是对Netflix公司一系列开源产品的包装,它为Spring Boot应用提供了自配置的Netflix OSS整合。通过一些简单的注解,开发者就可以快速的在应用中配置一下常用模块并构建庞大的分布式系统。它主要提供的模块包括:服务发现(Eureka),断路器(Hystrix),智能路由(Zuul),客户端负载均衡(Ribbon)等。

Eureka架构中的三个核心角色:

  • 服务注册中心

    Eureka的服务端应用,提供服务注册和发现功能,就是刚刚我们建立的eureka-demo

  • 服务提供者

    提供服务的应用,可以是SpringBoot应用,也可以是其它任意技术实现,只要对外提供的是Rest风格服务即可。本例中就是我们实现的user-service-demo

  • 服务消费者

    消费应用从注册中心获取服务列表,从而得知每个服务方的信息,知道去哪里调用服务方。本例中就是我们实现的consumer-demo

##Eureka注册中心使用

###服务注册中心eureka-server

添加依赖

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

修改配置文件

spring:
  application:
    name: eureka-service


eureka:
  client:
    service-url:
      defaultZone: http://localhost:10087/eureka
    fetch-registry: false
    register-with-eureka: false
  instance:
    prefer-ip-address: true
    ip-address: 127.0.0.1



server:
  port: 10086

在启动类上添加注解

@EnableEurekaServer

在使用Spring boot为我们提供的started后创建一个注册中心十分方便。

服务提供方 :eureka-client

引入相关依赖

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

修改配置文件

eureka:
  client:
    service-url:
      defaultZone: http://localhost:10086/eureka,http://localhost:10087/eureka
  instance:
    prefer-ip-address: true
    ip-address: 127.0.0.1

在启动类上添加注解

@EnableDiscoveryClient

服务消费者

配置基本同上。只有部分地方不一样。因为消费者也是注册中心的client

拉取服务列表

主要通过DiscoveryClient类的对象完成操作

举例:

@Autowired
private DiscoveryClient discoveryClient;
@GetMapping("{id}")
    public User queryForObjects(@PathVariable("id")Integer id) {
        List<ServiceInstance> instances = discoveryClient.getInstances("user-service");
        ServiceInstance serviceInstance = instances.get(0);
        String url="http://"+serviceInstance.getHost()+":"+serviceInstance.getPort()+"/user/"+id;
        System.out.println(url);
        User user = restTemplate.getForObject(url, User.class);
        return user;
    }

配置详解

defaultZone

eureka:
  client:
    service-url:
      defaultZone: http://localhost:10086/eureka,http://localhost:10087/eureka

###@EnableDiscoveryClient

该代表了将服务的客户端注册到哪个注册中心server。(服务注册中心server亦是client也可以自己注册自己,也可以注册到其它到注册中心上)

@EnableEurekaClient 与@EnableDiscoveryClient

首先这个两个注解都可以实现服务发现的功能,在spring cloud中discovery service有许多种实现(eureka、consul、zookeeper等等)

@EnableEurekaClient基于spring-cloud-netflix。服务采用eureka作为注册中心,使用场景较为单一。

@EnableDiscoveryClient基于spring-cloud-commons。服务采用其他注册中心。

关闭自己注册自己

eureka:
  client:
    fetch-registry: false
    register-with-eureka: false

服务续约

eureka:
  instance:
    lease-expiration-duration-in-seconds: 90
    lease-renewal-interval-in-seconds: 30
  • lease-renewal-interval-in-seconds:服务续约(renew)的间隔,默认为30秒
  • lease-expiration-duration-in-seconds:服务失效时间,默认值90秒

服务消费者

拉取服务列表

eureka:  
	client:    
		registry-fetch-interval-seconds: 5

生产环境中,我们不需要修改这个值。

失效剔除和自我保护

失效剔除

有些时候,我们的服务提供方并不一定会正常下线,可能因为内存溢出、网络故障等原因导致服务无法正常工作。Eureka Server需要将这样的服务剔除出服务列表。因此它会开启一个定时任务,每隔60秒对所有失效的服务(超过90秒未响应)进行剔除。

可以通过eureka.server.eviction-interval-timer-in-ms参数对其进行修改,单位是毫秒,生成环境不要修改。

这个会对我们开发带来极大的不变,你对服务重启,隔了60秒Eureka才反应过来。开发阶段可以适当调整,比如10S

自我保护

服务时效会发出警告

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 BE SAFE.


eureka:
  server:
    enable-self-preservation: false # 关闭自我保护模式(缺省为打开)
    eviction-interval-timer-in-ms: 1000 # 扫描失效服务的间隔时间(缺省为60*1000ms)

文章作者: Bxan
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Bxan !
  目录