springcloud帶來的優(yōu)點????
? ? 1.相比于傳統(tǒng)式集中式架構(gòu)來說袜茧,他提供了一種新的架構(gòu)思想步做,相比于原來的架構(gòu)它更容易水平或者垂直的擴展
? ? 2.在編譯時 由于將整個項目拆分成很多小塊,編譯更加的迅速怎炊,方便我們調(diào)試。
? ? 3.在部署的時候,當項目上線彻采,不會因為一個點掛掉整個項目癱瘓,只會單點故障
? ? 4.在大型的互聯(lián)網(wǎng)公司捌归,用到的開發(fā)語言不止一種肛响,拆分成服務(wù)的話,我們只需要調(diào)接口取數(shù)據(jù)即可惜索。
? ? 5.極大程度上的進行了松耦合
? ? 下圖是我理解的分布式架構(gòu)特笋,水平不夠,很片面巾兆。
springcloud有哪些缺點
? ? 1.拆分項目時的顆粒度不好確定猎物,一個服務(wù)最好只做一件事情虎囚。
? ? 2.對于分布式的架構(gòu)來講,或者說在使用這種微服務(wù)式的架構(gòu)時蔫磨,數(shù)據(jù)的一致性是一個大的問題淘讥。我看了很多篇文章講的都很深奧,也沒有個學習的方向质帅∈嗜啵可以百度搜索一些經(jīng)常用的方式二階段提交和三階段提交,分布式事務(wù)等等煤惩。在大的電商平臺嫉嘀,一般都有對賬的系統(tǒng)以及消息隊列方式或者重試機制(當然重試機制一定要保證接口的正確性以及接口的冪等性,而這個冪等性的度要由自己控制)或者補償機制魄揉。
切入正題剪侮,今天想學習一下springcloud,于是看了一些博文洛退,總結(jié)了一些瓣俯。
項目搭建環(huán)境
? ? 使用開發(fā)工具Eclipse,jdk1.7兵怯,maven
構(gòu)建項目
? ? 目標:搭建一個maven工程彩匕,其下有兩個子模塊,一個服務(wù)媒区,一個注冊中心
? ????1.? 首先我們搭建一個maven的父工程驼仪,搭就完事兒了。
? ? 2.我們搭建一個注冊中心袜漩,我們需要用的的組件上Spring Cloud Netflix的Eureka ,eureka是一個服務(wù)注冊和發(fā)現(xiàn)模塊绪爸。
? ? 不多說廢話開搭。
? ? 選中父工程new maven module 這里我直接使用的是jar形式的包
????然后在pom中添加我們需要的依賴宙攻,我不知道為什么簡書一復制xml 就只有文本了奠货,那些標簽全都不能復制過來,希望大神們指導下座掘。
接下來是我們application.yml中的配置递惋,eureka是一個高可用的注冊中心,沒有緩存雹顺,實時發(fā)送心跳包檢測注冊的服務(wù)是否在線丹墨,默認情況下eureka server既是一個server也是一個client,所以在client我們配置的registerwithrureka 為false 和fetchRegistry false都是為了表明自己是一個server嬉愧。
server:
? ? port: 8761
eureka:
? ? instance:
? ? ? ? hostname: localhost
? ? client:
? ??????registerWithEureka: false
? ??????fetchRegistry: false
? ??????serviceUrl:
? ??????????defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
貼出springboot啟動類的代碼:@EnableEurekaServer表明自己是一個注冊中心
package cn.yiside.eurekaServer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServerpublic class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
接下來我們訪問 http://localhost:8761去看一下
我們發(fā)現(xiàn)注冊的application沒有任何東西贩挣,因為我們沒有注冊,并且springcloud進入了保護模式
默認情況下,如果Eureka Server在一定時間內(nèi)沒有接收到某個微服務(wù)實例的心跳王财,Eureka Server將會注銷該實例(默認90秒)卵迂。但是當網(wǎng)絡(luò)分區(qū)故障發(fā)生時,微服務(wù)與Eureka Server之間無法正常通信绒净,這就可能變得非常危險了----因為微服務(wù)本身是健康的见咒,此時本不應(yīng)該注銷這個微服務(wù)。
? Eureka Server通過“自我保護模式”來解決這個問題----當Eureka Server節(jié)點在短時間內(nèi)丟失過多客戶端時(可能發(fā)生了網(wǎng)絡(luò)分區(qū)故障)挂疆,那么這個節(jié)點就會進入自我保護模式改览。一旦進入該模式,Eureka Server就會保護服務(wù)注冊表中的信息缤言,不再刪除服務(wù)注冊表中的數(shù)據(jù)(也就是不會注銷任何微服務(wù))宝当。當網(wǎng)絡(luò)故障恢復后,該Eureka Server節(jié)點會自動退出自我保護模式胆萧。
自我保護模式是一種對網(wǎng)絡(luò)異常的安全保護措施庆揩。使用自我保護模式,而已讓Eureka集群更加的健壯跌穗、穩(wěn)定订晌。
在Spring Cloud中,可以使用eureka.server.enable-self-preservation=false來禁用自我保護模式
這個問題并不影響我們繼續(xù)去進行接下來的步驟蚌吸,所以繼續(xù)锈拨。
3.我們要搭建一個服務(wù),并且將其注冊到注冊中心中羹唠。
類似于注冊中心的搭建模式推励,但是啟動類和配置要有一些變化
啟動類代碼
@RestController注解是集成了controller和ajax的默認注解,需要導入jackson包
package cn.yiside.eurakaClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
@RestController
@EnableEurekaClient
public class EurakaClientApplication {
public static void main(String[] args) {
SpringApplication.run(EurakaClientApplication.class, args);
}
@Value(value="${server.port}")
private String port;
@RequestMapping("hi")
public String sayHi(@RequestParam String name){
return "你好"+name+"我來自"+port;
}
}
application.yml配置如下
表示我們注冊的地址肉迫,以及我們這個服務(wù)的端口和發(fā)布到注冊中心的服務(wù)名
eureka:
? ??client:
????????serviceUrl:? ??????
? ??????????defaultZone: http://localhost:8761/eureka/
server:
? ? port: 8762
spring:
? ? application:
? ? ? ? name: service-sayHi
啟動我們的服務(wù)。
Status顯示UP表示服務(wù)正常稿黄,可以使用喊衫。其它取值DOWN、OUT_OF_SERVICE杆怕、UNKNOWN等族购,只有UP的微服務(wù)會被請求。
訪問我們的服務(wù)陵珍,看展示效果
今天只學習了Eureka 注冊中心 springCloud還有很多要學寝杖,加油。
以下是后期需要學習的springcloud的其他組件
分布式/版本化/集中化配置 - spring cloud config?服務(wù)注冊發(fā)現(xiàn) -Netflix Eureka?
路由 -Netflix Zuul?服務(wù)之間的點對點調(diào)用(Service-to-service calls)
?負載均衡-Netflix Ribbon?
斷路器 -Netflix Hystrix?分布式消息
五大核心組件:
服務(wù)注冊發(fā)現(xiàn) -Netflix Eureka
配置中心-?spring cloud config
負載均衡-Netflix Ribbon
斷路器 -Netflix Hystrix
路由(網(wǎng)關(guān)) -Netflix Zuul