內容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搭建微服務
參考
SpringCloud從入門到進階(二)——註冊中心Eureka的僞分佈式部署
在原有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>
在原有項目的基礎上增長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
在主程序類中增長@EurekaClient,開啓eureka服務。
//開啓EurekaClient @EnableEurekaClient @SpringBootApplication //包掃描、Swagger、事務的配置省略 public class IdlegoodApplication { //一些bean的注入和建立省略public static void main(String[] args) { SpringApplication.run(IdlegoodApplication.class, args); } }
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; } }
測試接口1:http://localhost:8881/test/hello/leo,正常。
按照以前的操做進行項目打包、上傳,具體過程可參考: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,確認服務正常啓動。
測試屢次,能夠看到Zuul會將請求在多個微服務實例中作負載均衡,默認狀況按照輪詢算法分配請求。
請求轉發到實例1處理:
請求轉發到實例2處理:
請求轉發到實例3處理:
向服務器上傳小於1MB的文件,測試屢次,也能夠看到負載均衡的效果。
請求轉發到實例1處理:
請求轉發到實例2處理:
請求轉發到實例3處理:
可是,當上傳超過1MB大小的文件時,服務報錯。
出現這個問題,想必你們都有疑問。一樣的請求,爲何直接調用服務時正常,可是經過Zuul路由調用服務就會出錯呢。若是你在上傳文件的測試中,還遇到服務調用失敗、中文亂碼等詭異報錯,那麼說明你測得很全面。對於這些問題的解釋和解決,請看下篇文章 。