1. 程式人生 > >【星雲測試】開發者測試(3)-採用精準測試工具對springcloud微服務應用進行穿透測試

【星雲測試】開發者測試(3)-採用精準測試工具對springcloud微服務應用進行穿透測試

1、微服務簡介

  微服務英文名稱Microservice,Microservice架構模式就是將整個Web應用組織為一系列小的Web服務。這些小的Web服務可以獨立地編譯及部署,並通過各自暴露的API介面相互通訊。它們彼此相互協作,作為一個整體為使用者提供功能,卻可以獨立地執行。

2、Spring Cloud專案簡介

  Spring Cloud是基於Spring Boot的一整套實現微服務的框架。提供了微服務開發所需的配置管理、服務發現、斷路器、只能路由、微代理、控制匯流排、全域性鎖、決策競選、分散式會話和叢集狀態管理等元件。

3、前期準備工作

3.1配置jdk

  3.2配置tomcat

3.3配置maven

注:本文中Jetbrain的IDEA工具是集成了Maven的,如下圖所示:    

如若做修改,請按本地maven實際路徑填寫。  

4、Spring Cloud的環境

Spring Cloud原始碼

IntelliJ IDEA(以下簡稱“idea”)

MySQL

JDK8

Tomcat7

Maven

4.1安裝環境

 注:IntelliJ IDEA和JDK的安裝和安裝包就用自己現有的就可以,星雲測試將提供MySQL和Nodejs的安裝包,但必須前提是使用者自己的本機上不存在安裝的MySQL和Nodejs。

4.1.1指令碼一鍵安裝mysql和nodejs

1、 開啟TT_Soft資料夾

2、以管理員身份執行TeststarsSoftInstall.exe

3、等待自動安裝完成,關閉視窗

4、使用net start mysql 命令啟動MySQL服務

5、使用node –v檢視node版本

5、配置Spring Cloud

5.1 idea建立eureka服務註冊中心

以下簡稱“8000”專案。

新建專案:

idea新建spring boot專案,選擇Spring Initializr,也可以在https://start.spring.io 上建立再匯入本地:

修改group等相關資訊:

注意右上角的spring boot的版本選擇:

直接點選完成即可:

到此,一個springboot專案就完成了。

接下來要做的是配置一個eureka服務註冊中心。

此專案的pom.xml新增以下內容:

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

啟動程式碼中新增@EnableEurekaServer註解和import...,如下所示:

package com.teststars.springclouddemo;

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

@EnableEurekaServer
@SpringBootApplication
public class SpringcloudDemoApplication {

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

修改application.properties(加eureka.client.register-with-eureka=false和eureka.client.fetch-registry=false意思是不讓服務中心註冊自己):  

server.port=8000
eureka.instance.hostname=localhost
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.service-url.defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

啟動該eureka server:

看到下面的LOG表明Eureka服務端啟動成功:

開啟谷歌瀏覽器(因IDEA中的預設設定),訪問https://localhsot:8000/ 可看到微服務的檢視面板:

至此,服務註冊中心已配置完成,接下來進行服務的註冊操作。

5.2 idea建立服務提供者

以下簡稱“8001”專案。

建立一個Eureka-Client客戶端也就是服務提供者客戶端在向註冊中心會提供一些元資料,例如主機和埠,URL,主頁等。Eureka server從每個client例項接收心跳訊息。如果心跳超時,則通常將該例項從註冊server中刪除。

按照上面的建立方式建立專案springcloud-provider-demo:

啟動程式碼中新增@EnableDiscoveryClient和import...,如下所示:

package com.teststars.springcloudproviderdemo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@EnableDiscoveryClient
@SpringBootApplication
public class SpringcloudProviderDemoApplication {

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

修改application.properties:

server.port=8001
spring.application.name=springcloud-server
eureka.client.service-url.defaultZone: http://localhost:8000/eureka/

編寫一個簡單的controller。注意編寫的controller一定要在啟動類目錄級別或下層。不然不會載入。

專案啟動類的同級目錄下新建包:controller,新增類:HelloWorld,如下所示:

  
package com.teststars.springcloudproviderdemo.controller;

import org.springframework.web.bind.annotation.*;

@RestController
public class HelloWorld {
    @GetMapping("/test/{id}")
    public String test(@PathVariable String id){
        return "hello"+id.toString();
    }
}

啟動專案SpringcloudProviderDemoApplication;

在瀏覽器中重新整理介面:https://localhsot:8000/ 檢視Eureka資訊面板服務資訊,可看到已顯示存在一個8001的服務:

點選圖中綠色字型部分,顯示如下圖:

8001介面後加引數/test/test訪問,注:test可為任意字元,顯示如下圖所示:

5.3 idea建立消費者

以下簡稱“8002”專案。

以下是在https://start.spring.io上建立再匯入idea中的方式:

pom.xml新增以下內容:  

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>

修改application.properties:  

server.port=8002
spring.application.name=springcloud-customer
eureka.client.service-url.defaultZone: http://localhost:8000/eureka/

啟動程式碼中新增@EnableDiscoveryClient,並加入RestTemplate的bean,RestTemplate是spring用來操作rest資源的類,使用了模板模式。同時注意註解@LoadBalanced,只需要這個註解就可以為RestTemplate整合ribbon,從而實現負載均衡。而eureka和ribbon配合使用時會將服務名自動對映成微服務的網路地址。使得可伸縮性增強。如下所示: 

package com.teststars.springcloudcustomerdemo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@EnableDiscoveryClient
@SpringBootApplication
public class SpringcloudCustomerDemoApplication {

   public static void main(String[] args) {
      SpringApplication.run(SpringcloudCustomerDemoApplication.class, args);
   }
   @Bean
   @LoadBalanced
   public RestTemplate restTemplate(){
      return new RestTemplate();
   }
}

  編寫controller,這裡restTemplate.getForObject中的url換成http://localhost:8001/test 也是可以的,但是這樣的話耦合度是比較高的,如果服務提供者的地址發生了變化那這個消費者就不能正常運行了。由於集成了ribbon,所以這裡可以換成服務名。   專案啟動類的同級目錄下新建包:controller,新增類:Test,如下所示:  

package com.teststars.springcloudcustomerdemo.controller;

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

@RestController
public class Test {
    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/test/{id}")
    public String test(@PathVariable String id){
        return this.restTemplate.getForObject("http://SPRINGCLOUD-SERVER/test/"+id,String.class);
    }
}

啟動專案SpringcloudCustomerDemoApplication;

在瀏覽器中的重新整理頁面:https://localhsot:8000/  檢視Eureka資訊面板服務資訊可看到多了一個服務,如下圖8002綠色字型部分所示:

點選圖中綠色字型部分:

新增引數/test/aaa,注:aaa可為任意字元:

6、測試專案

6.1下載工具及工具配置

6.1.1從官網上下載星雲測試工具:http://www.teststars.cc/

下載以後進行配置。

6.1.2星雲測試服務端的配置

TTLangage.config配置項說明:

1、 執行下的星雲測試server目錄中ThreadingTestServer.exe,在右下的圖表中點註冊資訊,檢視其時間,星雲測試有兩個月的體驗,若超過兩個月,發生KEY過期,請聯絡星雲測試的工作人員,並提交服務端中的序列碼。

2、聯絡星雲工作人員獲取當前伺服器的key.key檔案,替換到星雲的server目錄下;

3、啟動server目錄下的ThreadingTestServer.exe後會自動開啟同級目錄下的ThreadingTestServerFront.exe,看到自動彈出下面視窗後,表示連線正常。

6.1.3星雲測試客戶端的配置 注:星雲測試線上客戶端的連線需要訪問埠17262/17263.登陸之前需要保證網路連線不存在限制。

開啟客戶端之前需要修改TTClient資料夾下的Server.cfg檔案,配置localIP項為可以與服務端正常資料通訊的本機IP地址。配置localIP原因是:在客戶端需要接收來自服務端傳來的動態資料,配置本地的IP地址服務端才能把資料傳到客戶端中。

配置IP地址完成後雙擊執行TTClient\TT.exe檔案進入星雲測試客戶端。選擇檔案->登入,輸入星雲測試服務端的IP地址以及自己的使用者名稱和密碼即可登入。如下圖所示:

6.1.4星雲測試雲報表平臺服務啟動

1、執行星雲測試TTWeb目錄下的bin\redis-2.4.5-win32-win64\32bit中的redis-server.exe:

2、執行星雲測試TTWeb目錄下的startTTwebserver.bat:

訪問網頁報表網頁IP地址:3000

6.2建立工程和版本並編譯

1、登入客戶端

2、選中待插裝的空版本,版本處於解鎖狀態(解鎖狀態:右鍵-解鎖狀態)

3、修改javaForWindows目錄下的Server.cfg配置檔案,[SERVER] ip填寫實際ip地址,修改[PROPERTY]欄位,與客戶端目錄下的Server.cfg同步:

4、修改javaForWindows目錄下的ComplierPath.xml配置檔案:

同一個版本下可新增多個子模組即proname,proname不能重複,一個子模組下可以配置多個工程路徑。

proName:子模組名稱

project_path:測試程式原始碼檔案路徑

class_path:測試程式class檔案路徑

注:因為專案8002關聯著8001,所以這裡需要編譯8001和8002兩個模組。如下圖:

5、修改javaForWindows目錄下tt_windows資料夾下Server.ini配置檔案, ip設定為客戶端所在的ip地址:

6、在javaForWindows檔案根目錄,開啟命令列執行autoCompiler.jar進行編譯: jre\bin\java.exe -jar autoCompile.jar –e D:\J2EE_Enterprise_key_64bit0814\CompileToolsPkg\javaForWindows

注:-e後面的引數為ComplierPath.xml檔案的目錄。

編譯成功如下圖所示:

7、在客戶端檢視資料,選中之前新建的空版本,右鍵點選重新載入版本資料。

由於測試的時候需要執行插裝後的程式碼(編譯完成後會在java目錄同層生成src-instru目錄,src-instru目錄即為編譯插裝後的原始碼);

具體操作:先將原始碼目錄下未插裝的java目錄重新命名為pre_java,再將編譯插裝生成的src-instru目錄命名為java。

為使函式覆蓋率可視檢視程式碼部分顯示正常,需要手動修改原始碼路徑:右鍵版本,點選修改原始碼路徑,選擇到pre_java目錄即可。

6.3測試前準備

6.3.1新增資料傳輸配置檔案

資料傳輸配置檔案是保證執行的資料可以回傳到星雲伺服器的。配置方法是在具體的客戶測試環境下的usr/local/bin資料夾下新建配置檔案config.cfg 檔案內容如下:

state=1 IP=(IP值寫星雲測試服務端IP,注意要大寫) (如果釋出環境是windows環境,需要在C盤根目錄下配置上述檔案)

6.3.2 agent啟動專案

使用星雲測試提供的agent包啟動專案有以下兩種方式:

6.3.2.1 idea開發工具的專案啟動項中新增agent引數

注:8001專案和8002專案中均需要作如下配置:

VM options一項新增如下配置,jar檔案按星雲測試提供的agent解壓縮檔案的絕對路徑填寫:

修改點選Apply、OK;

插樁程式碼的執行需要新增星雲測試提供的jar包,需要修改pom.xml檔案來引入jar,加入到兩個<dependencies>之間,加入的程式碼如下:

systemPath按JavaParser-j2ee.jar和jeromq-0.3.0-SNAPSHOT.jar的絕對路徑填寫:

 <dependency>
   <groupId>com.zoa</groupId>
   <artifactId>JavaParser-ZMQ</artifactId>
   <version>1.0</version>
   <scope>system</scope>
   <systemPath>D:\J2EE_Enterprise_key_64bit0814\client\MQ\JavaParser-j2ee.jar</systemPath>
</dependency>
<dependency>
   <groupId>com.zoa</groupId>
   <artifactId>jeromq</artifactId>
   <version>1.0</version>
   <scope>system</scope>
   <systemPath>D:\J2EE_Enterprise_key_64bit0814\client\MQ\jeromq-0.3.0-SNAPSHOT.jar</systemPath></dependency>

8001和8002專案做完以上操作修改後,idea中依次執行8000、8001、8002專案,啟動專案成功如下圖:

 

 

6.3.2.2 jar包的啟動命令中新增agent引數

首先正常啟動8000專案;

插樁程式碼的執行需要新增星雲測試提供的jar包:

idea中直接引入星雲測試提供的jar包,操作如下圖所示:

 

 

引入jar包後,在idea中對8001和8002專案進行打包:clean->package:

其次分別開啟兩個DOS視窗,輸入以下帶有agent引數的命令,啟動8001和8002專案:

java -javaagent:D:\0823zoa-agent-1.6.2\zoa-bootstrap-1.6.2.jar -jar D:\springcloud-provider-demo\springcloud-provider-demo\target\springcloud-provider-demo-0.0.1-SNAPSHOT.jar

java -javaagent:D:\0823zoa-agent-1.6.2\zoa-bootstrap-1.6.2.jar -jar D:\springcloud-customer-demo\target\springcloud-customer-demo-0.0.1-SNAPSHOT.jar

D:\0823zoa-agent-1.6.2\zoa-bootstrap-1.6.2.jar =agent路徑; D:\springcloud-provider-demo\springcloud-provider-demo\target\springcloud-provider-demo-0.0.1-SNAPSHOT.jar =專案路徑;

出現以下介面表示專案啟動成功:

6.3.3設定cookie

開啟谷歌瀏覽器(因idea中預設設定的是谷歌瀏覽器),輸入網址:http://localhost:8000 開啟eureka服務註冊中心;可以看到已經面板上已顯示8001和8002:

點選8002對應的綠色字型部分進入8002對應的介面:

 

1、在專案URL後加引數teststars.jsp,訪問頁面進行cookie設定:

2、點選setcookie進行設定,設定成功頁面如下:

注:為了區分測試,設定的使用者名稱與星雲客戶端當前登入使用者名稱要保持一致。

檢視控制檯列印資訊可知,username設定成功:

7、測試結果

7.1示波器波形展示

先選中測試用例,再點選開始後就可以進行相應的測試工作了,測試的時候示波器可以收到動態資料並以波形圖的方式展示出來。

重新整理資料,因為8002關聯著8001,所以這裡可以看到,測試8002,8001也被覆蓋到:

上圖是一個spring cloud微服務架構下兩個節點的呼叫圖,當從第一層入口元件訪問後,入口元件向後呼叫下一層節點的時候,後一層節點的執行執行緒自動取到了前一層節點的使用者資訊,並且加入到了第二層節點的執行執行緒控制元件,這樣通過精準測試示波器(登入使用者標識和請求標識一致)就可以收到兩個節點的資料。並且實現在多個使用者同時訪問分散式應用得時候,不同使用者出發的資料會自動分離並路由到對應的示波器並最終對應到用例上。