SpringCloud-微服务的注册与发现Eureka(二)

一、SpringCloud简介

  Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring Cloud并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。

二、微服务的注册与发现-Eureka

Eureka是Netflix开源的服务发现组件,本身是基于Rest的服务,它包含服务端和客户端两部分;在SpringCloud中将它集成在其中,从而实现了微服务的发现与注册; - Eureka的GitHub:https://github.com/Netflix/Eureka

Eureka Server - 服务端-没有存储,内存保持,每服务实例需要发送心跳去续约 - 客户端-在内存中缓存着eureka的注册信息,因此不必每请求到eureka查找服务 - eureka之间会做注册服务同步,从而保证状态一致,客户端只需访问一个eureka Service Provider - 会向Eureka Server做Register(服务注册)、Renew(服务续约)、Cancel(服务下线)等操作 Service Consumer - 会向Eureka Server获取注册服务列表,并消费服务

三、简单实战

1、编写服务端(SpringCloud使用的是Edgware SR3版本)


在pom.xml中加入以下依赖:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.13.RELEASE</version>
  </parent>

  <dependencies>
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-eureka-server</artifactId>
    </dependency>
  </dependencies>
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-dependencies</artifactId>
        <version>Edgware.SR3</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>

在配置文件application.xml中添加以下配置:

server.port=8781
#表示是否将自己注册在EurekaServer上,默认为true。由于当前应用就是EurekaServer,所以置为false
eureka.client.register-with-eureka=false
#表示表示是否从EurekaServer获取注册信息,默认为true。单节点不需要同步其他的EurekaServer节点的数据
eureka.client.fetch-registry=false
#设置Eureka的地址
eureka.client.service-url.defaultZone=http://localhost:8781/eureka

添加启动类,并加上启动Eureka注解:

@SpringBootApplication
@EnableEurekaServer
public class Application {

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

启动项目,打开http://localhost:8781/,如下:

2、编写客户端(SpringCloud使用的版本与服务端一致)


 在pom.xml中加入依赖:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-parent</artifactId>
    <version>1.5.13.RELEASE</version>
  </parent>

  <dependencies>
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-eureka</artifactId>
    </dependency>
  </dependencies>
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-dependencies</artifactId>
        <version>Edgware.SR3</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>

在配置文件application.xml加入要注入的配置中心的url等配置:

server.port=8782
#对该应用另起别名
spring.application.name=client-8782
#注入目标,配置服务中心url,与服务端的配置保持一致
eureka.client.service-url.defaultZone=http://localhost:8781/eureka/

创建客户端启动类ClientApplication.java,并加入客户端被发现注解:

@SpringBootApplication
@EnableDiscoveryClient
public class ClientApplication {

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

}

启动应用,接着打开之前Eureka的注册页面http://localhost:8781/,如下:

发现刚刚启动的客户端已经注册在了服务端了。

当我将客户端关闭后,再次打开Eureka的注册页面,发现有一串红字:

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进入了自我保护机制,默认情况下,如果EurekaServer在一定时间内没有接收到某个微服务实例的心跳时,EurekaServer将会注销该实例(默认90s)。但是当网络发生故障时,微服务与EurekaServer之间无法通信,这样就会很危险了,因为微服务本身是很健康的,此时就不应该注销这个微服务,而Eureka通过自我保护机制来预防这种情况,当网络健康后,该EurekaServer节点就会自动退出自我保护模式;

这时再次将客户端微服务启动,刷新服务注册中心会发现,自我保护状态已取消。

综上所述,我们可以看出来Eureka的两个组件EurekaServer和EurekaClient的作用:

  1. EurekaServer 提供服务发现的能力,各个微服务启动时,会向EurekaServer注册自己的信息(例如:ip、端口、微服务名称等),EurekaServer会存储这些信息;
  2. EurekaClient是一个Java客户端,用于简化与EurekaServer的交互;
  3. 微服务启东后,会定期性(默认30s)的向EurekaServer发送心跳以续约自己的“租期”;
  4. 如果EurekaServer在一定时间内未接收某个微服务实例的心跳,EurekaServer将会注销该实例(默认90s);
  5. 默认情况下,EurekaServer同时也是EurekaClient。多个EurekaServer实例,互相之间通过复制的方式,来实现服务注册表中数据的同步;
  6. EurekaClient也会缓存服务注册表中的信息;

综上,Eureka通过心跳检查、客户端缓存等机制,提高了系统的灵活性、可伸缩性和可用性,所以作为一个微服务架构,需要一个服务注册中心来统筹管理服务;

3、Eureka高可用


 复制上面server项目,分别命名:eureka-keepalived-server-1,eureka-keepalived-server2;

 复制上面client项目,命名为:eureka-keepalived-client;

修改hosts文件:

127.0.0.1    localhost server1 server2

修改application.properties配置文件(注意需要将eureka.client.register-with-eureka、eureka.client.fetch-registry注释掉):

eureka-keepalived-server-1的配置文件:

server.port=8781
spring.application.name=eureka-server-1
spring.profiles.active=server1
#eureka.client.register-with-eureka=false
#eureka.client.fetch-registry=false
#指定主机名
eureka.instance.hostname=server1
#设置EurekaServer的地址,将自身注册到Server2
eureka.client.service-url.defaultZone=http://server2:8782/eureka

eureka-keepalived-server-2的配置文件:

server.port=8782
spring.application.name=eureka-server-2
#指定hostname
spring.profiles.active=server2
#eureka.client.register-with-eureka=false
#eureka.client.fetch-registry=false
#指定主机名
eureka.instance.hostname=server2
#设置EurekaServer的地址,将自己注册在Server2上
eureka.client.service-url.defaultZone=http://server1:8781/eureka

eureka-keepalived-client的配置文件:

server.port=8783
#对该应用另起别名
spring.application.name=client-8783
#注入目标,配置服务中心url,与服务端的配置保持一致,这里可以写多个,以“,”分隔,如http://server1:8781/eureka/,http://server2:8782/eureka/
eureka.client.service-url.defaultZone=http://server1:8781/eureka/

分别启动两个服务端server2、server1,访问,server1:8781/,server2:8782/,如下:

启动客户端,发现客户端分别在两个服务端都有相应的注册,而我们的客户端实际只指定了一个Server;

至此,完成了Eureka的高可用;

示例代码:https://gitee.com/lfalex/springcloud-example.git

参考书籍:《SpringCloud与Docker微服务架构实战》周力著

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

1 条评论
登录 后参与评论

相关文章

来自专栏云计算

使用 Spring Boot 2.0,Eureka 和 Spring Cloud 的微服务快速指南

原文地址:https://dzone.com/articles/quick-guide-to-microservices-with-spring-boot-20...

9961
来自专栏小灰灰

Quick-Task 动态脚本支持框架之任务动态加载

前面几篇博文分别介绍了整个项目的基本架构,使用说明,以及整体框架的设计与实现初稿,接下来则进入更细节的实现篇,将整个工程中核心实现捞出来,从为什么这么设计到最终...

1002
来自专栏磨磨谈

如何避免Cephfs被完全毁掉

一套系统的最低要求是可恢复,也就是数据不丢失,但是在各种各样的原因下,整套系统都有被毁掉的可能,一直以来有个观点就是存储是需要两套的,一般情况下很难实现,但是如...

1071
来自专栏IMWeb前端团队

ke.qq.com接入登录态隔离总结

一、接入登录态隔离背景 目前腾讯的web业务都是共享skey作为登录态凭证,skey这个cookie打在*.qq.com一级域名下,被qzone.qq.com、...

2420
来自专栏JackieZheng

学习SpringMVC——从HelloWorld开始

前言:   时隔十二年,中国女排最终过关斩将,用3:1的成绩证明了自己的实力,霸气夺冠,为中国赢得了一枚意义非常的金牌。这是一次全民的狂欢,一场视听盛宴,带给我...

1947
来自专栏JAVA同学会

Eureka服务注册中心

  最近在研究Spring Cloud,发现其中的组件实在是太多了,真的是头大,只能一块一块看,像盲人摸象一样。要想很短时间内掌握Spring Cloud是不可...

891
来自专栏散尽浮华

部署Zipkin分布式性能追踪日志系统的操作记录

Zipkin是Twitter的一个开源项目,是一个致力于收集Twitter所有服务的监控数据的分布式跟踪系统,它提供了收集数据,和查询数据两大接口服务。 部署Z...

5086
来自专栏腾讯大讲堂的专栏

zookeeper 运营经验分享

Zookeeper作为TDBank系统的一个重要模块,我们运营它已经两年多。在使用过程中,我们也遇到了一些问题及走过很多弯路,本文主要对zookeeper运营经...

2147
来自专栏Ryan Miao

SpringCloud学习1-服务注册与发现(Eureka)

前言 Oracle转让Java,各种动态语言的曝光率上升,Java工程师的未来在哪里?我觉得Spring Cloud让未来有无限可能。拖了半年之久的Spring...

8627
来自专栏大闲人柴毛毛

教你如何配置一套强大的防火墙——iptabels配置详解(一)

今天我来带领大家给自己的服务器搭建一套强大的防火墙!废话不多说,我们开始吧~ 啥是iptables? ipbtales是集成再Linux内核中的一套防火墙软件。...

27410

扫码关注云+社区