国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

微服務(wù)必須具備的 3 個基本功能!

開發(fā) 后端
在我們對微服務(wù)架構(gòu)有了整體的認(rèn)識,并且具備了服務(wù)化的前提后,一個完整的微服務(wù)請求需要涉及到哪些內(nèi)容呢?一起來看看吧。

[[403423]]

 在我們對微服務(wù)架構(gòu)有了整體的認(rèn)識,并且具備了服務(wù)化的前提后,一個完整的微服務(wù)請求需要涉及到哪些內(nèi)容呢?

這其中包括了微服務(wù)框架所具備的三個基本功能:

  •  服務(wù)的發(fā)布與引用
  •  服務(wù)的注冊與發(fā)現(xiàn)
  • 服務(wù)的遠(yuǎn)程通信

服務(wù)的發(fā)布與引用

首先我們面臨的第一個問題是,如何發(fā)布服務(wù)和引用服務(wù)。具體一點(diǎn)就是,這個服務(wù)的接口名是啥,有哪些參數(shù),返回值是什么類型等等,通常也就是接口描述信息。

常見的發(fā)布和引用的方式包括:

  •  RESTful API / 聲明式Restful API
  •  XML
  •  IDL

一般來講,不管使用哪種方式,服務(wù)端定義接口與實(shí)現(xiàn)接口都是必要的,例如: 

  1. @exa(id = "xxx" 
  2. public interface testApi {  
  3.     @PostMapping(value = "/soatest/{id}" 
  4.     String getResponse(@PathVariable(value = "id") final Integer index, @RequestParam(value = "str") final String Data);  
  5.     }  

具體實(shí)現(xiàn)如下: 

  1. public class testApiImpl implements testApi{  
  2.     @Override  
  3.     String getResponse(final Integer index, final String Data){  
  4.         return "ok"; 
  5.      }      

聲明式Restful API

這種常使用HTTP或者HTTPS協(xié)議調(diào)用服務(wù),相對來說,性能稍差。

首先服務(wù)端如上定義接口并實(shí)現(xiàn)接口,隨后服務(wù)提供者可以使用類似restEasy這樣的框架通過servlet的方式發(fā)布服務(wù),而服務(wù)消費(fèi)者直接引用定義的接口調(diào)用。

除此之外還有一種類似feign的方式,即服務(wù)端的發(fā)布依賴于springmvc controller,框架只基于客戶端模板化http請求調(diào)用。這種情況下需接口定義與服務(wù)端controller協(xié)商一致,這樣客戶端直接引用接口發(fā)起調(diào)用即可。

XML

使用私有rpc協(xié)議的都會選擇xml配置的方式來描述接口,比較高效,例如dubbo、motan等。

同樣服務(wù)端如上定義接口并實(shí)現(xiàn)接口,服務(wù)端通過server.xml將文件接口暴露出去。服務(wù)消費(fèi)者則通過client.xml引用需要調(diào)用的接口。

但這種方式對業(yè)務(wù)代碼入侵較高,xml配置有變更時候,服務(wù)消費(fèi)者和服務(wù)提供者都需要更新。

IDL

IDL是接口描述語言,常用于跨語言之間的調(diào)用,最常用的IDL包括Thrift協(xié)議以及gRpc協(xié)議。例如gRpc協(xié)議使用Protobuf來定義接口,寫好一個proto文件后,利用語言對應(yīng)的protoc插件生成對應(yīng)server端與client端的代碼,便可直接使用。

但是如果參數(shù)字段非常多,proto文件會顯得非常大難以維護(hù)。并且如果字段經(jīng)常需要變更,例如刪除字段,PB就無法做到向前兼容。

一些tips

不管哪種方式,在接口變更的時候都需要通知服務(wù)消費(fèi)者。消費(fèi)者對api的強(qiáng)依賴性是很難避免的,接口變更引起的各種調(diào)用失敗也十分常見。所以如果有變更,盡量使用新增接口的方式,或者給每個接口定義好版本號吧。

在使用上,大多數(shù)人的選擇是對外Restful,對內(nèi)Xml,跨語言IDL。

一些問題

在實(shí)際的服務(wù)發(fā)布與引用的落地上,還會存在很多問題,大多和配置信息相關(guān)。例如一個簡單的接口調(diào)用超時時間配置,這個配置應(yīng)該配在服務(wù)級別還是接口級別?是放在服務(wù)提供者這邊還是服務(wù)消費(fèi)者這邊?

在實(shí)踐中,大多數(shù)服務(wù)消費(fèi)者會忽略這些配置,所以服務(wù)提供者自身提供默認(rèn)的配置模板是有必要的,相當(dāng)于一個預(yù)定義的過程。每個服務(wù)消費(fèi)者在繼承服務(wù)提供者預(yù)定義好的配置后,還需要能夠進(jìn)行自定義的配置覆蓋。

但是,比方說一個服務(wù)有100個接口,每個接口都有自身的超時配置,而這個服務(wù)又有100個消費(fèi)者,當(dāng)服務(wù)節(jié)點(diǎn)發(fā)生變更的時候,就會發(fā)生100*100次注冊中心的消息通知,這是比較可怕的,就有可能引起網(wǎng)絡(luò)風(fēng)暴。

服務(wù)的注冊與發(fā)現(xiàn)

假設(shè)你已經(jīng)發(fā)布了服務(wù),并在一臺機(jī)器上部署了服務(wù),那么消費(fèi)者該怎樣找到你的服務(wù)的地址呢?

也許有人會說是DNS,但DNS有許多缺陷:

  •  維護(hù)麻煩,更新延遲
  •  無法在客戶端做負(fù)載均衡
  •  不能做到端口級別的服務(wù)發(fā)現(xiàn)

其實(shí)在分布式系統(tǒng)中,有個很重要的角色,叫注冊中心,便是用于解決該問題。

使用注冊中心尋址并調(diào)用的過程如下:

  •  服務(wù)啟動時,向注冊中心注冊自身,并定期發(fā)送心跳匯報存活狀態(tài)。
  •  客戶端調(diào)用服務(wù)時,向注冊中心訂閱服務(wù),并將節(jié)點(diǎn)列表緩存至本地,再與服務(wù)端建立連接(當(dāng)然這兒可以lazy load)。發(fā)起調(diào)用時,在本地緩存節(jié)點(diǎn)列表中,基于負(fù)載均衡算法選取一臺服務(wù)端發(fā)起調(diào)用。
  •  當(dāng)服務(wù)端節(jié)點(diǎn)發(fā)生變更,注冊中心能感知到后通知到客戶端。

注冊中心的實(shí)現(xiàn)主要需要考慮以下這些問題:

  •  自身一致性與可用性
  •  注冊方式
  •  存儲結(jié)構(gòu)
  •  服務(wù)健康監(jiān)測
  •  狀態(tài)變更通知

一致性與可用性

一個老舊的命題,即分布式系統(tǒng)中的CAP(一致性、可用性、分區(qū)容錯性)。我們知道同時滿足CAP是不可能的,那么便需要有取舍。常見的注冊中心大致分為CP注冊中心以及AP注冊中心。

CP注冊中心

比較典型的就是zookeeper、etcd以及consul了,犧牲可用性來保證了一致性,通過zab協(xié)議或者raft協(xié)議來保證一致性。

AP注冊中心

犧牲一致性來保證可用性,感覺只能列出eureka了。eureka每個服務(wù)器單獨(dú)保存節(jié)點(diǎn)列表,可能會出現(xiàn)不一致的情況。關(guān)注公眾號Java技術(shù)棧,在后臺回復(fù):cloud,可以獲取我整理的 Spring Cloud 系列教程,非常齊全。

從理論上來說,僅用于注冊中心,AP型是遠(yuǎn)比CP型合適的。可用性的需求遠(yuǎn)遠(yuǎn)高于一致性,一致性只要保證最終一致即可,而不一致的時候還可以使用各種容錯策略進(jìn)行彌補(bǔ)。

保障高可用性其實(shí)還有很多辦法,例如集群部署或者多IDC部署等。Consul就是多IDC部署保障可用性的典型例子,它使用了wan gossip來保持跨機(jī)房狀態(tài)同步。

注冊方式

有兩種與注冊中心交互的方式,一種是通過應(yīng)用內(nèi)集成sdk,另一種則是通過其他方式在應(yīng)用外間接與注冊中心交互。Spring Boot 系列教程整理好了:https://github.com/javastacks/spring-boot-best-practice

應(yīng)用內(nèi)

這應(yīng)該就是最常見的方式了,客戶端與服務(wù)端都集成相關(guān)sdk與注冊中心進(jìn)行交互。例如選擇zookeeper作為注冊中心,那么就可以使用curator sdk進(jìn)行服務(wù)的注冊與發(fā)現(xiàn)。

應(yīng)用外

consul提供了應(yīng)用外注冊的解決方案,consul agent或者第三方Registrator可以監(jiān)聽服務(wù)狀態(tài),從而負(fù)責(zé)服務(wù)提供者的注冊或銷毀。而Consul Template則可以做到定時從注冊中心拉取節(jié)點(diǎn)列表,并刷新LB配置(例如通過Nginx的upstream),這樣就相當(dāng)于完成了服務(wù)消費(fèi)者端的負(fù)載均衡。

存儲結(jié)構(gòu)

注冊中心存儲相關(guān)信息一般采取目錄化的層次結(jié)構(gòu),一般分為服務(wù)-接口-節(jié)點(diǎn)信息。

同時注冊中心一般還會進(jìn)行分組,分組的概念很廣,可以是根據(jù)機(jī)房劃分也可以根據(jù)環(huán)境劃分。

節(jié)點(diǎn)信息主要會包括節(jié)點(diǎn)的地址(ip和端口號),還有一些節(jié)點(diǎn)的其他信息,比如請求失敗的重試次數(shù)、超時時間的設(shè)置等等。

當(dāng)然很多時候,其實(shí)可能會把接口這一層給去掉,因為考慮到接口數(shù)量很多的情況下,過多的節(jié)點(diǎn)會造成很多問題,比如之前說的網(wǎng)絡(luò)風(fēng)暴。

服務(wù)健康監(jiān)測

服務(wù)存活狀態(tài)監(jiān)測也是注冊中心的一個必要功能。在zookeeper中,每個客戶端都會與服務(wù)端保持一個長連接,并生成一個session,在session過期周期內(nèi),通過客戶端定時向服務(wù)端發(fā)送心跳包來檢測鏈路是否正常,服務(wù)端則重置下次session的過期時間,如果session過期周期內(nèi)都沒有檢測到客戶端的心跳包,那么就會認(rèn)為它已經(jīng)不可用了,將其從節(jié)點(diǎn)列表中移除。

狀態(tài)變更通知

在注冊中心具備服務(wù)健康檢測能力后,還需要將狀態(tài)變更通知到客戶端。在zookeeper中,可以通過監(jiān)聽器watcher的process方法來獲取服務(wù)變更。

服務(wù)的遠(yuǎn)程通信

在上面,服務(wù)消費(fèi)者已經(jīng)正確引用了服務(wù),并發(fā)現(xiàn)了該服務(wù)的地址,那么如何向這個地址發(fā)起請求呢?要解決服務(wù)間的遠(yuǎn)程通信問題,我們需要考慮一些問題:

  •  網(wǎng)絡(luò)I/O的處理
  •  傳輸協(xié)議
  •  序列化方式

網(wǎng)絡(luò)I/O的處理

簡單來說,就是客戶端是怎么處理請求?服務(wù)端又是怎么處理請求的?關(guān)注公眾號Java技術(shù)棧,在后臺回復(fù):面試,可以獲取我整理的 Java 網(wǎng)絡(luò)編程系列面試題和答案,非常齊全。

先從客戶端來說,我們創(chuàng)建連接的時機(jī)可以是從注冊中心獲取到節(jié)點(diǎn)信息的時候,但更多時候,我們會選擇在第一次請求發(fā)起調(diào)用的時候去創(chuàng)建連接。此外,我們往往會為該節(jié)點(diǎn)維護(hù)一個連接池,進(jìn)行連接復(fù)用。

如果是異步的情況下,我們還需要為每一個請求編號,并維護(hù)一個請求池,從而在響應(yīng)返回時找到對應(yīng)的請求。當(dāng)然這并不是必須的,很多框架會幫我們干好這些事情,比如rxNetty。

從服務(wù)端來說,處理請求的方式就可以追溯到unix的5種IO模型了。我們可以直接使用Netty、MINA等網(wǎng)絡(luò)框架來處理服務(wù)端請求,或者如果你有十分的興趣,可以自己實(shí)現(xiàn)一個通信框架。

傳輸協(xié)議

最常見的當(dāng)然是直接使用Http協(xié)議,使用雙方無需關(guān)注和了解協(xié)議內(nèi)容,方便直接,但自然性能上會有所折損。

還有就是目前比較火熱的http2協(xié)議,擁有二進(jìn)制數(shù)據(jù)、頭部壓縮、多路復(fù)用等許多優(yōu)良特性。但從自身的實(shí)踐上看,http2要走到生產(chǎn)仍有一段距離,一個最簡單的例子,升級到http2后所有的header names都變成小寫,同時不是case-insenstive了,這時候就會有兼容性問題。

當(dāng)然如果追求更高效與可控的傳輸,可以定制私有協(xié)議并基于tcp進(jìn)行傳輸。私有協(xié)議的定制需要通信雙方都了解其特性,設(shè)計上還需要注意預(yù)留好擴(kuò)展字段,以及處理好粘包分包等問題。

序列化方式

在網(wǎng)絡(luò)傳輸?shù)那昂螅夹枰诎l(fā)送端進(jìn)行編碼,在服務(wù)端進(jìn)行解碼,這樣主要是為了在網(wǎng)絡(luò)傳輸時候減少數(shù)據(jù)傳輸量。

常用的序列化方式包括文本類的,例如XML/JSON,還有二進(jìn)制類型的,例如Protobuf/Thrift等。在選擇序列化的考慮上,一是性能,Protobuf的壓縮大小和壓縮速度都會比JSON快很多,性能也更好。二是兼容性上,相對來說,JSON的前后兼容性會強(qiáng)一些,可以用于接口經(jīng)常變化的場景。

在此還是需要強(qiáng)調(diào),使用每一種序列化都需要了解過其特性,并在接口變更的時候拿捏好邊界。例如jackson的FAIL_ON_UNKNOW_PROPERTIES屬性、kryo的CompatibleFieldSerializer、jdk序列化會嚴(yán)格比較serialVersionUID等等。 

 

責(zé)任編輯:龐桂玉 來源: Java技術(shù)棧
相關(guān)推薦

2010-06-28 21:33:17

eMule協(xié)議

2019-04-16 08:21:46

2020-10-19 10:16:02

AWSDynamoDB功能

2010-04-16 09:06:18

WPF 4

2012-10-22 16:47:45

IBMdw

2010-01-05 15:27:04

.NET Framew

2010-03-02 17:43:31

WCF框架處理流程

2019-09-16 08:22:12

特權(quán)訪問管理PAM網(wǎng)絡(luò)安全

2015-07-07 14:17:56

物聯(lián)網(wǎng)操作系統(tǒng)

2011-04-19 10:17:25

2009-03-04 10:30:00

2010-01-20 18:20:50

2023-05-11 08:59:43

Nginx配置服務(wù)器

2010-01-04 10:47:08

智能交換機(jī)

2009-12-03 09:08:21

路由器基本功能

2017-01-15 17:15:27

Java基本功能

2011-04-29 14:04:56

一體機(jī)

2009-12-03 14:10:22

路由器基本功能

2015-11-09 10:34:54

iOS 9.1 iPhone

2009-12-08 13:58:12

Linux操作系統(tǒng)垃圾郵件
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

亚洲一区二区三区精品动漫| 视频国产一区| 亚洲在线观看| 亚洲小视频在线播放| 91在线观看视频| 中文字幕在线国产精品| 国产精品电影一区| 一区二区日韩| 日韩中文字幕视频在线观看| 美女av在线免费看| 欧美一区二区视频免费观看| 三级视频网站在线| 精品国产91久久久久久老师| av超碰在线| 亚洲一卡二卡三卡四卡无卡久久 | 羞羞网站在线免费观看| 色香色香欲天天天影视综合网| 中文日本高清免费| 五月婷婷久久综合| 青青免费在线视频| 欧美日韩色一区| 在线免费av导航| 亚洲成人国产精品| 国产精品一区二区av影院萌芽| 亚洲美女福利视频网站| 国产第一精品| 九九热视频这里只有精品| 亚洲国产中文在线| 日韩免费av在线| 91亚洲国产| 国产区一区二区| 天堂av在线一区| 亚洲啊啊啊啊啊| 不卡视频在线观看| 十八禁视频网站在线观看| 日本一区二区不卡视频| 国产超碰在线观看| 制服丝袜成人动漫| 在线看欧美视频| 欧美大片免费看| 欧美丝袜激情| 精品乱码一区| 丁香啪啪综合成人亚洲小说| 免费一区二区三区在线观看| 岛国精品视频在线播放| 国产99re66在线视频| 精品国产自在精品国产浪潮| 欧美成人午夜77777| 91精品综合久久| 美国av一区二区| 五月天婷婷激情视频| 亚洲国产精品久久久久婷婷884 | 国产精品你懂得| 亚洲国内自拍| 黄黄视频在线观看| 中文字幕一区视频| 黄色软件在线| 视频在线观看99| 久久国产精品亚洲人一区二区三区 | 天天看片激情网站| 7777精品伊人久久久大香线蕉经典版下载 | 日韩男女性生活视频| 亚洲黄色影院| 午夜视频在线瓜伦| 欧美日韩精品专区| 久久亚洲人体| 超碰97在线人人| 丁香六月综合激情| 国产专区在线播放| 久久久精品视频成人| 亚洲国产激情| 99热99在线| 国产丝袜精品视频| 重囗味另类老妇506070| 日本精品一区二区三区四区| 欧美精品久久一区| 亚洲人成精品久久久 | 女人被爽到呻吟gif动态图下载| 日韩视频免费观看高清完整版在线观看 | 亚洲黄色中文字幕| 91精品国产自产在线观看永久| 九色综合狠狠综合久久| 超碰96在线| 亚洲丝袜在线视频| 极品日韩av| 成人网址大全| 在线电影av不卡网址| 欧美日韩岛国| 丁香六月婷婷| 久久影院模特热| 精品一区二区三区不卡 | 欧美lavv| 亚洲国产精品一区二区久久恐怖片| 伊人久久在线| 欧美精品国产精品久久久 | 第一社区sis001原创亚洲| 国产又粗又猛又爽又黄的网站| 色综合天天做天天爱| 日韩一区二区三区精品视频第3页| 精品国产一区二区三区日日嗨| 国产精品护士白丝一区av| jvid一区二区三区| 亚洲午夜激情| 欧美肥胖老妇做爰| 午夜精品偷拍| 中文视频在线| 91成人在线播放| 国产蜜臀97一区二区三区| 成人免费视频观看| av磁力番号网| 亚洲国产欧美在线成人app| 国产一区二区三区久久久久久久久| 在线视频观看你懂的| 78色国产精品| 国产欧美一区二区精品性 | 亚洲精品97久久| 亚洲欧美不卡| 9191在线播放| 日本10禁啪啪无遮挡免费一区二区| 日韩欧美中文在线| 91精品天堂福利在线观看 | 久久青草视频| 日韩久久久久久久久久久久| 亚洲精品自产拍| 国内精品伊人久久久久av影院| 国产丝袜在线观看视频| 欧美午夜精品理论片a级大开眼界| 欧美性猛片xxxx免费看久爱| 婷婷六月综合| 国产69精品久久app免费版| 成人在线精品视频| 欧美日韩亚洲系列| 欧美日韩在线大尺度| 岛国最新视频免费在线观看| 粉嫩高清一区二区三区精品视频 | 久久久精品网| 日韩少妇视频| eeuss中文| 色综合伊人色综合网站| 91丝袜美腿高跟国产极品老师 | 日韩国产欧美精品一区二区三区| 日韩一区欧美二区| 樱花草涩涩www在线播放| www亚洲国产| 久久精视频免费在线久久完整在线看| 91在线观看免费视频| caoporn成人| 波多野结衣av在线| 国产精品免费一区二区| 日韩欧美在线不卡| 久久99久久久欧美国产| 日本黄色一区| free亚洲| 高清视频一区| 精品国产第一区二区三区观看体验| 蜜桃一区二区三区在线| 日本一区二区三区视频在线| 99蜜桃臀久久久欧美精品网站| 国产91|九色| 欧美影视一区二区三区| 精品在线免费观看| jizz国产精品| 黄色小视频在线观看| 天天干天天操天天干天天操| 久久精品成人欧美大片古装| 一区二区三区四区在线免费观看| 亚洲一区二区三区| 国产福利电影在线播放| 日韩免费毛片视频| 国产欧美在线播放| 日韩欧美三级在线| 久久综合狠狠综合久久激情 | 久久久久久91| 午夜精品福利视频网站| 日本亚洲欧美天堂免费| 国产美女亚洲精品7777| 在线观看国产高清视频| 中文字幕欧美日韩一区二区三区 | 欧美三日本三级少妇三99| 一本一本久久a久久精品综合小说| 国产精品天美传媒沈樵| 国内一区二区三区| 国产成人77亚洲精品www| 在线视频手机国产| 麻豆映画在线观看| 国产成人小视频在线观看| 日韩欧美一级片| 国产日本一区二区| 久久成人亚洲| 一个色免费成人影院| 蜜桃视频m3u8在线观看| 天堂影视av| 亚洲国产一二三精品无码| 国产精品久久久久久av| 国产一区二区三区18| 色猫猫国产区一区二在线视频| 96av麻豆蜜桃一区二区| 国产情侣一区| 亚洲精品国产动漫| 欧美一级鲁丝片|