從零搭建SpringCloud服務(史上最詳細)
1.什麼是SpringCloud?
我就不bb了,貼上比較優秀的部落格 https://www.cnblogs.com/lexiaofei/p/6808152.html
自己理解就是,一個伺服器叢集中,每個伺服器固定的完成某些任務,任務成果的需求者想獲取這些成果時通過主機名+埠號獲取,對了它當然是基於http協議。每臺伺服器的分工更加明細。還能使用一個叢集來實現某一服務,這樣也能保證某一服務不會因為某一臺伺服器的宕機而終止。
1.1 SpringCloud的一個基本結構
2.開始搭建SpringCloud
ps: 博主基於Maven+idea搭建。
另外SpringCloud
2.1 引入Spring Boot相關依賴 這裡的springboot用的是1.5.7版本
引入Spring Cloud相關依賴 這裡為 Edgware.SR5
2.1 工程初始化配置
在Idea中建立工程:File -> New ->Project
點選 Empty Project -> Next
專案命名 -> 專案位置
選擇模組 modules ->next
進入新的視窗後,開始配置Maven,開啟設定 setting
因為我之前做過配置,因此只需要改變框1的路徑,如第一次配置需要自己找到你maven放置的位置,以及settings.xml,repository的位置,實在不會的百度 maven整合idea
3個框選擇完畢後點擊 ok
接下來新建module
這裡可能會出現載入不出archetype list的問題
用了網上的所有解決辦法花了3個小時解決都沒用,重啟之後竟然可以了····你敢信?????小時候網咖網管的至理名言都忘了!!重啟一下嘛!!
出來之後 選擇quickstart ->下一步
名字自己想 想好後,複製一下你想好的 ArtifactId點選Next,groupId為組織名 也是自己想一個,一般為公司網址反寫。
粘貼後下一步
提供註冊服務的伺服器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.yun</groupId>
<artifactId>springcloud-eureka-server</artifactId>
<version>1.0-SNAPSHOT</version>
<name>springcloud-eureka-server</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties>
<!--引入springboot-parent父專案-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.7.RELEASE</version>
</parent>
<dependencies>
<!--引入springcloud的euekea server依賴-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
<!--指定下載源和使用springcloud的版本-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Edgware.SR5</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
點選Import Changes
等待右下角載入springcloud的依賴
2.2 Springboot的搭建 以及提供註冊服務 的 服務配置
建立resources資料夾
並設定作為資源根目錄,之後檔案變成這樣之後資料夾變成有黃色的橫槓
在resources下新建檔案,檔名為application.yml (對是yml 不是xml ,博主第一次學習時,還以為是其他博主打錯了,踩了一個小坑)
配置yml,注意:如果只配置前兩行埠號資訊會報錯
server:
port: 8700 # 埠自己決定
# 指定當前eureka客戶端的註冊地址,也就是eureka服務的提供方,當前配置的服務的註冊服務方
eureka:
client:
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka
register-with-eureka: false #自身 不在向eureka註冊
fetch-registry: false #啟動時禁用client的註冊
instance:
hostname: localhost
#指定應用名稱
spring:
application:
name: eureka-server
知識補充:
開發springboot的入口類 EurekaServerApplication.java
EurekaServerApplication.java
package com.yun;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer //當前使用eureka的server
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class,args);
}
}
右鍵運行當前類:
執行成功console畫面
嘗試進入eureka管理介面 埠號為 yml裡配置的(埠號自己設定 需要大於公用和保留的埠號)1024~65535
一般我喜歡設定為 8700到8800之間
如下 管理介面已經可以登入了
2.3 客戶端client 提供真正服務的角色的配置, 它提供服務 在 服務註冊方server (註冊中心)進行註冊
同樣新建module,選擇quickstart點選下一步
兩個位置 置空
取名 下一步
注意這裡要在根目錄springcloud 下建立模組,content root 會預設在之前的模組之下建立模組 這樣建立模組會出現問題並報錯
推薦這種配置方法 在content root下springcloud後改名字 如下圖配置點下一步,紅框處一般預設為上一個模組的檔案目錄名,需要改為你的模組名
成功後為並列狀態,如不為並列或報錯請重新配置
配置servicesupport的pom,與server的pom配置相同,只需要把第一個pom的1的方框處server改為client
和第一個微服務同理 我們需要配置入口類 pom.xml application.yml,因為是服務提供者,這裡還需編寫服務類controller
application.yml
server:
port: 8701 # 服務提供方
# 指定當前eureka客戶端的註冊地址,
eureka:
client:
service-url:
defaultZone: http://${eureka.instance.hostname}:8700/eureka
instance:
hostname: localhost
#當前服務名稱
spring:
application:
name: eureka-service
pom.xml:
編寫所提供的 服務controller:
package com.yun;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/Hello")
public class Controller {
@RequestMapping("/World")
public String helloWorld(String s){
System.out.println("傳入的值為:"+s);
return "傳入的值為:"+s;
}
}
入口類 並執行此微服務:
package com.yun;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient//代表自己是一個服務提供方
public class EurekaServiceApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServiceApplication.class,args);
}
}
右鍵入口類名點選 run(當然開啟此服務時需要先開啟server服務 就是我們第一個編寫的微服務)
此時再進入服務註冊的頁面 http://localhost:8700/
可以看見服務提供者已被註冊進 服務註冊者
在直接訪問一下服務提供者的 網路位置http://localhost:8701/Hello/World?s=小沛
我們已經看見 可以訪問了,證明此微服務可用。
但是我們一般不直接呼叫所需的微服務,而是經過提供註冊服務的伺服器server,獲取所需的服務提供者列表(為一個列表,此列表包含了能提供相應服務的伺服器),他們也許是個叢集,因此server會返回一個 ip+埠號的表,服務消費者通過相應演算法訪問這表上的不同伺服器,這些伺服器提供的是相同的服務,這種在服務消費者一方挑選伺服器為自己服務的方式是一種客戶端的負載均衡。目前博主所知的有 輪詢和隨機兩種方式 訪問這些伺服器,輪詢就是迴圈的意思,假如有3臺伺服器,訪問方式就是1,2,3,1,2,3,1,2,3····,隨機就是隨機,回想一下random方法,一種無規律的方式。這兩種方式都是為了,訪問每個伺服器的可能性儘量的相同。還有權重負載這種演算法,意思就是 根據伺服器負載能力的分配相應的服務。能力大的幹得多。能力小的幹得少。
2.4 服務的呼叫方式
restTemplate+ribbon
feign
2.4.1 restTemplate+ribbon
ribbon是一種負載均衡的客戶端,它是什麼呢?請詳讀https://www.jianshu.com/p/1bd66db5dc46
可以看見其中的一段如下:
而客戶端負載均衡和服務端負載均衡最大的不同點在於上面所提到服務清單所儲存的位置。在客戶端負載均衡中,所有客戶端節點都維護著自己要訪問的服務端清單,而這些服務端端清單來自於服務註冊中心,比如上一章我們介紹的Eureka服務端。同服務端負載均衡的架構類似,在客戶端負載均衡中也需要心跳去維護服務端清單的健康性,預設會建立針對各個服務治理框架的Ribbon自動化整合配置,比如Eureka中的org.springframework.cloud.netflix.ribbon.eureka.RibbonEurekaAutoConfiguration,Consul中的org.springframework.cloud.consul.discovery.RibbonConsulAutoConfiguration。在實際使用的時候,我們可以通過檢視這兩個類的實現,以找到它們的配置詳情來幫助我們更好地使用它。