職場打拼那些事?
作為程式設計師,當然是不斷學習,才能使自己慢慢變強大!
在無數個「撐不下去」的時候,我的「治癒系」當然也是學習了!
之前有人問我,你用過dubbo嗎?嗯,額,我說,沒了解過。
那你知道SpringCloud嗎?嗯,額,我說,我聽說過,好像是微服務用到的一種技術框架。
哎,為了下次有人跟我聊起dubbo,我能不再像便秘一樣,嗯……額……於是,我決定學習dubbo!先去B站看了視頻,然後網上找來資料,終於把dubbo是什麼以及怎麼用了解清楚了。今天就把新學的dubbo的那些事和大家一起探討一下。
Dubbo是一個分布式、高性能、透明化的RPC服務框架,提供服務自動註冊、自動發現等高效服務治理方案,可以和Spring框架無縫集成。
這句話有5個點要掌握:
透明化的遠程方法調用,就像調用本地方法一樣調用遠程方法,只需簡單配置,沒有任何API侵入。
軟負載均衡及容錯機制,可在內網替代F5等硬體負載均衡器,降低成本,減少單點。(F5負載均衡器我也是百度來的)。
服務自動註冊與發現,不再需要寫死服務提供方地址,註冊中心基於接口名查詢服務提供者的IP位址,並且能夠平滑添加或刪除服務提供者。
這張圖是在dubbo官網上下載的:
流程說明:
0.Provider(提供者)綁定指定埠並啟動服務;
1.提供者連接註冊中心,並發送本機IP、埠、應用信息和提供服務信息至註冊中心存儲;
2.Consumer(消費者),訂閱註冊中心 ,並發送應用信息、所求服務信息至註冊中心;
3.註冊中心根據消費者所求服務信息匹配對應的提供者列表發送至Consumer應用緩存。
4.Consumer在發起遠程調用時基於緩存的提供者列表擇其一發起調用;
5.消費者調用服務次數count等信息,定時發送到監控中心用於監控。
注意兩點:
第3步,Provider狀態變更會實時通知註冊中心、註冊中心是基於長連接推送變更給Consumer。
註冊中心始終不代替調用者發送請求到服務提供者,它只是告訴調用者服務方地址,調用方根據具體地址請求服務,即第4步的invoke。
答案是:可以的。
因為啟動dubbo時,消費者會從zookeeper拉取註冊的生產者的地址接口等數據,緩存在本地。實際上每次調用時,都是按照本地緩存中存儲的地址進行調用,此時並沒有用到註冊中心。
所以說註冊中心集群全部掛掉是不要緊的,但前提是服務提供者沒有增加新的服務,如果要調用新的服務,本地緩存是辦不到的。
在集群調用失敗時,Dubbo 提供了多種容錯方案,預設為 failover 重試
提到Dubbo,一般都會和Spring Cloud作比較,因為他們兩個都能解決RPC問題。Dubbo是一個分布式服務框架,而SpringCloud是一個分布式的整體解決方案。兩者區別如下:
Dubbo和SpringCloud最大的區別:Dubbo底層是使用Netty這樣的NIO框架,是基於TCP協議傳輸的,配合以Hession序列化完成RPC通信。
而SpringCloud是基於Http協議+Rest接口調用遠程過程的通信,相對來說,Http請求會有更大的報文,佔的帶寬也會更多。但是REST相比RPC更為靈活,服務提供方和調用方的依賴只依靠一紙契約,不存在代碼級別的強依賴。
1)、服務提供者:
1.創建一個服務提供者provider
2.引入dubbo和zookeeper依賴
<!-- Dubbo Spring Boot Starter --> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>2.7.7</version> </dependency><!-- https://mvnrepository.com/artifact/com.github.sgroschupf/zkclient --><dependency> <groupId>com.github.sgroschupf</groupId> <artifactId>zkclient</artifactId> <version>0.1</version></dependency>
3.在application.yml中配置dubbo的掃描包和註冊中心地址(zookeeper我用的是公司服務,具體安裝啟用這裡不做介紹):
Dubbo.application.name=ticket#地址寫zookeeper服務地址,我用的公司的服務,這裡隨便寫一下Dubbo.registery.address=zookeeper://127.0.0.1:2181Dubbo.scan.base.package=com.bill99.ticket.service
4.將provider註冊到註冊中心zookeeper中,provider的服務提供者添加dubbo的@service註解
public interface TicketService{ public String getTicket();}@Component//註冊到Spring容器中@Service//注意是dubbo的Service,不是Spring的Servicepublic class TicketServiceImpl implements TicketService{ @Override public String getTicket() { return "《八佰》"; }}
2)、調用方:
1.創建一個客戶端consumer,和provider一樣,引入dubbo和zookeeper依賴
2.consumer引用服務,添加@Reference註解
@Servicepublic class UserService{@Reference private TicketService ticketService;//注意:前面說dubbo對代碼有強依賴,就是指這裡 //實際應用中provider和consumer是在兩個工程,那麼兩邊都必須有相同類路徑的TicketService接口 public void hello(){ System.out.println("買到票了,"+ticketService.getTicket()); }}
3.在application.yml中配置註冊中心地址
Dubbo.application.name=userDubbo.registery.address=zookeeper://127.0.0.1:2181
3)、編寫測試類,調用UserService.hello()方法。
完結撒花!!!