基於 Spring Cloud 的微服務架構實踐指南(上)
阿新 • • 發佈:2020-04-03
>show me the code and talk to me,做的出來更要說的明白
>GitHub 專案[learnSpringCloud](https://github.com/buerbl/learnSpringCloud)同步收錄
>我是布林bl,你的支援是我分享的動力!
## 一、 引入
上回 [Spring Cloud 理論篇](https://mp.weixin.qq.com/s?__biz=MzU3ODA5NDc0Mw==&mid=2247483852&idx=1&sn=eabbbabb1a25193afd702213ab160b76&chksm=fd7bd234ca0c5b22fefecafabb293b200428d00737876665c8d251c7cf7979aae71e00f720d7&token=405320755&lang=zh_CN#rd) 介紹了 Spring Cloud 的常見元件,讓讀者對 `Spring Cloud` 有了一個巨集觀認識,這是從理論層面出發的。接下來我們就進入 `Spring Cloud` 的實戰教程,擼起袖子,真槍實彈幹一場。在實戰演練中感受一下 `Spring Cloud` 的魅力所在。在教程中,我會將 `Spring Cloud` 常見元件進行整合。整個過程就像搭積木一樣,一點一點地完成一個微服務工程的搭建。實戰演練是比較繁瑣的,但是隻要我們真正地去做了,就會收穫很多。
![](http://javahouse.xyz/20200401154409.png)
## 二、`Eureka` 元件(註冊中心)
作為 `Spring Cloud` 的註冊中心,我們第一步需要把 `Eureka` 元件搭起來。因為接下來的消費者以及生產者都是以 `Eureka` 元件為基礎展開的。
### 2.1 `pom` 檔案
我們引入 `Eureka` 的依賴。
```java
org.springframework.cloud
spring-cloud-starter-eureka-server
```
正如 [Spring Cloud 理論篇](https://mp.weixin.qq.com/s?__biz=MzU3ODA5NDc0Mw==&mid=2247483852&idx=1&sn=eabbbabb1a25193afd702213ab160b76&chksm=fd7bd234ca0c5b22fefecafabb293b200428d00737876665c8d251c7cf7979aae71e00f720d7&token=405320755&lang=zh_CN#rd) 提到 `Spring Cloud` 是基於 `SpringBoot` 開發的。那麼讀者是否有疑惑為什麼不需要
`web`模組呢?當然是需要的,只不過是 `Eureka` 的依賴的依賴中已經包含了必要的模組。
![](http://javahouse.xyz/20200401163459.png)
### 2.2 `yml` 檔案
引入必要模組後,我們就要去配置 `yml` 檔案了。
```java
server:
port: 7001
eureka:
instance:
hostname: localhost # eureka 服務端的例項名稱
client:
register-with-eureka: false # 表示不需要向註冊中心註冊自己
fetch-registry: false # false 表示自己端就是註冊中心,我的職責就是維護服務例項,並不需要去檢索服務
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka # 設定與 Eureka Server 互動的地址查詢服務和註冊服務
```
至於配置相關的檔案意義,註釋已經說的很清楚了。詳情請看註釋。
### 2.3 啟動類
最後寫好啟動類,就算完成的`Eureka` 元件的搭建了。
```java
@SpringBootApplication
@EnableEurekaServer
public class AppApplication7001 {
public static void main( String[] args ) {
SpringApplication.run(AppApplication7001.class, args);
}
}
```
可以看到我們的啟動類的註解除了萬年不變的`@SpringBootApplication`,還增加了 `@EnableEurekaServer`,該註解的作用是表明該工程作為 `Eureka` 元件存在的。就好像我們怎麼證明自己的身份呢,拿出自己的身份證即可。
### 2.4 啟動效果
![](http://javahouse.xyz/20200401164854.png)
`Eureka` 元件啟動如圖所示。
## 三、生產者(服務提供者)
### 3.1 `pom` 檔案
我們再新建一個工程,該工程其實本質也是一個 `Eureka` 元件,不過我們可以通過配置檔案使其變成生產者。可能讀者有點迷糊,我打個比方。社會上有警察、醫生、碼畜等等,有很多的身份型別,但本質我們都是人。我們都是有感情的生物。回到程式碼層面,首先我們需要引入相關依賴。
```java
org.springframework.boot
spring-boot-starter-web
org.springframework.cloud
spring-cloud-starter-eureka
```
### 3.2 `yml` 檔案
```java
server:
port: 8002 # 服務的埠
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka
```
### 3.3 啟動類
```java
@SpringBootApplication
@EnableEurekaClient
public class AppApllcation8002{
public static void main( String[] args ) {
SpringApplication.run(AppApllcation8002.class, args);
}
}
```
這裡我們可以看到註冊中心的啟動類和服務提供者的註解是不一樣的。
註冊中心 | 服務提供者
---|---
@EnableEurekaServer| @EnableEurekaClient
### 3.4 啟動效果
目前我們有了兩個工程,啟動的時候是有順序的。首先啟動註冊中心然後再啟動服務提供者。這就好比我們先要有房子了,才可以入住一樣。
![](http://javahouse.xyz/20200402170316.png)
對比上圖我們可以發現網頁多出來一個服務提供者。說明服務提供者專案搭建完成。
## 四、消費者(服務消費者)
### 4.1 `pom` 檔案
有個服務提供者,那麼是不是應該有服務消費者呢?此時我們需要新建另外一個工程作為服務消費者。那麼問題來了,作為服務消費者,我們怎樣去呼叫服務提供者呢?此時,肯定是不能像以前直接在 `controller` 層呼叫 `service` 層一樣了,因為服務消費者和服務提供者是兩個工程了,並且分別執行在兩個 `tomcat` 裡面。這裡我們就需要進行網路呼叫了。在 `Spring Cloud` 裡面我們可以使用 `Feign` 進行不同服務的呼叫。
```java
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-test
test
org.springframework.cloud
spring-cloud-starter-eureka
org.springframework.cloud
spring-cloud-starter-feign
```
### 4.2 `yml` 檔案
接下來我們需要配置`yml` 檔案。
```java
server:
port: 80
eureka:
client:
register-with-eureka: false # 不向註冊中心註冊了
service-url:
defaultZone: http://localhost:7001/eureka
````
因為工程是作為服務消費者存在的。所以我們不需要往註冊中心註冊服務。這樣註冊中心就只管理好服務提供者即可。
### 4.3 啟動類以及`feign類`介面
```java
@FeignClient(value = "microservicloud-dept") // 服務提供者的名字
public interface IFeignService {
@GetMapping("/provide")
String feign();
}
@SpringBootApplication
@RestController
@EnableEurekaClient
@EnableFeignClients(basePackages = {"com.example"})
public class AppApplication80 {
public static void main( String[] args ) {
SpringApplication.run(AppApplication80.class, args);
}
@Autowired
private IFeignService feignService;
@GetMapping("/controller/feign")
public String feign(){
return feignService.feign();
}
}
```
## 五、總結
至此我們就完成了一個簡單的 `Spring Cloud` 的微服務架構多模組專案。根據專案搭建,我們可以簡單畫出架構圖。具體原始碼已經在開頭引用給出,可以直接克隆執行。
![](http://javahouse.xyz/20200402223139.png)
## 關注微信公眾號,隨時移動端閱讀
![公眾號.jpg](https://user-gold-cdn.xitu.io/2020/3/19/170f21764d87ef98?w=654&h=193&f=png&