SpringCloud-服務注冊與發現(注冊中心)
作者 : Stanley 羅昊
【轉載請注明出處和署名,謝謝!】
注:作者使用IDEA + Gradle
注:需要有一定的java&&SpringBoot或SSM基礎
SpringCloud是做什么的?
其實springcloud是基於springboot,在springboot基礎之上加入了一些第三方的組件或是一些自己的組件,進行了一個分布式的擴展;
當然,它的組件非常多,在接下來的博文分享中,我將會陸續連載出來比較重要的一些組件;
注冊中心、注冊中心 服務器、系統健康檢查、安全檢查、分布式配置、分布式配置服務器、熔斷器、分布式鏈路跟蹤、分布式日志收集、分布式網關;
注冊中心 eureka
為什么要有注冊中心?
我們就拿電商舉例;在早起開發中,一個大的項目分別由功能模塊組成,比如淘寶,你有一個登陸,還有注冊,購買,支付等功能,這些一個個小的模塊,組成了一個大的項目,但是其中的一個小模塊出現問題,那么整個項目都將被迫關閉服務器進行維護,為了解決這個問題,這些年越來越多的企業開始使用微服務分布式這個框架來解決這個問題,比如當你的注冊模塊出問題了,並不影響其他模塊,你注冊出問題,我登錄照樣正常,只不過注冊我線關閉服務罷了;
這一個個小的模塊就被稱之為“服務”,但是服務與服務之前是需要相互調用,這個時候就需要注冊中心作為中介一樣,把這些一個個服務注冊進來,進來后我幫你們進行連接,當服務器a想調用服務b的時候,服務器a僅需要在注冊中心找服務b即可,而不是直接向服務b索要;
所以,我們在開發過程中,需要將我們寫好的每一個功能模塊(服務)都朝注冊中心注冊一下,但是注冊中心可不管你們誰調用誰,它只管注冊與發現,當然在你注冊的時候,需要把服務的名稱告訴注冊中心,不然那么多服務,誰知道這些服務都是干嘛的;
所有服務都向注冊中心注冊,事實上注冊中心已經搭好了一個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,這里可以隨便寫,但是要注意,不要寫重復了;
下面,我們直接在地址欄輸入請求地址即可;
划紅線的那一欄就表明你所注冊進來的服務;
今日感悟:
一件東西越難獲得,往往它的價值就越高;
做人也是如此,如果你總是輕易的答應別人;
甚至討好別人,那,你的自身價值也就越低廉