(系列5)JAVA框架

框架

Spring IoC?

IoC

IoC 控制反轉(zhuǎn)兄旬,把對(duì)象創(chuàng)建莲组、依賴反轉(zhuǎn)給容器實(shí)現(xiàn)秋柄,需要?jiǎng)?chuàng)建一個(gè)容器和一種描述讓容器知道對(duì)象間的依賴關(guān)系显沈,Spring 通過 IoC 容器管理對(duì)象及其依賴關(guān)系刁卜。IoC 的主要實(shí)現(xiàn)方式是 DI志电,對(duì)象不是從容器中查找依賴的類,而是容器實(shí)例化對(duì)象時(shí)主動(dòng)為它注入依賴的類蛔趴。

基于 XML 的 IoC 初始化

當(dāng)創(chuàng)建 ClassPathXmlApplicationContext 時(shí)挑辆,調(diào)用父類 AbstractApplicationContext 的 refresh 方法啟動(dòng)整個(gè) IoC 容器對(duì) Bean 定義的載入過程,在創(chuàng)建 IoC 容器前如果已有容器存在,需要銷毀鱼蝉,保證使用的是新創(chuàng)建的容器洒嗤。

容器創(chuàng)建后通過 loadBeanDefinitions 方法加載 Bean 配置資源,首先解析配置文件路徑魁亦,讀取配置文件內(nèi)容渔隶,然后通過 XML 解析器將配置信息轉(zhuǎn)換成文檔對(duì)象,之后按照 Bean 的定義規(guī)則解析文檔對(duì)象洁奈。

IoC 容器中注冊(cè)的 Bean 信息存放在一個(gè) HashMap 中间唉,key 是字符串,值是 BeanDefinition利术。當(dāng)配置信息中的 Bean 被解析且被注冊(cè)到 IoC 容器后呈野,初始化就算完成了。


DI

實(shí)現(xiàn)

  • 構(gòu)造方法注入

    IoC 容器會(huì)檢查對(duì)象的構(gòu)造方法印叁,取得它的依賴對(duì)象列表被冒,當(dāng)對(duì)象實(shí)例化完成時(shí)依賴的屬性也會(huì)成功注入,可以直接使用轮蜕。缺點(diǎn)是當(dāng)依賴對(duì)象較多時(shí)姆打,可能需要多個(gè)構(gòu)造方法。

  • setter 方法注入

    只需要為依賴對(duì)象的屬性添加 setter 方法肠虽,在描述性上要比構(gòu)造方法注入強(qiáng)幔戏,缺點(diǎn)是無(wú)法在對(duì)象構(gòu)造完成后就進(jìn)入就緒狀態(tài)。IoC 容器會(huì)先實(shí)例化 Bean 對(duì)象税课,然后通過反射調(diào)用 setter 方法注入屬性闲延。

  • 注解注入

    @Autowired:自動(dòng)按類型注入,如果有多個(gè)匹配則按照指定 Bean 的 id 查找韩玩,需要搭配 @Qualifier垒玲。

    @Resource :按照 Bean 的 id 注入,如果找不到則會(huì)按類型注入找颓。

    @Value :用于注入基本數(shù)據(jù)類型和 String合愈。


Bean

生命周期

在 IoC 容器的初始化時(shí)會(huì)對(duì) Bean 定義完成資源定位,加載讀取配置并解析击狮,最后將解析的 Bean 信息放在一個(gè) HashMap 集合中佛析。當(dāng) IoC 容器初始化后,會(huì)創(chuàng)建 Bean 實(shí)例并完成依賴注入彪蓬,注入對(duì)象依賴的各種屬性值寸莫,在初始化時(shí)可以指定自定義的初始化方法。經(jīng)過一系列初始化操作后 Bean 達(dá)到可用狀態(tài)档冬,當(dāng)使用完成后會(huì)調(diào)用 destroy 方法進(jìn)行銷毀膘茎,此時(shí)也可以指定自定義的銷毀方法桃纯,最終 Bean 被銷毀且從容器中移除。

通過配置 bean 標(biāo)簽或注解中的 init-Method 和 destory-Method 屬性指定自定義初始化和銷毀方法披坏。


作用域

通過 scope 屬性指定作用域态坦。

范圍 作用域 備注
所有 Spring 應(yīng)用 singleton 默認(rèn)作用域,每個(gè)容器中只有一個(gè)唯一的 Bean 實(shí)例棒拂。
prototype 每次 Bean 請(qǐng)求都會(huì)創(chuàng)建一個(gè)新的實(shí)例伞梯。
Spring Web 應(yīng)用 request 為每個(gè)請(qǐng)求創(chuàng)建一個(gè)新的實(shí)例。
session 為每個(gè)會(huì)話創(chuàng)建一個(gè)新的實(shí)例着茸。
global session 為全局 session 創(chuàng)建一個(gè)新的實(shí)例壮锻。

創(chuàng)建

  • XML

    默認(rèn)無(wú)參構(gòu)造方法,只需指明 bean 標(biāo)簽中的 id 和 class 屬性涮阔,如果沒有無(wú)參構(gòu)造方法會(huì)報(bào)錯(cuò)猜绣。

    靜態(tài)工廠方法,通過 bean 標(biāo)簽的 class 屬性指明工廠敬特,factory-method 屬性指明方法掰邢。

    實(shí)例工廠方法,通過 bean 標(biāo)簽的 factory-bean 屬性指明工廠伟阔,factory-method 屬性指明方法辣之。

  • 注解

    @Component 把當(dāng)前類對(duì)象存入 Spring 容器,相當(dāng)于在 xml 中配置一個(gè) bean 標(biāo)簽皱炉。value 屬性指定 bean 的 id怀估,默認(rèn)使用當(dāng)前類首字母小寫的類名。

    @Controller合搅,@Service多搀,@Repository 都是 @Component 的衍生注解,作用及屬性都一模一樣灾部,只是提供了更明確的語(yǔ)義康铭,@Controller 用于表現(xiàn)層,@Service用于業(yè)務(wù)層赌髓,@Repository用于持久層从藤。

    如果想注入第三方類又沒有源碼,就沒法使用 @Component锁蠕,需要用 @Bean夷野。被 @Bean 注解的方法返回值是一個(gè)對(duì)象,這個(gè)對(duì)象由 Spring 的 IoC 容器管理匿沛,name 屬性用于給對(duì)象指定一個(gè)名稱扫责。


BeanFactory、FactoryBean 和 ApplicationContext 的區(qū)別

BeanFactory 是一個(gè) Bean 工廠逃呼,使用簡(jiǎn)單工廠模式鳖孤,是 Spring IoC 容器頂級(jí)接口,作用是管理 Bean抡笼,包括實(shí)例化苏揣、定位、配置對(duì)象及維護(hù)對(duì)象間的依賴推姻。BeanFactory 屬于延遲加載平匈,適合多例模式。

FactoryBean 是一個(gè)工廠 Bean藏古,使用工廠方法模式增炭,作用是生產(chǎn)其他 Bean 實(shí)例,可以通過實(shí)現(xiàn)該接口來(lái)自定義實(shí)例 Bean 的邏輯拧晕。如果一個(gè) Bean 實(shí)現(xiàn)了這個(gè)接口隙姿,那么它就是創(chuàng)建對(duì)象的工廠 Bean,而不是 Bean 實(shí)例本身厂捞。

ApplicationConext 是 BeanFactory 的子接口输玷,擴(kuò)展了 BeanFactory 的功能,提供了支持國(guó)際化文本消息靡馁,統(tǒng)一的資源文件讀取方式等功能欲鹏。Bean 的依賴注入在容器初始化時(shí)就已經(jīng)完成,屬于立即加載臭墨,適合單例模式赔嚎。


注解配置文件

@Configuration 指定當(dāng)前類是一個(gè) Spring 配置類,創(chuàng)建容器時(shí)會(huì)從該類上加載注解胧弛,value 屬性指定配置類的字節(jié)碼尤误。

@ComponentScan 開啟組件掃描,basePackages 屬性指定要掃描的包叶圃。

@PropertySource 用于加載 properties 文件中的配置袄膏。

@Import 導(dǎo)入其他配置類,有 @Import 的是父配置類掺冠,引入的是子配置類沉馆,value 屬性指定其他配置類的字節(jié)碼。


Spring AOP ?

AOP

AOP 面向切面編程德崭,將代碼中重復(fù)的部分抽取出來(lái)斥黑,使用動(dòng)態(tài)代理技術(shù),在不修改源碼的基礎(chǔ)上對(duì)方法進(jìn)行增強(qiáng)眉厨。

如果目標(biāo)對(duì)象實(shí)現(xiàn)了接口锌奴,默認(rèn)采用 JDK 動(dòng)態(tài)代理,也可以強(qiáng)制使用 CGLib憾股;如果目標(biāo)對(duì)象沒有實(shí)現(xiàn)接口鹿蜀,采用 CGLib 的方式箕慧。

常用場(chǎng)景包括權(quán)限認(rèn)證、自動(dòng)緩存茴恰、錯(cuò)誤處理颠焦、日志、調(diào)試和事務(wù)等往枣。


相關(guān)注解

@Aspect:聲明被注解的類是一個(gè)切面 Bean伐庭。

@Before:前置通知,指在某個(gè)連接點(diǎn)之前執(zhí)行的通知分冈。

@After:后置通知圾另,指某個(gè)連接點(diǎn)退出時(shí)執(zhí)行的通知(不論正常返回還是異常退出)。

@AfterReturning:返回后通知雕沉,指某連接點(diǎn)正常完成之后執(zhí)行的通知集乔,返回值使用 returning 屬性接收。

@AfterThrowing:異常通知蘑秽,指方法異常退出時(shí)執(zhí)行的通知饺著,和 @AfterReturning 只會(huì)有一個(gè)執(zhí)行,異常使用 throwing 屬性接收肠牲。


相關(guān)術(shù)語(yǔ)

Aspect:切面幼衰,一個(gè)關(guān)注點(diǎn)的模塊化,這個(gè)關(guān)注點(diǎn)可能會(huì)橫切多個(gè)對(duì)象缀雳。

Joinpoint:連接點(diǎn)渡嚣,程序執(zhí)行過程中的某一行為,即業(yè)務(wù)層中的所有方法肥印。

Advice:通知识椰,指切面對(duì)于某個(gè)連接點(diǎn)所產(chǎn)生的動(dòng)作,包括前置通知深碱、后置通知腹鹉、返回后通知、異常通知和環(huán)繞通知敷硅。

Pointcut:切入點(diǎn)功咒,指被攔截的連接點(diǎn),切入點(diǎn)一定是連接點(diǎn)绞蹦,但連接點(diǎn)不一定是切入點(diǎn)力奋。

Proxy:代理,Spring AOP 中有 JDK 動(dòng)態(tài)代理和 CGLib 代理幽七,目標(biāo)對(duì)象實(shí)現(xiàn)了接口時(shí)采用 JDK 動(dòng)態(tài)代理景殷,反之采用 CGLib 代理。

Target:代理的目標(biāo)對(duì)象,指一個(gè)或多個(gè)切面所通知的對(duì)象猿挚。

Weaving :織入咐旧,指把增強(qiáng)應(yīng)用到目標(biāo)對(duì)象來(lái)創(chuàng)建代理對(duì)象的過程。


Spring MVC ?

處理流程

Web 容器啟動(dòng)時(shí)初始化 IoC 容器亭饵,加載 Bean 的定義信息并初始化所有單例 Bean休偶,遍歷容器中的 Bean梁厉,獲取每個(gè) Controller 中的所有方法訪問的 URL辜羊,將 URL 和對(duì)應(yīng)的 Controller 保存到一個(gè) Map 集合中。

所有的請(qǐng)求會(huì)轉(zhuǎn)發(fā)給 DispatcherServlet 處理词顾,DispatcherServlet 會(huì)請(qǐng)求 HandlerMapping 找出容器中被 @Controler 修飾的 Bean 以及被 @RequestMapping 修飾的方法和類八秃,生成 Handler 和 HandlerInterceptor 并以一個(gè) HandlerExcutionChain 鏈的形式返回。

DispatcherServlet 使用 Handler 找到對(duì)應(yīng)的 HandlerApapter祷肯,通過 HandlerApapter 調(diào)用 Handler 的方法抵屿,將請(qǐng)求參數(shù)綁定到方法的形參上考廉,執(zhí)行方法處理請(qǐng)求并得到邏輯視圖 ModelAndView。

使用 ViewResolver 解析 ModelAndView 得到物理視圖 View骤肛,進(jìn)行視圖渲染,將數(shù)據(jù)填充到視圖中并返回給客戶端窍蓝。


組件

DispatcherServlet:前端控制器腋颠,整個(gè)流程控制的核心,負(fù)責(zé)接收請(qǐng)求并轉(zhuǎn)發(fā)給對(duì)應(yīng)的處理組件吓笙。

Handler:處理器淑玫,完成具體業(yè)務(wù)邏輯。

HandlerMapping:處理器映射器面睛,完成 URL 到 Controller 映射絮蒿。

HandlerInterceptor:處理器攔截器,如果需要完成攔截處理可以實(shí)現(xiàn)該接口叁鉴。

HandlerExecutionChain:處理器執(zhí)行鏈土涝,包括 Handler 和 HandlerInterceptor。

HandlerAdapter:處理器適配器幌墓,DispatcherServlet 通過 HandlerAdapter 來(lái)執(zhí)行不同的 Handler但壮。

ModelAndView:邏輯視圖,裝載模型數(shù)據(jù)信息克锣。

ViewResolver:視圖解析器茵肃,將邏輯視圖解析為物理視圖。


相關(guān)注解

@RequtestMapping:將 URL 請(qǐng)求和方法映射起來(lái)袭祟,在類和方法定義上都可以添加验残。value 屬性指定 URL 請(qǐng)求的地址。method 屬性限制請(qǐng)求類型巾乳,如果沒有使用指定方法請(qǐng)求 URL您没,會(huì)報(bào) 405 錯(cuò)誤鸟召。params 屬性限制必須提供的參數(shù)。

@RequestParam:如果 Controller 方法的形參和 URL 參數(shù)名不一致可以使用該注解綁定氨鹏。value 屬性表示 HTTP 請(qǐng)求中的參數(shù)名欧募,required 屬性設(shè)置參數(shù)是否必要,默認(rèn)false仆抵。defaultValue 屬性指定沒有給參數(shù)賦值時(shí)的默認(rèn)值跟继。

@PathVariable:Spring MVC 支持 RESTful 風(fēng)格 URL,通過 @PathVariable 完成參數(shù)綁定镣丑。


Spring Data JPA

ORM

Object-Relational Mapping 舔糖,表示對(duì)象關(guān)系映射,映射的不只是對(duì)象的值還有對(duì)象之間的關(guān)系莺匠,通過 ORM 就可以把對(duì)象映射到關(guān)系型數(shù)據(jù)庫(kù)中金吗。操作實(shí)體類就相當(dāng)于操作數(shù)據(jù)庫(kù)表,可以不再重點(diǎn)關(guān)注 SQL 語(yǔ)句趣竣。


JPA 的使用

只需要持久層接口繼承 JpaRepository 即可摇庙,泛型參數(shù)列表中第一個(gè)參數(shù)是實(shí)體類類型,第二個(gè)參數(shù)是主鍵類型遥缕。

運(yùn)行時(shí)通過 JdkDynamicAopProxyinvoke 方法創(chuàng)建了一個(gè)動(dòng)態(tài)代理對(duì)象 SimpleJpaRepository卫袒,SimpleJpaRepository 中封裝了 JPA 的操作,通過 hibernate 完成數(shù)據(jù)庫(kù)操作通砍。


實(shí)體類相關(guān)注解

@Entity:表明當(dāng)前類是一個(gè)實(shí)體類玛臂。

@Table :關(guān)聯(lián)實(shí)體類和數(shù)據(jù)庫(kù)表。

@Column :關(guān)聯(lián)實(shí)體類屬性和數(shù)據(jù)庫(kù)表中字段封孙。

@Id :聲明當(dāng)前屬性為數(shù)據(jù)庫(kù)表主鍵對(duì)應(yīng)的屬性迹冤。

@GeneratedValue: 配置主鍵生成策略。

@OneToMany :配置一對(duì)多關(guān)系虎忌,mappedBy 屬性值為主表實(shí)體類在從表實(shí)體類中對(duì)應(yīng)的屬性名泡徙。

@ManyToOne :配置多對(duì)一關(guān)系,targetEntity 屬性值為主表對(duì)應(yīng)實(shí)體類的字節(jié)碼膜蠢。

@JoinColumn:配置外鍵關(guān)系堪藐,name 屬性值為外鍵名稱,referencedColumnName 屬性值為主表主鍵名稱挑围。


對(duì)象導(dǎo)航查詢

通過 get 方法查詢一個(gè)對(duì)象的同時(shí)礁竞,通過此對(duì)象可以查詢它的關(guān)聯(lián)對(duì)象。

對(duì)象導(dǎo)航查詢一到多默認(rèn)使用延遲加載杉辙, 關(guān)聯(lián)對(duì)象是多個(gè)對(duì)象模捂,使用立即加載可能浪費(fèi)資源;對(duì)象導(dǎo)航查詢多到一默認(rèn)使用立即加載。

實(shí)體類注解的 fetch 屬性表示加載方式狂男,LAZY 是延遲加載综看,EAGER 是立即加載。


Mybatis?

XML 標(biāo)簽

select岖食、insert红碑、updatedelete 標(biāo)簽分別對(duì)應(yīng)查詢泡垃、添加析珊、更新、刪除操作兔毙。

parameterType 屬性表示參數(shù)的數(shù)據(jù)類型唾琼,包括基本數(shù)據(jù)類型和對(duì)應(yīng)的包裝類型、String 和 Java Bean 類型澎剥,當(dāng)有多個(gè)參數(shù)時(shí)可以使用 #{argn} 的形式表示第 n 個(gè)參數(shù)。除了基本數(shù)據(jù)類型都要以全限定類名的形式指定參數(shù)類型赶舆。

resultType 表示返回的結(jié)果類型哑姚,包括基本數(shù)據(jù)類型和對(duì)應(yīng)的包裝類型、String 和 Java Bean 類型芜茵。還可以使用把返回結(jié)果封裝為復(fù)雜類型的 resultMap 叙量。


一級(jí)緩存

一級(jí)緩存是 SqlSession 級(jí)別,默認(rèn)開啟九串。

SqlSession 對(duì)象中有一個(gè) HashMap 緩存數(shù)據(jù)绞佩,不同 SqlSession 間緩存數(shù)據(jù)互不影響。同一個(gè) SqlSession 中執(zhí)行兩次相同的 SQL 語(yǔ)句時(shí)猪钮,第一次執(zhí)行完畢會(huì)將結(jié)果保存在緩存中品山,第二次查詢直接從緩存中獲取。

如果 SqlSession 執(zhí)行了 DML 操作(insert烤低、update肘交、delete),Mybatis 必須將緩存清空保證數(shù)據(jù)有效性扑馁。


二級(jí)緩存

二級(jí)緩存是Mapper 級(jí)別涯呻,默認(rèn)關(guān)閉。

相比于一級(jí)緩存腻要,緩存范圍更大复罐,多個(gè) SqlSession 可以共用二級(jí)緩存,作用域是 Mapper 的同一個(gè) namespace雄家,不同 SqlSession 兩次執(zhí)行相同的 namespace 下的 SQL 語(yǔ)句效诅,參數(shù)也相等,則第一次執(zhí)行成功后會(huì)將數(shù)據(jù)保存在二級(jí)緩存中。

需要在全局配置文件中配置 <setting name="cacheEnabled" value="true"/> 填帽,并在對(duì)應(yīng)的映射文件中配置 <cache/> 標(biāo)簽蛛淋。


#{}${} 的區(qū)別

使用 ${} 相當(dāng)于使用字符串拼接,存在 SQL 注入的風(fēng)險(xiǎn)篡腌。

使用 #{} 相當(dāng)于使用占位符褐荷,可以防止 SQL 注入,不支持使用占位符的地方就只能使用 ${} 嘹悼,典型情況就是動(dòng)態(tài)參數(shù)叛甫。


SpringBoot?

優(yōu)點(diǎn)

簡(jiǎn)化開發(fā):它的作用就是快速搭建 Spring 框架。

簡(jiǎn)化配置:比如要?jiǎng)?chuàng)建一個(gè) web 項(xiàng)目杨伙,在使用 Spring 的時(shí)候其监,需要在 pom 文件中添加多個(gè)依賴,而在 SpringBoot 中只需要添加一個(gè) starter-web 依賴即可限匣。

簡(jiǎn)化部署:使用 Spring 時(shí)需要部署 tomcat抖苦,然后把項(xiàng)目打成 war 包。而 SpringBoot 內(nèi)嵌了 tomcat米死,只需要將項(xiàng)目打成 jar 包即可锌历。


注解

@SpringBootApplication:自動(dòng)給程序進(jìn)行必要配置,這個(gè)配置等同于:@Configuration 峦筒,@EnableAutoConfiguration@ComponentScan 三個(gè)配置究西。

@EnableAutoConfiguration:允許 SpringBoot 自動(dòng)配置注解,開啟后 SpringBoot 就能根據(jù)當(dāng)前類路徑下的包或者類來(lái)配置 Bean物喷。

@SpringBootConfiguration:相當(dāng)于 @Configuration卤材,只是語(yǔ)義不同。


SpringCloud?

微服務(wù)的優(yōu)點(diǎn)

各個(gè)服務(wù)的開發(fā)峦失、測(cè)試扇丛、部署都相互獨(dú)立,用戶服務(wù)可以拆分為獨(dú)立服務(wù)宠进,如果用戶量很大晕拆,可以很容易對(duì)其實(shí)現(xiàn)負(fù)載。

當(dāng)新需求出現(xiàn)時(shí)材蹬,使用微服務(wù)不再需要考慮各方面的問題实幕,例如兼容性、影響度等堤器。

使用微服務(wù)拆分項(xiàng)目后昆庇,各個(gè)服務(wù)之間消除了很多限制,只需要保證對(duì)外提供的接口正痴⒗#可用整吆,而不限制語(yǔ)言和框架等選擇拱撵。


服務(wù)治理 Eureka

服務(wù)治理由三部分組成:服務(wù)提供者、服務(wù)消費(fèi)者表蝙、注冊(cè)中心拴测。

服務(wù)注冊(cè):在分布式系統(tǒng)架構(gòu)中,每個(gè)微服務(wù)在啟動(dòng)時(shí)府蛇,將自己的信息存儲(chǔ)在注冊(cè)中心集索。

服務(wù)發(fā)現(xiàn):服務(wù)消費(fèi)者從注冊(cè)中心獲取服務(wù)提供者的網(wǎng)絡(luò)信息,通過該信息調(diào)用服務(wù)汇跨。

Spring Cloud 的服務(wù)治理使用 Eureka 實(shí)現(xiàn)务荆,Eureka 是 Netflix 開源的基于 REST 的服務(wù)治理解決方案,Spring Cloud 集成了 Eureka穷遂,提供服務(wù)注冊(cè)和服務(wù)發(fā)現(xiàn)的功能函匕,可以和基于 Spring Boot 搭建的微服務(wù)應(yīng)用輕松完成整合。


服務(wù)網(wǎng)關(guān) Zuul

Spring Cloud 集成了 Zuul 組件蚪黑,實(shí)現(xiàn)服務(wù)網(wǎng)關(guān)盅惜。

Zuul 是 Netflix 提供的一個(gè)開源的 API 網(wǎng)關(guān)服務(wù)器,是客戶端和網(wǎng)站后端所有請(qǐng)求的中間層祠锣,對(duì)外開放一個(gè) API酷窥,將所有請(qǐng)求導(dǎo)入統(tǒng)一的入口,屏蔽了服務(wù)端的具體實(shí)現(xiàn)邏輯伴网,可以實(shí)現(xiàn)方向代理功能,在網(wǎng)關(guān)內(nèi)部實(shí)現(xiàn)動(dòng)態(tài)路由妆棒、身份認(rèn)證澡腾、IP過濾、數(shù)據(jù)監(jiān)控等糕珊。


負(fù)載均衡 Ribbon

Ribbon 是 Netflix 發(fā)布的均衡負(fù)載器动分,Spring Cloud 集成了 Ribbon,提供用于對(duì) HTTP 請(qǐng)求進(jìn)行控制的負(fù)載均衡客戶端红选。

在注冊(cè)中心對(duì) Ribbon 進(jìn)行注冊(cè)之后澜公,Ribbon 就可以基于某種負(fù)載均衡算法(輪循、隨機(jī)喇肋、加權(quán)輪詢坟乾、加權(quán)隨機(jī)等)自動(dòng)幫助服務(wù)消費(fèi)者調(diào)用接口,開發(fā)者也可以根據(jù)具體需求自定義 Ribbon 負(fù)載均衡算法甚侣。實(shí)際開發(fā)中 Spring Clooud Ribbon 需要結(jié)合 Spring Cloud Eureka 使用间学,Eureka 提供所有可以調(diào)用的服務(wù)提供者列表印荔,Ribbon 基于特定的負(fù)載均衡算法從這些服務(wù)提供者中選擇要調(diào)用的實(shí)例。


聲明式接口調(diào)用 Feign

Feign 是 Netflix 提供的详羡,一個(gè)聲明式仍律、模板化的 Web Service 客戶端实柠,簡(jiǎn)化了開發(fā)者編寫 Web 客戶端的操作,開發(fā)者可以通過簡(jiǎn)單的接口和注解來(lái)調(diào)用 HTTP API主到。

相比于 Ribbon + RestTemplate 的方式茶行,F(xiàn)eign 可以大大簡(jiǎn)化代碼開發(fā),支持多種注解登钥,包括 Feign 注解、Spring MVC 注解等牧牢。

RestTemplate 是 Spring 框架提供的基于 REST 的服務(wù)組件,底層是對(duì) HTTP 請(qǐng)求及響應(yīng)進(jìn)行了封裝伯铣,提供了很多訪問 REST 服務(wù)的方法轮纫,簡(jiǎn)化代碼開發(fā)。


服務(wù)配置 Config

Spring Cloud Config 通過服務(wù)端可以為多個(gè)客戶端提供配置服務(wù)掌唾,既可以將配置文件存儲(chǔ)在本地,也可以將配置文件存儲(chǔ)在遠(yuǎn)程的 Git 倉(cāng)庫(kù)凭语,創(chuàng)建 Config Server撩扒,通過它管理所有的配置文件。


服務(wù)跟蹤 Zipkin

Spring Cloud Zipkin 是一個(gè)可以采集并跟蹤分布式系統(tǒng)中請(qǐng)求數(shù)據(jù)的組件炒辉,讓開發(fā)者更直觀地監(jiān)控到請(qǐng)求在各個(gè)微服務(wù)耗費(fèi)的時(shí)間挽拔,Zipkin 包括兩部分 Zipkin Server 和 Zipkin Client。


服務(wù)熔斷 Hystrix

熔斷器的作用:在不改變各個(gè)微服務(wù)調(diào)用關(guān)系的前提下螃诅,針對(duì)錯(cuò)誤情況進(jìn)行預(yù)先處理。

設(shè)計(jì)原則:服務(wù)隔離倘是、服務(wù)降級(jí)、熔斷機(jī)制搀崭、提供實(shí)時(shí)監(jiān)控和報(bào)警功能、提供實(shí)時(shí)配置修改功能瘤睹。

Hystrix 數(shù)據(jù)監(jiān)控需要結(jié)合 Spring Boot Actuator 使用,Actuator 提供了對(duì)服務(wù)的數(shù)據(jù)監(jiān)控驴党、數(shù)據(jù)統(tǒng)計(jì)获茬,可以通過 hystirx-stream 節(jié)點(diǎn)獲取監(jiān)控的請(qǐng)求數(shù)據(jù),同時(shí)提供了可視化監(jiān)控界面鹏氧。


參考資料

[1] # SpringMVC常用注解整理

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末佩谣,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子笨篷,更是在濱河造成了極大的恐慌瓣履,老刑警劉巖练俐,帶你破解...
    沈念sama閱讀 206,013評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件腺晾,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡归形,警方通過查閱死者的電腦和手機(jī)鼻由,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門厚棵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蔼紧,“玉大人,你說我怎么就攤上這事彬犯〔榈酰” “怎么了?”我有些...
    開封第一講書人閱讀 152,370評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵宋列,是天一觀的道長(zhǎng)箭阶。 經(jīng)常有香客問我,道長(zhǎng)嘹叫,這世上最難降的妖魔是什么诈乒? 我笑而不...
    開封第一講書人閱讀 55,168評(píng)論 1 278
  • 正文 為了忘掉前任怕磨,我火速辦了婚禮,結(jié)果婚禮上肠鲫,老公的妹妹穿的比我還像新娘。我一直安慰自己捞高,他們只是感情好渣锦,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,153評(píng)論 5 371
  • 文/花漫 我一把揭開白布袋毙。 她就那樣靜靜地躺著,像睡著了一般听盖。 火紅的嫁衣襯著肌膚如雪裂七。 梳的紋絲不亂的頭發(fā)上月幌,一...
    開封第一講書人閱讀 48,954評(píng)論 1 283
  • 那天扯躺,我揣著相機(jī)與錄音,去河邊找鬼倍啥。 笑死澎埠,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蒲稳。 我是一名探鬼主播,決...
    沈念sama閱讀 38,271評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼剩胁,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼昵观!你這毒婦竟也來(lái)了舌稀?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,916評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤觉至,失蹤者是張志新(化名)和其女友劉穎睡腿,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嫉到,經(jīng)...
    沈念sama閱讀 43,382評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡何恶,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,877評(píng)論 2 323
  • 正文 我和宋清朗相戀三年细层,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片疫赎。...
    茶點(diǎn)故事閱讀 37,989評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡捧搞,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出胎撇,到底是詐尸還是另有隱情,我是刑警寧澤姻采,帶...
    沈念sama閱讀 33,624評(píng)論 4 322
  • 正文 年R本政府宣布爵憎,位于F島的核電站,受9級(jí)特大地震影響刑棵,放射性物質(zhì)發(fā)生泄漏席函。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,209評(píng)論 3 307
  • 文/蒙蒙 一正蛙、第九天 我趴在偏房一處隱蔽的房頂上張望营曼。 院中可真熱鬧,春花似錦锻全、人聲如沸录煤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至萝勤,卻和暖如春呐伞,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背伶氢。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工鞍历, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人劣砍。 一個(gè)月前我還...
    沈念sama閱讀 45,401評(píng)論 2 352
  • 正文 我出身青樓刑枝,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親装畅。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,700評(píng)論 2 345