1. 程式人生 > >SpringCloud環境搭建 --服務治理

SpringCloud環境搭建 --服務治理

服務註冊發現

EUREKA

Eureka是Spring Cloud Netflix微服務套件中的一部分,可以與Springboot構建的微服務很容易的整合起來。
Eureka包含了伺服器端和客戶端元件。伺服器端,也被稱作是服務註冊中心,用於提供服務的註冊與發現。Eureka支援高可用的配置,當叢集中有分片出現故障時,Eureka就會轉入自動保護模式,它允許分片故障期間繼續提供服務的發現和註冊,當故障分片恢復正常時,叢集中其他分片會把他們的狀態再次同步回來。
客戶端元件包含服務消費者與服務生產者。在應用程式執行時,Eureka客戶端向註冊中心註冊自身提供的服務並週期性的傳送心跳來更新它的服務租約。同時也可以從服務端查詢當前註冊的服務資訊並把他們快取到本地並週期性的重新整理服務狀態。

搭建步驟:

  • 1.依賴引入,見以下POM.xml(略去不重要的部分)
<dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
  • 2.啟動類添加註解: @EnableEurekaServer
@SpringBootApplication
@EnableEurekaServer
public class DorEurekaApplication {
    public static void main(String[] args) {
        SpringApplication.run(DorEurekaApplication.class, args);
    }
}
  • 3.修改配置檔案。
spring:
  application:
    # 指定應用的名稱
    name: doraemon-eureka
server:
  port: ${eureka_port:8761}   #指定埠 

這樣的話,一個最最簡單的Eureka搭建完畢。
啟動Eureka,在瀏覽器中輸入:http://127.0.0.1:8761/,就可以訪問到eureka的頁面。
eureka啟動頁面注意
Eureka還有很多自定義的配置,以後在記錄。

問題1
com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server…

叢集搭建

  • 1.新建三個配置檔案,分別命名為:application-peer1,2,3
    application-peer1.yml:
spring:
  application:
    # 指定應用的名稱
    name: doraemon-eureka
server:
  port: ${eureka_port:8761}
eureka:
  instance:
    hostname: doreamon-eureka-peer1
  client:
    service-url:
      defaultZone: http://${peer2:eureka-peer2}:8762/eureka/,http://${peer3:eureka-peer3}:8763/eureka/

application-peer2.yml:

spring:
  application:
    # 指定應用的名稱
    name: doraemon-eureka
server:
  port: ${eureka_port:8762}
eureka:
  instance:
    hostname: doreamon-eureka-peer2
  client:
    service-url:
      defaultZone: http://${peer1:eureka-peer1}:8761/eureka/,http://${peer3:eureka-peer3}:8763/eureka/

application-peer3.yml:

spring:
  application:
    # 指定應用的名稱
    name: doraemon-eureka
server:
  port: ${eureka_port:8763}
eureka:
  instance:
    hostname: doreamon-eureka-peer3
  client:
    service-url:
      defaultZone: http://${peer1:eureka-peer1}:8761/eureka/,http://${peer2:eureka-peer2}:8762/eureka/
  • 2.修改機器的hosts檔案,新增
127.0.0.1 eureka-peer1
127.0.0.1 eureka-peer1
127.0.0.1 eureka-peer1

3.然後使用mvn clean package打包,分別執行java -jar啟動三個例項。

java -jar dor-eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer1
java -jar dor-eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer2
java -jar dor-eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer3

啟動後的eureka
這樣eureka就是有是哪個例項在運行了。同樣的eureka還有很多詳細配置。。。。

但從上面的例子當中,我們可以知道:
Eureka Server的同步遵循著一個非常簡單的原則:只要有一條邊將節點連線,就可以進行資訊傳播與同步。
所以,如果存在多個節點,我們只需要將節點之間兩兩連線起來,形成通路,那麼他們之間的所有服務都可以共享.
我們的服務只需要向叢集中的任意一個註冊中心中註冊,即可被所有註冊中心所共享,任意一個註冊中心崩潰,都不會影響這個服務被呼叫。

docker部署

方式一

修改pom.xml

<build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>1.0.0</version>
                <configuration>
                    <!--指定映象的名稱-->
                    <imageName>${project.artifactId}:${project.version}</imageName>
                    <dockerDirectory>src/main/docker</dockerDirectory>
                    <forceTags>true</forceTags>
                    <!--那些需要和Dockerfile放在一起,在構建映象時使用的檔案,一般應用 jar 包需要納入-->
                    <resources>
                        <resource>
                            <targetPath>/</targetPath>
                            <!--用於指定需要複製的根目錄,${project.build.directory}表示target目錄-->
                            <directory>${project.build.directory}</directory>
                            <!--用於指定需要複製的檔案,${project.build.finalName}.jar指的是打包後的jar包檔案。-->
                            <include>${project.build.finalName}.jar</include>
                        </resource>
                    </resources>
                </configuration>
            </plugin>
        </plugins>
    </build>

然後在src/main/目錄下新建目錄docker,新建一個檔案:Dockerfile
內容如下:

FROM frolvlad/alpine-oraclejdk8:slim
VOLUME /tmp
ADD dor-eureka-0.0.1-SNAPSHOT.jar app.jar
RUN chmod 755 /app.jar
EXPOSE 8761
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

可以選擇自己喜歡的映象。
存在一個問題:就是打好的jar名稱寫死了,如果我更換了版本,還需要來修改Dockerfile。

方式二:

還有可以把打包的過程寫到pom.xml檔案中,但是我還沒有搞清楚怎麼寫,之前寫的打包失敗了。等我搞清楚,再來補充

參考文章