前几篇文章我们讲了一下Eureka的基础使用,但是呢有一个很重要的问题,我们讲的都是单机版的情况,如果这个时候Eureka服务挂了的话,那么我们的服务提供者跟服务消费者岂不是都废了?服务提供者和消费者都废了的话那这个程序还有存在的意义么?

那么今天咱们就讲一讲如何解决这个问题。相信大家都知道,这个问题是我们提供高可用服务必须经历的问题。解决方案就是加集群,那么我们来看一下Eureka怎么实现集群吧。

1.首先呢,我们把原先的cloud-demo-eureka项目负责一份命名为cloud-demo-eureka-hign(高可用的服务,哈哈)

注意没有看过前几篇文章的童鞋可以在文章底部找到GitHub地址先看一下代码。

为了省事起见,我们先把security的依赖去掉。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <parent>
    <artifactId>spring-cloud-demo</artifactId>
    <groupId>cn.org.zhixiang</groupId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  <modelVersion>4.0.0</modelVersion>   <artifactId>cloud-demo-eureka-high</artifactId>   <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
  </properties>
  <dependencies>
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <!--注意此处的依赖是SpringBoot2.0以后专用的,如果您使用的SpringBoot版本低于2.0请使用spring-cloud-starter-eureka-server-->
      <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>   </dependencies>
</project>

2.启动类只需要改一下名字其他的不变

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

3.我们现在要玩点不一样的了,此次项目我们使用了4个配置文件。它们分别是application.yml、application-dev1.yml、application-dev2.yml、application-dev3.yml。这里解释一下为什么会使用4个配置文件,如果我们在生产环境上这里其实应该是有三个程序的,但是我们为了测试方便,就使用这一个程序当成三个使用。

先看我们的application.yml文件变成什么样子了。

spring:
profiles:
active: dev1
application:
name: eureka-server-high
dev:
host: localhost
dev1Port: 8761
dev2Port: 8762
dev3Port: 8763

我们可以看到位于最上方的就是一个spring.profiles.active属性,这个属性呢,通常适用于我们不同环境下配置的切换。举个例子,我们可能有开发、测试、生产等等不同的环境,这几个环境使用的肯定不是一个数据库,如果我们每次在各个环境都要修改一下配置文件那样岂不是累死了。而spring.profiles.active属性呢,就是指定的我们的项目启动加载的配置文件,例如我们配的值为dev1,那么一会当我们启动项目的时候就会去加载application-dev1.yml文件.

紧接着就是spring.application.name了,相信大家都知道了,我们此次的应用名称就是eureka-server-high了。

下面呢其实是我自定义的一个配置,因为此次我们要使用三个Eureka服务来组成一个集群,所以我先在这里指定一下这三个服务的端口号,至于为什么在这指定相信看了下面三个配置文件你就明白了。

4.先来看一下application-dev1.yml

server:
port: ${dev.dev1Port}
eureka:
client:
service-url:
defaultZone: http://${dev.host}:${dev.dev2Port}/eureka,http://${dev.host}:${dev.dev3Port}/eureka

可以看到首先定义了端口号是上方我们在application.yml文件中定义的一个端口号8761,然后它注册的地址变成两个了,就是端口端口号为8762和8763的程序。

接着看application-dev2.yml

server:
port: ${dev.dev2Port}
eureka:
client:
service-url:
defaultZone: http://${dev.host}:${dev.dev1Port}/eureka,http://${dev.host}:${dev.dev3Port}/eureka

它注册了8761和8763的程序

那么现在我想你应该已经猜出来了application-dev3.yml是怎么写的了吧

server:
port: ${dev.dev3Port}
eureka:
client:
service-url:
defaultZone: http://${dev.host}:${dev.dev1Port}/eureka,http://${dev.host}:${dev.dev2Port}/eureka

5.配置文件搞定以后我们可以启动了。

首先我们到CloudDemoEureHighApplication类中右键run启动程序,这里你会发现两个疑点:

项目启动报错哎。哈哈,其实不用怕,报错其实是正常的,不报错才奇怪呢。你想到报错的原因了么?我们启动使用的配置文件是dev1,他启动会向端口号为8762和端口号为8763的项目注册,这两个项目都没有,所以肯定会报错。不过没关系,Eureka其实是启动成功了的,现在你打开浏览器访问以下localhost:8671其实是可以看到Eureka已经注册成功了。

还有一个疑点就是:哎,小编你上边不是说我们用一个程序模拟三个么,可是我这个启动了以后,再启动不是重启了么。我咋启动三个呀。

其实这个呢因为小编有妙招,现在我们8761已经启动了对吧,接下来跟我一步一步走

先点击这个 Edit Configuration,然后看下图

按照图片的标号,先点击加号图标,然后起个与CloudDemoEurekaHighApplication不一样的名字,这里我是加了一个-3,然后在第三个位置就是我们启动类的路径,最后一个位置就是选中要启动的模块。现在一个新的启动方式就做好了,接着我们把application.yml文件中的spring.

profiles.active改成dev3。

接着按上图顺序选中刚刚定义的启动方式,点击debugger启动。现在是不是发现dev3的程序也启动了。虽然还是保错,我想你应该知道原因了。

接着如法炮制,我们启动dev2,记住不要忘了修改application.yml。

现在三个服务都起来了,我们的集群是不是成功了呢

浏览器访问localhost:8761或者8762或者8763你是不是都看到了下图这样三个节点呢

如果你看到的是这样的一个效果,那么就恭喜你Eureka集群已经搭建成功了。

6.使用:

既然集群搭建成功了,那么就可以使用了,还记得我们如何把客户端注册的服务器上么,不记得话请抓紧时间复习一下:每天学点SpringCloud(二):服务注册与发现Eureka

当时我们注册的时候,因为没有集群所以应该是这样写的

eureka:
client:
register-with-eureka: true
service-url:
defaultZone: http://localhost:8761/eureka

你要是问我现在还这样写能行么,我告诉你可以,这样没问题,但是我不推荐。为什么呢,虽然我们现在使用的是集群,当我们的服务提供者注册上以后应该是三个节点都会有这个服务提供者,就算8761这个节点挂了也无所谓。但是,如果我们服务提供者在注册的时候8761就已经挂了,那么它是注册不上的,人家8762和8763现在是不认识它的。所以我推荐给你的写法就是:

defaultZone: http://localhost:8761/eureka,http://localhost:8762/eureka,http://localhost:8763/eureka

GitHub:https://github.com/shiyujun/spring-cloud-demo

如果对您有所帮助,请记得帮忙点一个star哦

本文出自https://zhixiang.org.cn,转载请保留。

每天学点SpringCloud(五):如何使用高可用的Eureka的更多相关文章

  1. 搭建高可用的Eureka注册中心

    搭建高可用的Eureka注册中心 一.搭建高可用的Eureka的作用 当服务器因种种原因导致Eureka注册中心(后面简称Eureka)服务当机(服务器跪了,异常关闭停止服务).这样就会影响到整个业务 ...

  2. SpringCloud第二弹(高可用Eureka+Ribbon负载均衡)

    先建立父工程 .. ..一路next 搭建注册中心(需要建立三个工程,端口不一样) .. .. .. 修改入口类 package com.cloud.eurekaserver1111; import ...

  3. MySQL入门篇(五)之高可用架构MHA

    一.MHA原理 1.简介: MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Faceb ...

  4. 浅谈SQL Server中的事务日志(五)----日志在高可用和灾难恢复中的作用

    简介 日志的作用是保证持久性和数据一致性,通过日志可以实现数据的Undo与Redo,因此通过日志,SQL Server不仅仅可以实现灾难恢复,还可以通过日志的Redo来实现高可用性.本篇文章主要讲述日 ...

  5. Hive扩展功能(五)--HiveServer2服务高可用

    软件环境: linux系统: CentOS6.7 Hadoop版本: 2.6.5 zookeeper版本: 3.4.8 主机配置: 一共m1, m2, m3这五部机, 每部主机的用户名都为centos ...

  6. Spring Cloud|高可用的Eureka集群服务

    Eureka,作为spring cloud的服务发现与注册中心,在整个的微服务体系中,处于核心位置.单一的eureka服务,显然不能满足高可用的实际生产环境,这就要求我们配置一个能够应对各种突发情况, ...

  7. 在Docker环境下部署高可用的Eureka注册中心

    Eureka Server的同步遵循着一个非常简单的原则,只要有一条边将节点连接,就可以进行信息传播和同步 由于Eureka Server进行相互注册的方式来实现高可用的部署,所以我们只需要将Eure ...

  8. dubbo入门学习(五)-----dubbo的高可用

    zookeeper宕机与dubbo直连 现象 zookeeper注册中心宕机,还可以消费dubbo暴露的服务. 原因 健壮性 l 监控中心宕掉不影响使用,只是丢失部分采样数据 l 数据库宕掉后,注册中 ...

  9. springcloud(五,多个服务注册中心eureka)

    spring cloud (一.服务注册demo_eureka) spring cloud (二.服务注册安全demo_eureka) spring cloud (三.服务提供者demo_provid ...

随机推荐

  1. axios POST提交数据的三种请求方式写法

    1.Content-Type: application/json import axios from 'axios' let data = {"code":"1234&q ...

  2. github 生成配置ssh 秘钥方法详解

    如果安装github成功后,当从本地提交文件到github的时候,提交不成功,报错,可能问题就是你还没有生成ssh秘钥 1.当你提交文件到github,不成功,出现如下的情况,就代表着github上面 ...

  3. laraval migration 新增字段或者修改字段的方法

    1.进入项目根目录执行artisan命令生成migration文件,可以指定--table和--path参数,会在对应目录下生成migration文件. php artisan make:migrat ...

  4. python第十九天 关于方法,函数

    1.先从简单的函数说起 from inspect import isfunction 导入判断是否是function def foo():pass 定义了一个函数 print(foo) <fun ...

  5. oracle service name sid , 用户 和 表空间

    oracle 的四个概念: 数据库: 就是一堆静态的数据文件.注意是静态的 instance 实例: 可以类比数据库连接. 实例就是为了操作数据库而开辟的进程和内存空间,有了这个实例你才能操作数据库. ...

  6. 【转】Android总结篇系列:Activity Intent Flags及Task相关属性

    [转]Android总结篇系列:Activity Intent Flags及Task相关属性 同上文一样,本文主要引用自网上现有博文,并加上一些自己的理解,在此感谢原作者. 原文地址: http:// ...

  7. RNQOJ PID28 / [Stupid]愚蠢的宠物

    勉勉强强够着点并查集的边,题目吧他分类到并查集也无可厚非,这里与常规的并查集的区别在于要做一个mark数组进行一下标记,展开来说就是对于要查询的A,B,先对A进行处理,把A所有的前驱也就是双亲节点进行 ...

  8. 【Selenium】【BugList6】调用IE,未启用保护模式,报:selenium.common.exceptions.WebDriverException: Message: Unexpected error launching Internet Explorer. Protected Mode settings are not the same for all zones.

    >>> driver = webdriver.Ie() 解决方法: 1.打开Ie浏览器 , 工具 ->Internet选项 ->安全 2.去掉4个区域的安全保护模式

  9. java反射获取Object的属性和值

    在看反射顺便做个笔记,目前知道的反射的Object都是要有对象的也就是实体Bean. import java.lang.reflect.Field; import java.util.ArrayLis ...

  10. 计算机网络六:无线局域网、IEEE 802.11、WIFI和蓝牙

    无线局域网.IEEE 802.11.WIFI和蓝牙 ㈠无线局域网 1.定义       无线局域网络(Wireless Local Area Networks),简称WLAN.它是相当便利的数据传输系 ...