SpringCloud從入門到進階(六)——使用SpringBoot搭建微服務

內容html

  SpringBoot整合SpringCloud的Eureka、Zuul等組件,快速實現簡單易懂且具備服務熔斷、負載均衡的分佈式架構1.0,體驗微服務的魅力。java

版本git

  IDE:IDEA 2017.2.2 x64github

  JDK:1.8.0_171web

  manve:3.3.3redis

  SpringBoot:1.5.9.RELEASE算法

  SpringCloud:Dalston.SR1spring

適合人羣apache

  ​Java開發人員springboot

說明

  轉載請說明出處:SpringCloud從入門到進階(六)——使用SpringBoot搭建微服務

  GitHub倉庫地址: https://github.com/leo-zz/SpringCloudDemo/tree/master/MicroServiceDemo

參考

       Linux入門實踐筆記(二)--Jar包運行與關閉

       SpringCloud從入門到進階(二)——註冊中心Eureka的僞分佈式部署

項目目錄

pom.xml

  在原有SpringBoot項目的基礎上引入SpringCloud的默認依賴,以及eureka client的依賴

<?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.leo</groupId>
    <artifactId>service</artifactId>
    <version>1.0-SNAPSHOT</version>

    <!-- 經過繼承的方式引入spring boot  -->
    <!--parent標籤用於指定父pom-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.9.RELEASE</version>
    </parent>

    <!--properties標籤用於聲明一些常量,例如源碼編碼爲UTF-8,輸出代碼也爲UTF-8,Java版本爲1.8-->
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <spring-cloud.version>Dalston.SR1</spring-cloud.version>
    </properties>

    <!--添加1:在dependencyManagement標籤中聲明默認依賴的SpringCloud的版本,
    全部的SpringCloud組件的依賴都將使用該版本SpringCloud中規定的版本號 -->
    <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>

    <dependencies>
        <!--添加2:SpringCloud-Eureka相關依賴 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>
        <!-- SpringBoot相關等其餘依賴省略 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

    <!-- Spring Boot的Maven插件,使用Maven插件的方式來啓動Spring Boot工程
若是不添加該插件在使用mvn命令打包的jar有問題,執行時會報錯:xxx.jar中沒有主清單屬性-->
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>
yaml

  在原有項目的基礎上增長eurekaSever的鏈接信息、微服務的應用名稱、多profiles的配置。爲了演示負載均衡的效果,本示例添加三個profiles。

spring:
  #添加3:設置springboot項目的應用名稱,並默認啓動peer1
  application:
    name: application-serviceA    #注意:此處的名稱必定要個路由接入服務器中的配置名一致 
  profiles: 
      active: peer1
  http:
    multipart:
      #上傳文件總的最大值爲30MB
      max-request-size: 30MB
      #單個文件的最大值爲10MB
      max-file-size: 10MB
    #省略原有Springboot項目的數據源、redis、mybatis、分頁等配置
    
#添加4:eurekaSever的鏈接信息
eureka:
  instance: 
    #要求Client經過ip的方式進行註冊
    prefer-ip-address: true
  client:
    service-url:
      defaultZone: http://172.26.125.114:7001/eureka,http://172.26.125.115:7001/eureka,http://172.26.125.118:7001/eureka
  
#日誌輸出,指明日誌存放位置;同時須要在資源路徑下引入配置文件
logging:
  file: logs/application-idleGoodService-${server.port}.logs

#添加5:增長peer1和peer二、peer3多個profiles的配置
---
spring:
  profiles: peer1
server:
  port: 8881

#Eureka實例名的配置
eureka:
  instance:
    instance-id: application-serviceA-A2-8881

#actuator的配置
management:
  port: 8811
  security:
    enabled: false

---
spring:
  profiles: peer2
server:
  port: 8882

#Eureka實例名的配置
eureka:
  instance:
    instance-id: application-serviceA-A2-8882

#actuator的配置
management:
  port: 8812
  security:
    enabled: false
---
spring:
  profiles: peer3
server:
  port: 8883

#Eureka實例名的配置
eureka:
  instance:
    instance-id: application-serviceA-A2-8883

#actuator的配置
management:
  port: 8813
  security:
    enabled: false
SpringApplication

  在主程序類中增長@EurekaClient,開啓eureka服務。

//開啓EurekaClient
@EnableEurekaClient
@SpringBootApplication
//包掃描、Swagger、事務的配置省略
public class IdlegoodApplication {
​
    //一些bean的注入和建立省略public static void main(String[] args) {
        SpringApplication.run(IdlegoodApplication.class, args);
    }
}
Controller

  SpringBoot項目改形成微服務時,業務邏輯只要保證無狀態便可,不要進行額外配置。本示例爲了演示功能,在Controller中寫兩個服務,一個是普通POST接口處理,一個是文件上傳的接口。

@RequestMapping("/test")
@RestController
public class DemoController {
    //從配置文件中讀取實例名稱
    @Value("${eureka.instance.instance-id}")
    String instanceID;

    @PostMapping("/hello/{name}")
    public String sayHello(@PathVariable(value = "name") String name,
                           @RequestParam(value = "from") String user){
        return "Hello "+name+",this is DemoTest.From "+user+"@:"+instanceID+".";
    }
    @PostMapping("/upload")
    public String uploadFile(@RequestParam("file") MultipartFile file){
        String str="file名稱:"+file.getOriginalFilename()+",file大小:"+file.getSize()+"From "+instanceID+".";
        System.out.println(str);
        return str;
    }
}

本地測試

  在本地以默認的profiles啓動項目,而後使用postman請求這兩個接口,確保項目代碼編寫正常。

  ​測試接口1:http://localhost:8881/test/hello/leo,正常。

  測試接口2:http://localhost:8881/test/upload,向服務器上傳大於1MB的文件,正常。

直接調用微服務測試

  按照以前的操做進行項目打包、上傳,具體過程可參考:SpringCloud從入門到進階(二)——註冊中心Eureka的僞分佈式部署

​   先啓動Eureka集羣和路由Zuul,而後在同一個局域網內的主機上,分別執行下列命令啓動微服務的三個實例。啓動後能夠經過jps命令能夠看到相應的進程:

[user@Serverjars]$java -Dspring.profiles.active=peer1 -jar service-1.0-SNAPSHOT.jar & #服務器A
[user@Serverjars]$java -Dspring.profiles.active=peer2 -jar service-1.0-SNAPSHOT.jar & #服務器B
[user@Serverjars]$java -Dspring.profiles.active=peer3 -jar service-1.0-SNAPSHOT.jar & #服務器B
#經過jps命令能夠看到相應的進程,-v選型表示打印jvm參數。
[user@Serverjars]$ jps -v
29410 jar -Dspring.profiles.active=peer1
29366 jar -Dspring.profiles.active=peer2
29321 jar -Dspring.profiles.active=peer3

  訪問EurekaSever,確認服務正常啓動。

  與本地測試同樣,直接調用微服務的接口地址,進行測試。假如主機的IP爲172.26.125.10,那麼分別請求http://172.26.125.10:8881/test/hello/leohttp://172.26.125.10:8882/test/hello/leohttp://172.26.125.10:8883/test/hello/leo等地址,以確保微服務部署正確。

經過路由調用微服務測試

  確保微服務部署正確無誤後再使用Postman請求路由接入服務器的接口。假如路由Zuul所在主機的IP爲172.26.125.20,那麼請求接口1http://172.26.125.20:7081/v1/routea/test/hello/leo和接口2http://172.26.125.20:7081/v1/routea/test/upload。Zuul在接收到該url的請求時,會根據路由規則的設定,將"/v1/routea/**"的請求轉發給application-serviceA處理。

測試接口1

  ​測試屢次,能夠看到Zuul會將請求在多個微服務實例中作負載均衡,默認狀況按照輪詢算法分配請求。

  請求轉發到實例1處理:

  請求轉發到實例2處理:

  請求轉發到實例3處理:

測試接口2

​  向服務器上傳小於1MB的文件,測試屢次,也能夠看到負載均衡的效果。

  請求轉發到實例1處理:

  請求轉發到實例2處理:

  請求轉發到實例3處理:

   可是,當上傳超過1MB大小的文件時,服務報錯。

  出現這個問題,想必你們都有疑問。一樣的請求,爲何直接調用服務時正常,可是經過Zuul路由調用服務就會出錯呢。若是你在上傳文件的測試中,還遇到服務調用失敗、中文亂碼等詭異報錯,那麼說明你測得很全面。對於這些問題的解釋和解決,請看下篇文章[SpringCloud從入門到進階(七)——踩坑實戰之Zuul服務調用失敗與文件上傳問題](https://www.cnblogs.com/lonelyJay/p/9994246.html)

補充:使用Zipkin監控路由Zuul的請求處理。

  爲了監控請求處理的耗時狀況,會在路由端和微服務端增長鏈路追蹤組件Zipkin,具體配置請參考後續章節。

相關文章
相關標籤/搜索