一步一步建立一個spring cloud多模組工程
最近專案要用spring boot ,spring cloud 還有docker,在spring cloud這卡了很久,這篇博文做個筆記
1、因為專案是多模組的,這裡需要建立一個maven工程,它的pom作為專案的父pom
1.1、建立一個空的maven工程
建立好以後就是上面這個樣子,因為我們只需要pom檔案做為父pom,規範子模組,因此應當刪除src目錄
1.2、修改pom檔案
但是怎麼修改這個pom檔案呢,我們第一次建立這個可能不太清楚,以為springcloud是基於springboot的,應當特別注意他兩版本的相容性,筆者第一次建立的時候就因為這個版本相容性報錯,浪費了好長時間
為了解決這個問題,我們可以有更方便地方法,那就是用idea自帶的spring initialzr工具建立一個springcloud工程,然後趴下它的pom檔案
如下
題外話 注意一點
實際上剛入門的時候好多都是jar包的問題,找依賴的時候都可以用我這個方法
比如spring-cloud-starter-feign依賴已改為spring-cloud-starter-openfeign,用我這個方法很容易知道這一點
接著上面的步驟繼續
下面就是他的pom檔案
<?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.example</groupId> <artifactId>demo</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>demo</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.0.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <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>Greenwich.M3</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <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> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> <repositories> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>https://repo.spring.io/milestone</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> </project>
然後我們再試著編寫我們的pom檔案
以為是父pom,規範子模組用的所以它的 <packaging>jar</packaging>因改為pom
還有他的springboot版本為2.1.0.RELEASE
springcloud版本為Greenwich.M3
ok
下面就是我們最終的父pom
<?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.whale.demo</groupId> <artifactId>springCloud</artifactId> <version>1.0-SNAPSHOT</version> <packaging>pom</packaging> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.0.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <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>Greenwich.M3</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <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> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> <repositories> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>https://repo.spring.io/milestone</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> </project>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
這個是一定要寫的,禁止獲取快照元件,
否則後面我們需要依賴的cloud的包會報unkonwn錯誤
2、然後建立2個model工程:
一個model工程作為服務註冊中心,即Eureka Server,
另一個作為Eureka Client。
下面以建立server為例子,詳細說明建立過程:
2.1、 Eureka Server的建立
也就是上面我們為了獲取父pom的操作
貼出pom
<?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.example</groupId>
<artifactId>eurekaserver</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>eurekaserver</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<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>Greenwich.M3</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<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>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
</project>
因為我們新建spring moudel時,他沒有自動繼承我們的父pom,所以關鍵還是要修改它的 pom,讓他繼承我們的父pom然後刪掉父pom中已定義的部分
修改後如下
<?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.example</groupId>
<artifactId>eurekaserver</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>eurekaserver</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>com.whale.demo</groupId>
<artifactId>springCloud</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
</project>
相當於這個子pom檔案只是引入了spring-cloud-starter-netflix-eureka-server的依賴
最後我們的父pom下應該多一個元素
<modules>
<module>eurekaserver</module>
</modules>
2.2、啟動一個服務註冊中心
只需要一個註解@EnableEurekaServer,這個註解需要在springboot工程的啟動application類上加
@SpringBootApplication
@EnableEurekaServer
public class EurekaserverApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaserverApplication.class, args);
}
}
2.3、eureka server的配置檔案appication.yml
eureka是一個高可用的元件,它沒有後端快取,每一個例項註冊之後需要向註冊中心傳送心跳(因此可以在記憶體中完成),
在預設情況下erureka server也是一個eureka client ,必須要指定一個 server。
eureka server的配置檔案appication.yml如下
我們還徐要改下配置檔案的字尾為yml
server:
port: 8765
eureka:
instance:
hostname: localhost
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
spring:
application:
name: eurka-server
通過eureka.client.registerWithEureka:false和fetchRegistry:false來表明自己是一個eureka server.
2.4、執行
然後執行啟動類EurekaserverApplication
eureka server 是有介面的,啟動工程,開啟瀏覽器訪問:
http://localhost:8765 ,介面如下
No application available 沒有服務被發現 ……_
因為沒有註冊服務當然不可能有服務被發現了。
3、建立一個服務提供者 (eureka client)
當client向server註冊時,它會提供一些元資料,例如主機和埠,URL,主頁等。Eureka server 從每個client例項接收心跳訊息。 如果心跳超時,則通常將該例項從註冊server中刪除。
建立過程同server類似,建立完pom.xml如下:
<?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.example</groupId>
<artifactId>service-hi</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>service-hi</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>com.whale.demo</groupId>
<artifactId>springCloud</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
</project>
父pom引入module
<modules>
<module>eurekaserver</module>
<module>service-hi</module>
</modules>
通過註解@EnableEurekaClient 表明自己是一個eurekaclient.
@SpringBootApplication
@EnableEurekaClient
@RestController
public class ServiceHiApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceHiApplication.class, args);
}
@Value("${server.port}")
String port;
@RequestMapping("/hi")
public String home(@RequestParam(value = "name", defaultValue = "forezp") String name) {
return "hi " + name + " ,i am from port:" + port;
}
}
僅僅@EnableEurekaClient是不夠的,還需要在配置檔案中註明自己的服務註冊中心的地址,application.yml配置檔案如下:
server:
port: 8768
spring:
application:
name: service-hi
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8765/eureka/
需要指明spring.application.name,這個很重要,這在以後的服務與服務之間相互呼叫一般都是根據這個name 。
啟動工程,開啟http://localhost:8765 ,即eureka server 的網址:
你會發現一個服務已經註冊在服務中了,服務名為SERVICE-HI
這時開啟 http://localhost:8768/hi?name=whale ,你會在瀏覽器上看到 :
參考資料 :https://blog.csdn.net/forezp/article/details/81040925
入門篇已經完了,推薦大家看
史上最簡單的SpringCloud教程 | 第二篇: 服務消費者(rest+ribbon)(感覺方先生的Finchley版沒有他舊版寫的好,Finchley有很多筆誤,)
史上最簡單的SpringCloud教程 | 第三篇: 服務消費者(Feign)
史上最簡單的SpringCloud教程 | 第四篇:斷路器(Hystrix)
斷路器:Hystrix 儀表盤好像只要低版本可以,沒完成這個demo
講的很好,
其次還有一個問題
可以看這個https://www.cnblogs.com/breath-taking/articles/7940364.html