前几篇文章我们讲了一下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.配置文件搞定以后我们可以启动了。
把application.yml文件中的spring.profiles.active分别改成dev1、dev2、dev3启动三次
浏览器访问localhost:8761或者8762或者8763你是不是都看到了下图这样三个节点呢
如果你看到的是这样的一个效果,那么就恭喜你Eureka集群已经搭建成功了。
6.使用:
既然集群搭建成功了,那么就可以使用了,还记得我们如何把客户端注册的服务器上么,不记得话请抓紧时间复习一下:服务注册与发现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点击下方“阅读原文”查看源码!!!