SpringCloud的入門學習之Netflix-eureka(Eureka的集群版搭建)


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/

如果您想及時得到個人撰寫文章以及著作的消息推送,可以掃描上方二維碼,關注個人公眾號哦。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM