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]#
通過瀏覽器訪問注冊中心的管理頁面。你可以訪問任意一台機器的。如下所示:
Eureka1機器訪問如下所示:http://192.168.110.133:8761/
Eureka2機器訪問如下所示:http://192.168.110.134:8761/
上圖的紅色報錯,這里先不進行處理了。翻譯如下所示:
如果如下兩個配置不加的話,訪問界面如下所示:
1 # 是否將自己注冊到 Eureka-Server 中,默認的為 true。eureka集群版可以加也可以不加此配置的。 2 # 集群版的時候,可以注冊到其他節點,但是單機版不能注冊到自己的。 3 eureka.client.registerWithEureka=false 4 5 # 是否從 Eureka-Server 中獲取服務注冊信息,默認為 true。eureka集群版可以加也可以不加此配置的。 6 eureka.client.fetchRegistry=false
Eureka1機器訪問如下所示:http://192.168.110.133:8761/
Eureka2機器訪問如下所示:http://192.168.110.133:8762/
作者:別先生
博客園:https://www.cnblogs.com/biehongli/
如果您想及時得到個人撰寫文章以及著作的消息推送,可以掃描上方二維碼,關注個人公眾號哦。