1. 程式人生 > >SpringCloud新手初搭建(一)

SpringCloud新手初搭建(一)

版權宣告:本文為博主原創文章,轉載請帶上原文連結。 https://blog.csdn.net/weixin_41965979/article/details/86063446

本文詳細介紹建立父工程,建立Eureka服務註冊中心,建立提供者,消費者和使用Ribbon實現RPC遠端呼叫(後面會講使用Fegin客戶端實現遠端呼叫)。

開發環境:

  • idea版本 : 2018.1.4
  • jdk : 1.8
  • maven:3.5.3(沒配好的自己百度配置好) 
  • SpringBoot:2.0.1RELEASE
  • SpringCloud:Finchley.M7

一:建立SpringCloud父專案

          springcloud的父工程的作用是用於jar包的管理。

          1:開啟idea選擇建立一個新專案

2:建立maven專案不選擇模板直接next

3:指定groupId和artifactid (可自己隨意取名),點next

4:指定project的名稱位置 ,點Finish

5:父工程可以把src目錄刪除

6:在pom.xml檔案裡引入相關的配置依賴

<?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">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>cloud_test</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>pom</packaging>

    <name>cloud_test</name>
    <description>cloud練習專案</description>

    <modules>
        <module>eureka_server</module>
        <module>eureka_member</module>
        <module>eureka_order</module>
    </modules>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.1.RELEASE</version>
        <relativePath/>
    </parent>

    <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.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>
</project>

此時一個父專案新建完成,下面我們開始搭建Eureka服務註冊中心。

二:搭建Eureka服務註冊中心

1:在我們的父專案上右鍵new-module

 2:選擇Spring Initializr,點選next

3: 填寫Artifact,點next

4:選擇 Cloud Discovery—Eureka Server,SpringBoot版本我這裡沒改直接在父專案的pom檔案裡改成了2.0.1RELEASE版本,直接next,Finish建立完成

5:首先給大家看一張詳細的結構圖,下面我發了每個檔案的程式碼

6:開啟建立的eureka_server專案更改pom.xml檔案 ,引入相關配置依賴。注意這裡的parent裡要引入你的父專案,所有的子專案都要把父專案載入進來,這樣就不用再引入父專案裡引入過的依賴

<?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">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>eureka_server</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>eureka_server</name>
    <parent>
        <groupId>com.example</groupId>
        <artifactId>cloud_test</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Finchley.M7</spring-cloud.version>
    </properties>
    <!--SpringCloud eureka-server -->
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </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>

    <!--<build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>-->
    <!-- 注意: 這裡必須要新增, 否者各種依賴有問題 -->
    <repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>

</project>

7:開啟src下面的resources目錄,把application.properties改成application.yml(兩種配置方式都可以,只不過配置格式不一樣,這裡我個人喜歡yml配置,也是最方便用的多的配置方式),如果最後大家啟動失敗把所有註釋刪掉試試,我這裡加上了註釋就啟動失敗,原因還沒找到。

server:
  port: 8100    ###服務埠號
###eureka 基本資訊配置
eureka:
  instance:
  ###註冊到eurekaip地址
    hostname: localhost
  client:
###因為自己是為註冊中心,不需要自己註冊自己
    register-with-eureka: false
###因為自己是為註冊中心,不需要檢索服務
    fetch-registry: false
    serviceUrl:
      defaultZone:  http://${eureka.instance.hostname}:${server.port}/eureka/

 8:在src目錄下的java目錄裡建立一個EurekaServerApplication類(類名自取),程式碼如下,然後run執行這個類

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication
@EnableEurekaServer   //作用:開啟eurekaServer
public class EurekaServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }

}

9:開啟瀏覽器,輸入:http://localhost:8100 (localhost和8100都是你yml裡面所配置的,必須一致),介面如下說明Eureka服務註冊中心搭建成功了

三:搭建服務提供者(這裡以一個會員服務member為例子)

1:在我們的父專案上右鍵new-module,選擇maven,填寫ArtifactId,然後next,finish,這些步驟和新建父專案一樣

2:引入pom.xml依賴

<?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>cloud_test</artifactId>
        <groupId>com.example</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>eureka_member</artifactId>

    <!-- 管理依賴 -->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Finchley.M7</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <!-- SpringBoot整合Web元件 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- SpringBoot整合eureka客戶端 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
    </dependencies>
    <!-- 注意: 這裡必須要新增, 否者各種依賴有問題 -->
    <repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/libs-milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>
</project>

3:application.yml 

server:
  port: 8000
spring:
   application:
      name: eureka-member
eureka:
  client:
    register-with-eureka: true
    fetch-registry: true
    serviceUrl:
      defaultZone:  http://localhost:8100/eureka

4:MemberController 

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MemberController {
    @RequestMapping("/getMember")
    public String getMember(){
        return "this is getMember 我是會員服務 服務提供者!";
    }
}

5:AppMember(啟動項)

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@SpringBootApplication
@EnableEurekaClient     //將當前服務註冊到eureka上
public class AppMember{
    public static void main(String[] args) {
        SpringApplication.run(AppMember.class,args);
    }

}

6:搭建完畢,啟動服務提供者eureka_member,重新整理註冊中心就會有這個服務了(顯示的名稱是你在yml裡配置的name,注意不能用下劃線,可以中劃線,用下劃線後面消費者呼叫的時候會出問題),同樣瀏覽器上請求你自己配置的埠方法能看到同樣的返回說明提供者搭建成功。

 四:搭建服務消費者(這裡以一個訂單服務order為例子)

1:跟搭建提供者一樣的步驟搭建一個maven工程,下面我直接提供專案截圖和程式碼

2:pom.xml依賴

<?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>cloud_test</artifactId>
        <groupId>com.example</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>eureka_order</artifactId>

    <!-- 管理依賴 -->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Finchley.M7</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <!-- SpringBoot整合Web元件 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- SpringBoot整合eureka客戶端 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

    </dependencies>
    <!-- 注意: 這裡必須要新增, 否者各種依賴有問題 -->
    <repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/libs-milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>
</project>

3:application.yml

server:
  port: 8001
spring:
   application:
      name: eureka-order
eureka:
  client:
    register-with-eureka: true
    fetch-registry: true
    serviceUrl:
      defaultZone:  http://localhost:8100/eureka

4:OrderController(這裡兩種呼叫方式我都以註解形式寫在上面了,如果要用別名方式呼叫,要加@LoadBalanced負載均衡註解,否則呼叫報錯)

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
public class OrderController {

    //RestTemplate 是由SpringBoot web元件提供 預設整合ribbon負載均衡
    //rest方式底層是才用HttpClient技術
    @Autowired
    private RestTemplate restTemplate;

    /**
     * 在SpringCloud中有兩種方式呼叫:rest,fegin(SpringCloud)
     */

    @RequestMapping("/getOrder")
    public String getOrder(){
        //有兩種方式 一種是直接呼叫 另一種是採用服務別名去註冊中心上獲取對應的服務呼叫地址
        String result = restTemplate.getForObject("http://127.0.0.1:8000/getMember",String.class);
        System.out.println("訂單服務呼叫會員服務result: "+result);
        return result;

        //服務別名方式呼叫程式碼,要在AppOrder引入RestTemplate 時加上一個註解@LoadBalanced
        //String memberUrl = "http://eureka-member/getMember";
        //String result = restTemplate.getForObject(memberUrl,String.class);
        //System.out.println("訂單服務呼叫會員服務result: "+result);
    }
}

5:AppOrder(如果報錯RestTemplate找不到,通過@Bean把RestTemplate註冊到SpringBoot容器中)

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
@EnableEurekaClient     //將當前服務註冊到eureka上
public class AppOrder {

    public static void main(String[] args) {
        SpringApplication.run(AppOrder.class,args);
    }

    // 解決RestTemplate 找不到原因 應該把RestTemplate註冊到SpringBoot容器中 @bean
    @Bean
    @LoadBalanced //如果使用別名方式呼叫才加這個註解
    RestTemplate restTemplate(){
        return new RestTemplate();
    }

}

6:消費者搭建成功,啟動AppOrder,此時再重新整理Eureka註冊中心,已經有member、order兩個服務了

7:開啟瀏覽器請求消費者order路徑 ,此時頁面顯示的是提供者member的返回內容,說明Rpc遠端呼叫成功了

總結 

以上程式碼全部親測過,有什麼問題留言交流,我也是一個剛入cloud坑的小白,歡迎大佬指出不足之處。

下一篇文章寫一個服務裡兩個服務地址ip之間的輪詢呼叫,剛剛踩坑完還在整理!