什么是微服務?
微服務就是把原本臃腫的一個項目的所有模塊拆分開來并做到互相沒有關聯,甚至可以不使用同一個數據庫。 比如:項目里面有User模塊和Power模塊,但是User模塊和Power模塊并沒有直接關系,僅僅只是一些數據需要交互,那么就可以吧這2個模塊單獨分開來,當user需要調用power的時候,power是一個服務方,但是power需要調用user的時候,user又是服務方了, 所以,他們并不在乎誰是服務方誰是調用方,他們都是2個獨立的服務,這時候,微服務的概念就出來了。
經典問題:微服務和分布式的區別
談到區別,我們先簡單說一下分布式是什么,所謂分布式,就是將偌大的系統劃分為多個模塊(這一點和微服務很像)部署到不同機器上(因為一臺機器可能承受不了這么大的壓力或者說一臺非常好的服務器的成本可能夠好幾臺普通的了),各個模塊通過接口進行數據交互,其實 分布式也是一種微服務。 因為都是吧模塊拆分開來變為獨立的單元,提供接口來調用,那么 他們本質的區別在哪呢? 他們的區別主要體現在“目標”上, 何為目標,就是你這樣架構項目要做到的事情。 分布式的目標是什么? 我們剛剛也看見了, 就是一臺機器承受不了的,或者是成本問題 , 不得不使用多臺機器來完成服務的部署, 而微服務的目標 只是讓各個模塊拆分開來,不會被互相影響,比如模塊的升級亦或是出現BUG等等...
講了這么多,可以用一句話來理解:分布式也是微服務的一種,而微服務他可以是在一臺機器上。
微服務與Spring-Cloud的關系(區別)
微服務只是一種項目的架構方式,或者說是一種概念,就如同我們的MVC架構一樣, 那么Spring-Cloud便是對這種技術的實現。
微服務一定要使用Spring-Cloud嗎?
我們剛剛說過,微服務只是一種項目的架構方式,如果你足夠了解微服務是什么概念你就會知道,其實微服務就算不借助任何技術也能實現,只是有很多問題需要我們解決罷了例如:負載均衡,服務的注冊與發現,服務調用,路由。。。。等等等等一系列問題,所以,Spring-Cloud 就出來了,Spring-Cloud將處理這些問題的的技術全部打包好了,就類似那種開袋即食的感覺。。
Spring-Cloud項目的搭建
因為spring-cloud是基于spring-boot項目來的,所以我們項目得是一個spring-boot項目,至于spring-boot項目,這節我們先不討論,這里要注意的一個點是spring-cloud的版本與spring-boot的版本要對應下圖:
在我這里我的版本是這樣的
spring-boot:
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.2.RELEASE</version> </parent>
spring-cloud:
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Finchley.SR2</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
當你項目里面有這些依賴之后,你的spring cloud項目已經搭建好了(初次下載spring-cloud可能需要一點時間)
Spring-Cloud組件:
eureka:
eureka是什么?
eureka是Netflix的子模塊之一,也是一個核心的模塊,eureka里有2個組件,一個是EurekaServer(一個獨立的項目) 這個是用于定位服務以實現中間層服務器的負載平衡和故障轉移,另一個便是EurekaClient(我們的微服務)它是用于與Server交互的,可以使得交互變得非常簡單:只需要通過服務標識符即可拿到服務。
與spring-cloud的關系:
Spring Cloud 封裝了 Netflix 公司開發的 Eureka 模塊來實現服務注冊和發現(可以對比Zookeeper)。
Eureka 采用了 C-S 的設計架構。Eureka Server 作為服務注冊功能的服務器,它是服務注冊中心。
而系統中的其他微服務,使用 Eureka 的客戶端連接到 Eureka Server并維持心跳連接。這樣系統的維護人員就可以通過 Eureka Server 來監控系統中各個微服務是否正常運行。SpringCloud 的一些其他模塊(比如Zuul)就可以通過 Eureka Server 來發現系統中的其他微服務,并執行相關的邏輯。
角色關系圖:
如何使用?
在spring-cloud項目里面加入依賴:
eureka客戶端:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> eureka服務端: <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency>
eureka服務端項目里面加入以下配置:
server: port: 3000 eureka: server: enable-self-preservation: false #關閉自我保護機制 eviction-interval-timer-in-ms: 4000 #設置清理間隔(單位:毫秒 默認是60*1000) instance: hostname: localhost lient: registerWithEureka: false #不把自己作為一個客戶端注冊到自己身上 fetchRegistry: false #不需要從服務端獲取注冊信息(因為在這里自己就是服務端,而且已經禁用自己注 冊了) serviceUrl: defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka
當然,不是全部必要的,這里只是把我這里的配置copy過來了
然后在spring-boot啟動項目上 加入注解:@EnableEurekaServer 就可以啟動項目了
@EnableEurekaServer @SpringBootApplication public class AppEureka { public static void main(String[] args) { SpringApplication.run(AppEureka.class); } }
如果看見這個圖片,那么說明你就搭建好了:
這個警告只是說你把他的自我保護機制關閉了
eureka客戶端配置:
server: port: 6000 eureka: 然后在客戶端的spring-boot啟動項目上 加入注解:@EnableEurekaClient 就可以啟動項目了 這里就不截圖了我們 直接來看效果圖: 這里我們能看見 名字叫server-power的(圖中將其大寫了) id為 power-1的服務 注冊到我們的Eureka上面來了 至此,一個簡單的eureka已經搭建好了。 當然 這篇咱們先講應用, 源碼文章以后再更新, 或者大家騰訊課堂搜魯班學院 我會在里面免費的公開課上講到 Spring Cloud 以及Eureka的源碼 client: serviceUrl: defaultZone: http://localhost:3000/eureka/ #eureka服務端提供的注冊地址 參考服務端配 置的這個路徑 instance: instance-id: power-1 #此實例注冊到eureka服務端的唯一的實例ID prefer-ip-address: true #是否顯示IP地址 leaseRenewalIntervalInSeconds: 10 #eureka客戶需要多長時間發送心跳給eureka服務器,表明它仍 然活著,默認為30 秒 (與下面配置的單位都是秒) leaseExpirationDurationInSeconds: 30 #Eureka服務器在接收到實例的最后一次發出的心跳后,需要 等待多久才可以將此實例刪除,默認為90秒 spring: application: name: server-power #此實例注冊到eureka服務端的name
然后在客戶端的spring-boot啟動項目上 加入注解:@EnableEurekaClient 就可以啟動項目了 這里就不截圖了,我們直接來看效果圖:
這里我們能看見 名字叫server-power的(圖中將其大寫了) id為 power-1的服務 注冊到我們的Eureka上面來了
至此,一個簡單的eureka已經搭建好了。