SpringCloud從入門到進階(四)——使用SpringBoot搭建微服務
內容
SpringBoot整合SpringCloud的Eureka、Zuul等組件,快速實現簡單易懂且具有服務熔斷、負載均衡的分布式架構1.0,體驗微服務的魅力。
版本
IDE:IDEA 2017.2.2 x64
JDK:1.8.0_171
manve:3.3.3
SpringBoot:1.5.9.RELEASE
SpringCloud:Dalston.SR1
適合人群
?Java開發人員
說明
轉載請說明出處:SpringCloud從入門到進階(四)——使用SpringBoot搭建微服務
參考
Linux入門實踐筆記(二)--Jar包運行與關閉
SpringCloud從入門到進階(二)——註冊中心Eureka
步驟
pom.xml
在原有SpringBoot項目的基礎上增加SpringCloud依賴
<?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.zih.jms</groupId> <artifactId>idlegood</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> ? <name>idlegood</name> ? <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.9.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> <!--添加1:在dependencyManagement標簽中聲明SpringCloud的版本, 所有的SpringCloud組件的依賴都將使用該版本SpringCloud中規定的版本號 --> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.SR1</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <!--添加2:SpringCloud相關依賴 --> <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> <!--actuator依賴 Spring Boot提供的項目運行狀態監控功能--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> ...其他省略 </project>
yaml
#添加3:eurekaSever配置
eureka:
client:
service-url:
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka,http://eureka7003.com:7003/eureka
spring:
#添加4:設置springboot項目的應用名稱,並默認啟動peer1
application:
name: application-idleGoodService #註意:此處的名稱一定要個路由接入服務器中的配置名一致
profiles: active: peer1
datasource:
...
#省略原有Springboot項目的數據源、redis、mybatis、分頁等配置
#添加5:增加日誌輸出,指明日誌存放位置;同時需要在資源路徑下引入配置文件
logging:
file: logs/application-idleGoodService-${server.port}.logs
?
#添加6:增加peer1和peer2兩種profiles的配置
---
spring:
profiles: peer1
server:
port: 8001
eureka:
instance:
instance-id: springcloud-idleGoodService-8001
management:
port: 8101
security:
enabled: false
---
spring:
profiles: peer2
server:
port: 8002
eureka:
instance:
instance-id: springcloud-idleGoodService-8002
management:
port: 8102
security:
enabled: false
SpringApplication
//開啟EurekaClient @EnableEurekaClient @SpringBootApplication ...//包掃描、Swagger、事務的配置省略 public class IdlegoodApplication { ? //一些bean的註入和創建省略 ... public static void main(String[] args) { SpringApplication.run(IdlegoodApplication.class, args); } }
Controller
@RequestMapping("/test") @RestController public class DemoController { ? @PostMapping("/demoTest/{name}") public String demoTest(@PathVariable(value = "name") String name, @RequestParam(value = "from") String user){ return "Hello "+name+",this is DemoTest.From "+user+" ."; } }
本地測試
使用postman請求Controller,測試通過
打包
在命令行工具中進入項目pom文件所在路徑,然後執行mvn clean package打包。
過程可參考:SpringCloud從入門到進階(二)——註冊中心Eureka
拷貝
使用Bitvise SFTP或WinSCP等工具將jar包上傳到有公網的服務器,再使用scp命令將jar包拷貝到兩臺Web API服務器普通用戶的~/jars路徑下。
過程可參考:SpringCloud從入門到進階(二)——註冊中心Eureka
修改hosts文件
用於訪問EurekaSever,微服務內部之間的調用不需要經過接入服務器。將內部域名eureka7001.com、eureka7002.com、eureka7003.com綁定到局域網IP 172.26.125.118。
#IP 域名 別名 [jms@iz8vb62snc6e5cage5yvzcz jars]$ sudo vi /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 172.26.125.118 eureka7001.com 172.26.125.118 eureka7002.com 172.26.125.118 eureka7003.com
過程可參考:SpringCloud從入門到進階(二)——註冊中心Eureka
運行
分別在兩臺Web API服務器上執行一下兩條命令,啟動微服務
java -jar idlegood-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer1 & #服務器A java -jar idlegood-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer2 & #服務器B
訪問EurekaSever,確認服務正常啟動。
先使用Postman直接請求Web API服務器的接口
確保Web API服務器配置無誤後再使用Postman請求路由接入服務器的接口。
由於一個微服務中有多個實例,路由接入服務器會自動在這些實例之間進行負載均衡。
註意:筆者在這一步遇到了請求路由接入服務器接口時,接口服務熔斷。
觀察路由接入服務器中項目的日誌
2018-10-23 19:09:01.809 INFO 9621 --- [nio-7081-exec-1] c.n.l.DynamicServerListLoadBalancer
: DynamicServerListLoadBalancer for client application-idleGoodService initialized:
DynamicServerListLoadBalancer:{NFLoadBalancer:name=application-idleGoodService,
#下面這句可以看出,EurekaServer默認是按“主機名:端口號”的形式存儲EurekaClient的信息
current list of Servers=[iz8vb6a56ld0vy6vuaijriz:8002, iz8vb6a56ld0vy6vuaijrjz:8001],
Load balancer stats=Zone stats: {defaultzone=[Zone:defaultzone; Instance count:2;
Active connections count: 0; Circuit breaker tripped count: 0; Active connections per server: 0.0;]
可以看到路由接入服務器已經從Eureka中讀取到了微服務的信息,但是是“主機名:端口號”的形式。將所有微服務的主機名和內網IP地址的映射添加到路由接入服務器的hosts中即可解決該問題。
關閉
關閉java程序請參考:Linux入門實踐筆記(二)--Jar包運行與關閉
註意
命令、代碼拼寫完一定要認真檢查,尤其是大小寫,空格等,避免因為馬虎造成莫名的錯誤。
SpringCloud從入門到進階(四)——使用SpringBoot搭建微服務