SpringCloud的入门学习之Netflix-eureka(Eureka的集群版搭建)

  • 2019 年 11 月 12 日
  • 笔记

1、Eureka单机版的话,可能会出现单点故障,所以要保障Eureka的高可用,那么可以进行搭建Eureka的集群版。

  高可用的Eureka的注册中心,将注册中心服务部署到多台物理节点上,形成一个集群,集群之间的多个节点需要相互通信的。那么如何搭建集群版的Eureka呢,每个实例都需要加载自己的配置文件,根据配置文件配置的信息与其他节点进行通信,使用springboot的多配置文件可以实现每个实例加载自己的配置文件。每个实例加载自己的配置文件的时候可以拿到其他节点的信息,这个时候每个节点就串联起来了。

2、使用springboot的多环境配置,来搭建Eureka的高可用集群式部署。由于使用的是maven构建的springboot项目,所以首先引入pom.xml配置文件,这里需要注意的是springboot的版本、springcloud的版本对应,不然会出现一个版本不对应错误,稍后可以贴一下错误。我使用的springboot版本是2.2.0的,springcloud版本是Hoxton.RC1。

 1 <?xml version="1.0" encoding="UTF-8"?>   2 <project xmlns="http://maven.apache.org/POM/4.0.0"   3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   4     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0   5     https://maven.apache.org/xsd/maven-4.0.0.xsd">   6     <modelVersion>4.0.0</modelVersion>   7     <parent>   8         <groupId>org.springframework.boot</groupId>   9         <artifactId>spring-boot-starter-parent</artifactId>  10         <version>2.2.0.RELEASE</version>  11         <relativePath />  12         <!-- lookup parent from repository -->  13     </parent>  14     <groupId>com.bie</groupId>  15     <artifactId>springcloud-eureka-server-ha</artifactId>  16     <version>0.0.1-SNAPSHOT</version>  17     <name>springcloud-eureka-server-ha</name>  18     <description>Demo project for Spring Boot</description>  19  20     <properties>  21         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>  22         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>  23         <java.version>1.8</java.version>  24         <spring-cloud.version>Hoxton.RC1</spring-cloud.version>  25         <maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>  26     </properties>  27  28     <dependencies>  29         <dependency>  30             <groupId>org.springframework.boot</groupId>  31             <artifactId>spring-boot-starter-web</artifactId>  32         </dependency>  33         <dependency>  34             <groupId>org.springframework.cloud</groupId>  35             <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>  36         </dependency>  37  38         <dependency>  39             <groupId>org.springframework.boot</groupId>  40             <artifactId>spring-boot-starter-test</artifactId>  41             <scope>test</scope>  42             <exclusions>  43                 <exclusion>  44                     <groupId>org.junit.vintage</groupId>  45                     <artifactId>junit-vintage-engine</artifactId>  46                 </exclusion>  47             </exclusions>  48         </dependency>  49     </dependencies>  50  51     <dependencyManagement>  52         <dependencies>  53             <dependency>  54                 <groupId>org.springframework.cloud</groupId>  55                 <artifactId>spring-cloud-dependencies</artifactId>  56                 <version>${spring-cloud.version}</version>  57                 <type>pom</type>  58                 <scope>import</scope>  59             </dependency>  60         </dependencies>  61     </dependencyManagement>  62  63     <build>  64         <plugins>  65             <plugin>  66                 <groupId>org.springframework.boot</groupId>  67                 <artifactId>spring-boot-maven-plugin</artifactId>  68             </plugin>  69         </plugins>  70     </build>  71  72     <repositories>  73         <repository>  74             <id>spring-milestones</id>  75             <name>Spring Milestones</name>  76             <url>https://repo.spring.io/milestone</url>  77         </repository>  78     </repositories>  79  80 </project>

在搭建Eureka集群时,需要添加多个配置文件,并且使用 SpringBoot 的多环境配置方式。集群中需要多少节点就添加多少个配置文件。修改配置文件application-eureka1.properties。内容如下所示:

 1 # 配置项目名称   2 spring.application.name=springcloud-eureka-server-ha   3   4 # 配置端口号8761   5 spring.port=8761   6   7 # 是否将自己注册到 Eureka-Server 中,默认的为 true。eureka集群版可以加也可以不加此配置的。   8 # 集群版的时候,可以注册到其他节点,但是单机版不能注册到自己的。   9 eureka.client.registerWithEureka=false  10  11 # 是否从 Eureka-Server 中获取服务注册信息,默认为 true。eureka集群版可以加也可以不加此配置的。  12 eureka.client.fetchRegistry=false  13  14 # 设置 eureka 实例名称,与配置文件的变量为主。  15 # 在搭建 Eureka 集群时,需要添加多个配置文件,并且使用 SpringBoot 的多环境配置方式。  16 # 集群中需要多少节点就添加多少个配置文件。  17 eureka.instance.hostname=eureka1  18  19 #设置服务注册中心地址,指向另一个注册中心。  20 eureka.client.serviceUrl.defaultZone=http://eureka2:8761/eureka/

配置application-eureka2.properties配置文件,内容如下所示:

 1 # 配置项目名称   2 spring.application.name=springcloud-eureka-server-ha   3   4 # 配置端口号8761   5 spring.port=8761   6   7 # 是否将自己注册到 Eureka-Server 中,默认的为 true。eureka集群版可以加也可以不加此配置的。   8 eureka.client.registerWithEureka=false   9  10 # 是否从 Eureka-Server 中获取服务注册信息,默认为 true。eureka集群版可以加也可以不加此配置的。  11 eureka.client.fetchRegistry=false  12  13 #设置 eureka 实例名称,与配置文件的变量为主 。  14 eureka.instance.hostname=eureka2  15  16 #设置服务注册中心地址,指向另一个注册中心。  17 eureka.client.serviceUrl.defaultZone=http://eureka1:8761/eureka/

配置日志管理,logback 日志配置文件。你可以选择使用配置文件或者使用配置的方式,内容如下所示:

 1 <?xml version="1.0" encoding="UTF-8" ?>   2 <configuration>   3     <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径 -->   4     <property name="LOG_HOME" value="${catalina.base}/logs/" />   5     <!-- 控制台输出 -->   6     <appender name="Stdout"   7         class="ch.qos.logback.core.ConsoleAppender">   8         <!-- 日志输出编码 -->   9         <layout class="ch.qos.logback.classic.PatternLayout">  10             <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 -->  11             <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} -  12                 %msg%n  13             </pattern>  14         </layout>  15     </appender>  16     <!-- 按照每天生成日志文件 -->  17     <appender name="RollingFile"  18         class="ch.qos.logback.core.rolling.RollingFileAppender">  19         <rollingPolicy  20             class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">  21             <!--日志文件输出的文件名 -->  22             <FileNamePattern>${LOG_HOME}/server.%d{yyyy-MM-dd}.log  23             </FileNamePattern>  24             <MaxHistory>30</MaxHistory>  25         </rollingPolicy>  26         <layout class="ch.qos.logback.classic.PatternLayout">  27             <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 -->  28             <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} -  29                 %msg%n  30             </pattern>  31         </layout>  32         <!--日志文件最大的大小 -->  33         <triggeringPolicy  34             class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">  35             <MaxFileSize>10MB</MaxFileSize>  36         </triggeringPolicy>  37     </appender>  38  39     <!-- 日志输出级别 -->  40     <root level="DEBUG">  41         <appender-ref ref="Stdout" />  42         <appender-ref ref="RollingFile" />  43     </root>  44  45 </configuration>

3、Eureka的集群部署,需要的部署环境是安装jdk1.8,需要配置好环境变量哦,不需要安装tomcat,因为使用的springboot开发的,其内置了tomcat,将打好的jar包传到服务器使用命令就可以运行了。由于使用的maven构建的项目,所以这里将使用maven install进行项目的打包。

注意:需要关闭自己的防火墙哈,或者开发你指定的端口号,我这里为了方便直接关闭防火墙了。

如果打包部署,遇到如下所示错误,可以按照此解决方法进行问题的解决。

1 [WARNING] The requested profile "pom.xml" could not be activated because it does not exist.

鼠标右击项目,properties,找到maven——>删除pom.xml,Apply即可,如下图。

上面操作完毕,如果你再次maven install还是失败的话,就update project,再次maven install应该就可以了。打包的项目如下所示。

将打好包的项目传到服务器上面,进行部署测试。如下所示:

在/usr/local/创建一个eureka 的目录,将项目的jar包拷贝到/usr/local/eureka。

 1 [root@slaver4 package]# ls   2 elasticsearch-5.4.3.tar.gz           haproxy-1.6.5.tar.gz      node-v8.16.2-linux-x64.tar.xz               rabbitmq-server-3.6.5-1.noarch.rpm   3 erlang-18.3-1.el7.centos.x86_64.rpm  keepalived-1.2.18.tar.gz  phantomjs-2.1.1-linux-x86_64.tar.bz2        socat-1.7.3.2-1.1.el7.x86_64.rpm   4 es-sql-site-standalone.zip           master.zip                rabbitmq_delayed_message_exchange-0.0.1.ez  springcloud-eureka-server-ha-0.0.1-SNAPSHOT.jar   5 [root@slaver4 package]# cd /usr/local/   6 [root@slaver4 local]# ls   7 bin  etc  games  include  lib  lib64  libexec  nginx  package  sbin  share  soft  src   8 [root@slaver4 local]# mkdir eureka   9 [root@slaver4 local]# cd eureka/  10 [root@slaver4 eureka]# ls  11 [root@slaver4 eureka]# cp /home/hadoop/package/springcloud-eureka-server-ha-0.0.1-SNAPSHOT.jar .  12 [root@slaver4 eureka]# ls  13 springcloud-eureka-server-ha-0.0.1-SNAPSHOT.jar  14 [root@slaver4 eureka]#

你可以使用启动脚本文件进行项目的启动,vim server.sh,我使用的如下所示:

 1 #!/bin/bash   2   3 cd `dirname $0`   4   5 CUR_SHELL_DIR=`pwd`   6 CUR_SHELL_NAME=`basename ${BASH_SOURCE}`   7   8 # 修改点1,修改成自己的项目名称。   9 JAR_NAME="springcloud-eureka-server-ha-0.0.1-SNAPSHOT.jar"  10 JAR_PATH=$CUR_SHELL_DIR/$JAR_NAME  11  12 #JAVA_MEM_OPTS=" -server -Xms1024m -Xmx1024m -XX:PermSize=128m"  13 JAVA_MEM_OPTS=""  14  15 # 修改点2,修改成自己的配置文件变量名称。  16 SPRING_PROFILES_ACTIV="-Dspring.profiles.active=eureka1"  17 #SPRING_PROFILES_ACTIV=""  18 LOG_DIR=$CUR_SHELL_DIR/logs  19 LOG_PATH=$LOG_DIR/${JAR_NAME%..log  20  21 echo_help()  22 {  23     echo -e "syntax: sh $CUR_SHELL_NAME start|stop"  24 }  25  26 if [ -z $1 ];then  27     echo_help  28     exit 1  29 fi  30  31 if [ ! -d "$LOG_DIR" ];then  32     mkdir "$LOG_DIR"  33 fi  34  35 if [ ! -f "$LOG_PATH" ];then  36     touch "$LOG_DIR"  37 fi  38  39 if [ "$1" == "start" ];then  40  41     # check server  42     PIDS=`ps --no-heading -C java -f --width 1000 | grep $JAR_NAME | awk '{print $2}'`  43     if [ -n "$PIDS" ]; then  44         echo -e "ERROR: The $JAR_NAME already started and the PID is ${PIDS}."  45         exit 1  46     fi  47  48     echo "Starting the $JAR_NAME..."  49  50     # start  51     nohup java $JAVA_MEM_OPTS -jar $SPRING_PROFILES_ACTIV $JAR_PATH >> $LOG_PATH 2>&1 &  52  53     COUNT=0  54     while [ $COUNT -lt 1 ]; do  55         sleep 1  56         COUNT=`ps  --no-heading -C java -f --width 1000 | grep "$JAR_NAME" | awk '{print $2}' | wc -l`  57         if [ $COUNT -gt 0 ]; then  58             break  59         fi  60     done  61     PIDS=`ps  --no-heading -C java -f --width 1000 | grep "$JAR_NAME" | awk '{print $2}'`  62     echo "${JAR_NAME} Started and the PID is ${PIDS}."  63     echo "You can check the log file in ${LOG_PATH} for details."  64  65 elif [ "$1" == "stop" ];then  66  67     PIDS=`ps --no-heading -C java -f --width 1000 | grep $JAR_NAME | awk '{print $2}'`  68     if [ -z "$PIDS" ]; then  69         echo "ERROR:The $JAR_NAME does not started!"  70         exit 1  71     fi  72  73     echo -e "Stopping the $JAR_NAME..."  74  75     for PID in $PIDS; do  76         kill $PID > /dev/null 2>&1  77     done  78  79     COUNT=0  80     while [ $COUNT -lt 1 ]; do  81         sleep 1  82         COUNT=1  83         for PID in $PIDS ; do  84             PID_EXIST=`ps --no-heading -p $PID`  85             if [ -n "$PID_EXIST" ]; then  86                 COUNT=0  87                 break  88             fi  89         done  90     done  91  92     echo -e "${JAR_NAME} Stopped and the PID is ${PIDS}."  93 else  94     echo_help  95     exit 1  96 fi

配置好如上所示脚本内容,记得将执行权限给server.sh启动脚本。

1 [root@slaver4 eureka]# chmod -R 755 server.sh  2 [root@slaver4 eureka]# ll  3 total 46932  4 -rwxr-xr-x. 1 root root     2322 Nov 10 14:15 server.sh  5 -rw-r--r--. 1 root root 48051390 Nov 10 14:06 springcloud-eureka-server-ha-0.0.1-SNAPSHOT.jar  6 [root@slaver4 eureka]#

在第二台服务器上面,同样的操作搞一遍。这里就不进行演示了。

然后修改linux的host文件,由于项目里面是通过eureka.client.serviceUrl.defaultZone=http://eureka1:8761/eureka/来访问的,所以要对配置文件进行修改。如下所示:

注意:如果是两台或者多台机器的时候,由于eureka1需要访问eureka2,所以需要将eureka2对应的ip也要加进来的哦。同理,服务器1和服务器2都需要配置的。

1 127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4  2 ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6  3  4 5 192.168.110.133 eureka1  6 192.168.110.134 eureka2

启动2个服务器的eureka注册中心,这里就演示一个了,停止是./server.sh stop,如下所示:

1 [root@slaver4 eureka]# ./server.sh start  2 Starting the springcloud-eureka-server-ha-0.0.1-SNAPSHOT.jar...  3 springcloud-eureka-server-ha-0.0.1-SNAPSHOT.jar Started and the PID is 9501.  4 You can check the log file in /usr/local/eureka/logs/springcloud-eureka-server-ha-0.0.1-SNAPSHOT.jar for details.  5 [root@slaver4 eureka]#

通过浏览器访问注册中心的管理页面。你可以访问任意一台机器的。如下所示:

上图的红色报错,这里先不进行处理了。翻译如下所示:

如果如下两个配置不加的话,访问界面如下所示:

1 # 是否将自己注册到 Eureka-Server 中,默认的为 true。eureka集群版可以加也可以不加此配置的。  2 # 集群版的时候,可以注册到其他节点,但是单机版不能注册到自己的。  3 eureka.client.registerWithEureka=false  4  5 # 是否从 Eureka-Server 中获取服务注册信息,默认为 true。eureka集群版可以加也可以不加此配置的。  6 eureka.client.fetchRegistry=false

作者:别先生 博客园:https://www.cnblogs.com/biehongli/