做者 : Stanley 羅昊java
注:做者使用IDEA + Gradleweb
注:須要有必定的java&&SpringBoot或SSM基礎redis
其實springcloud是基於springboot,在springboot基礎之上加入了一些第三方的組件或是一些本身的組件,進行了一個分佈式的擴展;spring
固然,它的組件很是多,在接下來的博文分享中,我將會陸續連載出來比較重要的一些組件;tomcat
注冊中心、註冊中心 服務器、系統健康檢查、安全檢查、分佈式配置、分佈式配置服務器、熔斷器、分佈式鏈路跟蹤、分佈式日誌收集、分佈式網關;安全
爲何要有註冊中心?springboot
咱們就拿電商舉例;在早起開發中,一個大的項目分別由功能模塊組成,好比淘寶,你有一個登錄,還有註冊,購買,支付等功能,這些一個個小的模塊,組成了一個大的項目,可是其中的一個小模塊出現問題,那麼整個項目都將被迫關閉服務器進行維護,爲了解決這個問題,這些年愈來愈多的企業開始使用微服務分佈式這個框架來解決這個問題,好比當你的註冊模塊出問題了,並不影響其餘模塊,你註冊出問題,我登陸照樣正常,只不過註冊我線關閉服務罷了;服務器
這一個個小的模塊就被稱之爲「服務」,可是服務與服務以前是須要相互調用,這個時候就須要註冊中心做爲中介同樣,把這些一個個服務註冊進來,進來後我幫大家進行鏈接,當服務器a想調用服務b的時候,服務器a僅須要在註冊中心找服務b便可,而不是直接向服務b索要;app
因此,咱們在開發過程當中,須要將咱們寫好的每個功能模塊(服務)都朝註冊中心註冊一下,可是註冊中心可無論大家誰調用誰,它只管註冊與發現,固然在你註冊的時候,須要把服務的名稱告訴註冊中心,否則那麼多服務,誰知道這些服務都是幹嗎的;負載均衡
全部服務都向註冊中心註冊,事實上註冊中心已經搭好了一個Map,key就是你的服務名稱(項目名),value就是服務的端口號,由於咱們在註冊的時候,不但要告訴項目名稱,固然也須要告訴咱們的ip地址;
首先,咱們須要新建一個項目,這裏我選用了Gradle,由於比較方便好用,我的感受Maven太過繁瑣笨重;
建立好項目後,接下來,咱們須要在build.gradle文件中進行一些配置,這些配置我就不一一講解了,因此須要有boot的基礎;
apply plugin: 'java' apply plugin: 'spring-boot' sourceCompatibility = 1.8 dependencies { testCompile group: 'junit', name: 'junit', version: '4.12' } //在編譯構建時的配置 buildscript { ext { //定義一個變量,統一規定springboot的版本 springBootVersion = '1.5.10.RELEASE' } repositories { maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' } jcenter() mavenCentral() //spring repo maven { url "http://repo.spring.io/snapshot" } maven { url "http://repo.spring.io/milestone" } maven { url "http://repo.spring.io/release" } maven { url "http://repo.spring.io/plugins-snapshot" } } dependencies {//用來打包 classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") } } //統一全部項目的配置 allprojects { group 'com.lh' version '1.0-SNAPSHOT' ext { springCloudVersion = 'Edgware.SR2' } repositories { maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' } jcenter() mavenCentral() //spring repo maven { url "http://repo.spring.io/snapshot" } maven { url "http://repo.spring.io/milestone" } maven { url "http://repo.spring.io/release" } maven { url "http://repo.spring.io/plugins-snapshot" } } //指定編碼格式 tasks.withType(JavaCompile) { options.encoding = "UTF-8" } } //統一子項目的配置,僅對子項目生效 subprojects { apply plugin: 'java' apply plugin: 'idea' apply plugin: 'spring-boot' dependencies { compile('org.springframework.boot:spring-boot-starter-web') { //移出tomcat exclude module: "spring-boot-starter-tomcat" } //undertow(性能比tomcat好,吞吐量大) compile 'org.springframework.boot:spring-boot-starter-undertow' //健康檢查 compile 'org.springframework.boot:spring-boot-starter-actuator' //集成Redis compile group: 'org.springframework.boot', name: 'spring-boot-starter-data-redis' testCompile( group: 'junit', name: 'junit', version: '4.12' ) } dependencyManagement { imports { mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}" } } }
配置完成後點擊導入,請耐心等待他下載完環境以及jar包:
在咱們剛剛建立好的項目上右鍵,選擇New-》Module;
到這裏有有些疑惑了,爲何要在項目中,再建立一個項目呢?
由於,咱們如今的這些操做,實際上就是微服務,咱們把一個大的項目進行了拆分,分紅了一個個小的項目(也被稱之爲,「子項目」),能夠把他們理解HTML中的DIV,咱們如今建的是一個最外層的DIV,咱們準備建的是大DIV裏面中的小DIV;
在選擇Module後勾選Gradle跟Java點擊NEXT,而後給這個模塊起個名字,也就是給這個服務起個名字;
創建完模塊後,咱們接下來就把這個模塊當作一個註冊中心,沒錯,日後的項目,咱們都須要朝着它進行註冊;
在這個Module項目結構下(我這個模塊的名稱是:reigster-center)點擊build.gradle這個配置文件中,進行一個簡單的配置;
剛纔我說了,咱們須要把這個模塊作成一個註冊中心,因此咱們須要在build.gradle引入一個jar包來配置註冊中心所具有的條件;
build.gradle裏的配置:
dependencies { //eureak:註冊中心,服務器 compile 'org.springframework.cloud:spring-cloud-starter-eureka-server' }
導入成功後,接下來,咱們須要在項目的src-main-resources目錄下建立一個yml配置文件:
配置文件內容:
server: port: 8080 spring: application: name: reigster-center eureka: client: register-with-eureka: false #啓動時不註冊,來表示本身是一個註冊中心 fetch-registry: false #不在註冊中心拉取數據 service-url: defaultZone: http://localhost:8081/eureka/,http://localhost:8080/eureka/,http://localhost:8082/eureka/ server: enable-self-preservation: true #是否開啓eureka服務器的自我保護
首先,8080就是咱們註冊中心的端口號,咱們訪問的時候,也須要在地址欄輸入8080;
name 表明你的服務名稱,這裏寫本身的項目名稱便可;
register-with-eureka: true #啓動時不註冊,來表示本身是一個註冊中心 fetch-registry: true #不在註冊中心拉取數據
若是是其餘項目,咱們須要向註冊中心請求資源,獲取數據,可是註冊中心不須要,由於我本身就是一個註冊中心,我何須具有這些功能,因此這裏就把一些功能關閉
能夠看到,下面編寫了許多的端口號,這裏面的每個地址都是一個註冊中心,在啓動的時候進行相互註冊,若是其中一個註冊中心出現故障,那麼另外兩個頂替,從而也實現了負載均衡與集羣;
自我保護我會在後面的文章中會重點介紹;
當以上配置均完成後,咱們開始編寫啓動類,先看下我點項目結構:
在java目錄下建立一個包,表明這個包只存放啓動類;
在包中編寫啓動類(RegisterCenterProvider)用於啓動註冊中心:
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; @EnableEurekaServer @SpringBootApplication public class RegisterCenterProvider { public static void main(String [] args){ SpringApplication.run(RegisterCenterProvider.class,args); } }
啓動註冊中心
準備工做完成後,咱們只需運行啓動類便可啓動註冊中心;
無需編寫其餘代碼;
準備啓動時,先看一下本身的註冊中心端口號,個人是8080,這裏能夠隨便寫,可是要注意,不要寫重複了;
下面,咱們直接在地址欄輸入請求地址便可;
劃紅線的那一欄就代表你所註冊進來的服務;
今日感悟:
一件東西越難得到,每每它的價值就越高;
作人也是如此,若是你老是輕易的答應別人;
甚至討好別人,那,你的自身價值也就越低廉