1. 程式人生 > >SpringCloud從入門到進階(四)——使用SpringBoot搭建微服務

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

wid web api 進入 con cloud val 讀取 pat ase

內容

  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搭建微服務