Spring Cloud入门实战(一) Eureka--服务注册与发现

服务的注册与发现

在微服务架构中,服务的发现和注册至关重要。服务提供者、服务消费者、服务发现组件的关系大致如下:

  • 各个微服务在启动时,将自己的网络地址等信息注册到服务发现组件中,服务发现组件会存储这些信息。
  • 服务消费者可从服务发现组件查询服务提供者的网络地址,并使用该地址调用服务提供者的接口。
  • 各个微服务与服务发现组件使用一定机制通信。服务发现组件如长时间无法与某微服务实现通信,就会注销该实例。
  • 微服务网络地址发生变更时,会重新注册到服务发现组件。使用这种方式服务消费者就无需人工修改提供者的网络地址了。
    Spring Cloud入门实战(一) Eureka--服务注册与发现_第1张图片

Eureka简介

Eureka是Netflix开源的服务发现组件,本身是一个基于REST的服务。它包含server和client两部分。可以用它来实现微服务的注册与发现。

Eureka原理和作用

  • Eureka Server 提供服务发现的能力,各个微服务启动的时候,会向Eureka Server中注册自己的信息,一些ip、端口、名称等等。Eureka Server 会存储这些消息。
  • Eureka Client 是一个java客户端,用于简化和Server的交互。
  • 微服务启动后,会周期性的(默认30s)向Eureka Server发送心跳消息以续约。
  • 如果Eureka Server一段时间没有收到某个微服务的心态,那么Eureka Server将会注销该实例。(90秒后)
  • 默认情况下,Eureka Server也是 Eureka Client。多个Eureka Server实例,互相之间通过复制的方式,来实现注册表中数据的同步。
  • Eureka Client 会缓存注册表中的信息。保证即使Eureka Server 无响应挂掉之后,能正常在缓存中找到服务提供者信息。

编写Eureka Server

本文用到的springboot版本为2.2.2.RELEASE,springcloud版本为Hoxton.SR1

创建一个springboot项目

Spring Cloud入门实战(一) Eureka--服务注册与发现_第2张图片
添加Eureka Server的起步依赖。
Spring Cloud入门实战(一) Eureka--服务注册与发现_第3张图片
在启动类上加入@EnableEurekaServer注解,声明这是一个Eureka Server 服务。

将application.properties改成application.yml,然后写入以下配置

server:
  port: 8000
eureka:
  client:
    register-with-eureka: false #表示是否将自己注册到Eureka Server。
    fetch-registry: false #表示是否从Eureka Server 拉取信息。默认为true,因为这是一个单节点的Eureka Server,所以不需要。
    service-url:
      defaultZone: http://localhost:8000/eureka/ #表示与Eureka Server 交互的地址。查询服务和注册服务都需要用到这个地址。多个地址可用逗号分隔。

这样一个Eureka Server 已经编写完成了,是不是很简单呢。然后启动项目,访问http://localhost:8000/
Spring Cloud入门实战(一) Eureka--服务注册与发现_第4张图片

编写Eureka Client 注册到 Eureka Server

新建一个项目,或者将Server的项目拷贝过来。在启动类上添加@EnableDiscoveryClient注解。pom文件不用变。
也可以用@EnableEurekaClient 注解,@EnableDiscoveryClient注解为各种服务发现组件都提供了支持,而@EnableEurekaClient只能用于Eureka,所以如果服务发现组件是Eureka的时候,两者没有区别。

在配置文件中配置

server:
  port: 8001
spring:
  application:
    name: Eureka-Client1 #是指定client注册的服务名称。
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8000/eureka/ #指定要注册到哪去

然后启动项目。之前的server项目也要启动。再访问localhost:8000,就能看到注册的实例了。
Spring Cloud入门实战(一) Eureka--服务注册与发现_第5张图片

Eureka Server的高可用(集群)

单机模式的Eureka Server显然不适合平常生产环境,虽然Eureka Server宕机之后,Eureka Client会通过缓存进行调用,但如果缓存不更新,就可能会影响到微服务的调用,甚至某些微服务不可用。这显然是不被允许的,因此,在生产环境中,通常会部署一个高可用的Eureka Server集群。

Eureka Server 可以通过运行多个实例并相互注册。节点之间的相互注册时Eureka的默认行为。
下面来构建一个双节点的Eureka Server 集群。

方法一:两个项目不同端口
将前面的eureka-server的配置文件做些修改
去掉register-with-eureka: falsefetch-registry: false 添加一个注册的服务名称。如下

server:
  port: 8000
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8002/eureka/ #注册到8002端口的server
spring:
  application:
    name: eureka-server1

将eureka-server复制一份。修改配置文件。

spring:
  application:
    name: eureka-server2
server:
  port: 8002
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8000/eureka/

然后同时启动。
Spring Cloud入门实战(一) Eureka--服务注册与发现_第6张图片
Spring Cloud入门实战(一) Eureka--服务注册与发现_第7张图片
方法二:一个项目运行不同实例。

首先修改hosts文件,后面加上server1,server2

127.0.0.1       localhost server1 server2

然后修改eureka-server的配置文件。

spring:
  application:
    name: eureka-servers
---
server:
  port: 8000
eureka:
  client:
    service-url:
      defaultZone: http://server2:8002/eureka/ # 注册到server2
  instance:
    hostname: server1
spring:
  profiles: server1 # 环境是server1
---
server:
  port: 8002
eureka:
  client:
    service-url:
      defaultZone: http://server1:8000/eureka/
  instance:
    hostname: server2
spring:
  profiles: server2

配置idea项目的运行环境。
Spring Cloud入门实战(一) Eureka--服务注册与发现_第8张图片
添加一个启动配置。
Spring Cloud入门实战(一) Eureka--服务注册与发现_第9张图片
一个配上serve1 一个配置server2。然后都启动。就可以看到结果。

Spring Cloud入门实战(一) Eureka--服务注册与发现_第10张图片

Spring Cloud入门实战(一) Eureka--服务注册与发现_第11张图片

将应用(client)注册到集群

修改eureka-client的配置文件。

server:
  port: 8001
spring:
  application:
    name: Eureka-Client1
eureka:
  client:
    service-url:
      defaultZone: http://server1:8000/eureka/,http://server2:8002/eureka/ #这里加了个server

然后运行。
Spring Cloud入门实战(一) Eureka--服务注册与发现_第12张图片
Spring Cloud入门实战(一) Eureka--服务注册与发现_第13张图片
其实这里,不配置也是一样的,只需要配置一个server就行,因为server集群间会相互注册,同步消息,数据会同步的。但是为了严谨,还是建议加上。

为Eureka Server添加用户认证

有的时候不希望别人(项目之外)能看到Eureka Server。就可以配置一下访问Eureka Server需要账号密码了。

在eureka-server项目的pom文件中添加security的配置,在spring下。

spring:
  application:
    name: eureka-servers
  security:
    user:
      name: user
      password: 123456

然后重启。访问server控制台。
Spring Cloud入门实战(一) Eureka--服务注册与发现_第14张图片

输入账号密码登陆。但是要注意的一点是,配置了账号密码登陆之后,注册到这个Eureka Server的服务也需要加上账号密码。

登陆进去会发现一个注册的服务都没有,这是因为Spring Cloud 2.0 以上的security默认启用了csrf检验,必须要在eureka-server添加一个配置类,默认的关掉csrf认证。

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable();
        super.configure(http);
    }
}

然后重启查看就有了。
Spring Cloud入门实战(一) Eureka--服务注册与发现_第15张图片

Eureka Server的自我保护模式

Spring Cloud入门实战(一) Eureka--服务注册与发现_第16张图片
这就是进入了自我保护模式的表现。
默认情况下,如果Eureka Server 在一定时间(90s)内没有接收到某个微服务的心跳,它就会注销该实例。但是当网络出现故障时,微服务与Eureka Server之间无法正常通信,这样就不应该注销这个微服务。所以Eureka Server 通过自我保护模式来解决这个问题。当Eureka Server 在短时间内丢失多个客户端的时候,那么节点就会进入自我保护模式。一旦节点进入自我保护模式,Eureka Server 就会保护服务注册表中的信息,不再删除注册表的数据,也就是不会注销该节点。当故障恢复后(能正常通信了),Eureka Server的节点就会自动退出自我保护模式。

如果为了系统项目的要求,需要禁止自我保护模式,可以在配置文件中配置。

eureka:
  server:
    enable-self-preservation: false

Eureka Server的健康检查

在这里插入图片描述
Status栏目显示的UP表示应用程序正常。但是这个也不能完全的反应应用程序的状态。如果应用程序与Eureka Server之间心跳正常,但是应用程序本身出了问题,但是没挂。这样显示就不是很准确。那就需要把微服务的健康状态传到Eureka Server。在client里配置

eureka:
  client:
    healthcheck:
      enabled: true

这样就不会仅仅依靠心跳机制来判断是否UP了。

你可能感兴趣的:(Spring,Cloud)