Jmeter中測試Dubbo而開發的插件 Dubbo架構深刻篇----RPC實現總結

Dubbo架構深刻篇----RPC實現總結   http://www.javashuo.com/article/p-xivrtnne-cs.htmlhtml

使用Jmeter測試Dubbo接口  https://blog.51cto.com/6183574/2323194java

用於在Jmeter中測試Dubbo而開發的插件   https://www.ctolib.com/article/comments/87050git

dubbo 分析 https://www.cnblogs.com/xjz1842/category/1331445.htmlgithub

dubbo源碼分析  http://www.javashuo.com/article/p-vasdlwnk-mv.htmlredis

 

如下參考:https://baijiahao.baidu.com/s?id=1595896727290553003&wfr=spider&for=pc算法

Dubbo源碼-從HelloWorld開始

JackieZhengspring

18-03-2516:17

Dubbo簡介express

Dubbo,相信作後端的同窗應該都用過,或者有所耳聞。沒錯,我就是那個有所耳聞中的一員。apache

公司在好幾年前實現了一套本身的RPC框架,因此也就沒有機會使用市面上琳琅滿目的RPC框架產品。後端

之因此想好好看看Dubbo,有如下幾個緣由

公司內部的框架一直在作迭代更新,配置愈來愈簡潔,性能愈來愈好。可是做爲使用者,它就像一個黑盒子,咱們沒法感知其內部的改動以及實現的原理如今使用的框架,由於使用了thrift,讓平時的開發顯得格外的蹩腳,經常在各類model的轉換中迷失自我,耗盡了耐心阿里團隊從去年開始從新維護Dubbo,並在春節之際進入Apache孵化器,在開源的道路上又猛跨一大步,其背後定然有咱們值得學習借鑑的地方,更況且有阿里技術的背書開源項目是很好的學習素材,但願藉助學習Dubbo代碼,瞭解序列化、分佈式、網絡通信等方面的知識Dubbo是Alibaba開源的分佈式服務框架,它最大的特色是按照分層的方式來架構,使用這種方式可使各個層之間解耦合(或者最大限度地鬆耦合)。

GitHub:https://github.com/apache/incubator-dubbo

官網:http://dubbo.apache.org/

中文用戶手冊:http://dubbo.io/books/dubbo-user-book/

HelloWorld以前的兩個小問題

1.沒有Dubbo以前,咱們是什麼樣的工做方式

Dubbo表明的是一類RPC框架,相似的產品還有鼎鼎大名的gRPC。

沒有Dubbo以前是什麼樣的,能夠回想下咱們學生時代作的項目。

一臺電腦既是服務器又是客戶端,估計當時也沒有想過我調用的這個接口是哪臺電腦上,我是否是能夠多部署幾臺電腦,怎麼樣充分利用這幾臺電腦好讓調用的效率更高。

由於即便想了,也搞不了,由於沒錢!

即便咱們在本身的PC上把項目作好了,須要部署到服務器上,那麼咱們只要記住那臺服務器的IP,使用Socket通信,就很簡單的實現了服務的調用和通信了。

2.Dubbo有什麼用

接着學生時代的項目說,那時候咱們作個圖書管理系統,學籍管理系統,其訪問量和併發量通常不會過高,準確說,是很是低。

可是若是仍是一個服務端,大量的用戶請求,達到高併發的場景,那麼問題就來了,一臺機子顯然承受不住,這時候須要考慮分佈式。

Dubbo的產生於微服務聯繫緊密,咱們一方面想着藉助微服務的思想,實現各個服務或者模塊之間的解耦。那麼咱們另外一方面就不能忽視服務之間的通信,這時候Dubbo一類的RPC框架就應運而生。

咱們須要考慮擴展性,好比爲了防止訪問過載,服務所在機器須要進行水平擴展,同時也要考慮不斷增長的服務調用方。

咱們須要考慮負載均衡,怎麼樣才能將服務集羣的威力發揮到最大。

咱們須要考慮如何自動的註冊服務以及更新服務,若是作好異常狀況下,好比註冊中心宕機時,服務方和調用方之間的服務調用。

如此種種,都是催生Dubbo的重要因素。

HelloWorld的準備工做

打開命令行,執行git clone https://github.com/apache/incubator-dubbo.git命令,將遠程項目拉到本地導入項目進IDE,使用mvn clean compile在項目目錄下編譯

下載安裝zookeeper,在命令行執行brew install zookeeper

相應的啓動zk和關閉zk服務的命令分別是zkServer start和zkServer stop

運行HelloWorld

導入Dubbo項目而且完成編譯後,能夠看到Dubbo項目的目錄結構以下

今天要介紹的是dubbo-demo,該子模塊包括

dubbo-demo-api(提取出公共接口)dubbo-demo-consumer(服務調用方)dubbo-demo-provider(服務提供方)dubbo-demo-api

該模塊最核心的類就是DemoService接口,該接口只有一個方法sayHello

package com.alibaba.dubbo.demo;public interface DemoService { String sayHello(String name);}這個接口是聯繫調用方和提供方的紐帶。

dubbo-demo-consumer

該模塊核心的類爲Consumer,主要是一個main函數

public class Consumer { public static void main(String[] args) { //Prevent to get IPV6 address,this way only work in debug mode //But you can pass use -Djava.net.preferIPv4Stack=true,then it work well whether in debug mode or not System.setProperty("java.net.preferIPv4Stack", "true"); ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"META-INF/spring/dubbo-demo-consumer.xml"}); context.start(); DemoService demoService = (DemoService) context.getBean("demoService"); // get remote service proxy while (true) { try { Thread.sleep(1000); String hello = demoService.sayHello("world"); // call remote method System.out.println(hello); // get result } catch (Throwable throwable) { throwable.printStackTrace(); } } }}其主要功能是加載配置文件,用於尋找服務提供方所在的位置,拿到DemoService接口的實現類DemoServiceImpl,並調用其方法實現sayHello

dubbo-demo-provider

該模塊包含了DemoService的實現類DemoServiceImpl,同時包含一個服務啓動類Provider

public class Provider { public static void main(String[] args) throws Exception { //Prevent to get IPV6 address,this way only work in debug mode //But you can pass use -Djava.net.preferIPv4Stack=true,then it work well whether in debug mode or not System.setProperty("java.net.preferIPv4Stack", "true"); ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"META-INF/spring/dubbo-demo-provider.xml"}); context.start(); System.in.read(); // press any key to exit }}啓動註冊中心

由於調用方和服務提供方須要靠註冊中心來聯繫,提供方將本身的服務登記到註冊中心,調用方須要拉取可用的服務提供方的位置信息,比較常見的關係描述以下圖所示

調用關係說明

服務容器負責啓動,加載,運行服務提供者。服務提供者在啓動時,向註冊中心註冊本身提供的服務。服務消費者在啓動時,向註冊中心訂閱本身所需的服務。註冊中心返回服務提供者地址列表給消費者,若是有變動,註冊中心將基於長鏈接推送變動數據給消費者。服務消費者,從提供者地址列表中,基於軟負載均衡算法,選一臺提供者進行調用,若是調用失敗,再選另外一臺調用。服務消費者和提供者,在內存中累計調用次數和調用時間,定時每分鐘發送一次統計數據到監控中心。鑑於Dubbo源碼中,配置文件中的默認配置是multicast,可是我在運行的時候老是出現can’t assign address的狀況,因此改用zookeeper。

相應修改以下,在dubbo-demo-provider項目中,將dubbo-demo-provider.xml修改成

<?xml version="1.0" encoding="UTF-8"?><!--Licensed to the Apache Software Foundation (ASF) under one or morecontributor license agreements. See the NOTICE file distributed withthis work for additional information regarding copyright ownership.The ASF licenses this file to You under the Apache License, Version 2.0(the "License"); you may not use this file except in compliance withthe License. You may obtain a copy of the License at required by applicable law or agreed to in writing, softwaredistributed under the License is distributed on an "AS IS" BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions andlimitations under the License.--><beans xmlns:xsi="; xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xmlns="; xsi:schemaLocation=" http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <!-- provider's application name, used for tracing dependency relationship --> <dubbo:application name="demo-provider"/> <!-- use multicast registry center to export service --> <dubbo:registry address="zookeeper://127.0.0.1:2181"/> <!-- use dubbo protocol to export service on port 20880 --> <dubbo:protocol name="dubbo" port="20880"/> <!-- service implementation, as same as regular local bean --> <bean id="demoService" class="com.alibaba.dubbo.demo.provider.DemoServiceImpl"/> <!-- declare the service interface to be exported --> <dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoService"/></beans>`將dubbo-demo-consumer項目中的dubbo-demo-consumer.xml修改成

<?xml version="1.0" encoding="UTF-8"?><!--Licensed to the Apache Software Foundation (ASF) under one or morecontributor license agreements. See the NOTICE file distributed withthis work for additional information regarding copyright ownership.The ASF licenses this file to You under the Apache License, Version 2.0(the "License"); you may not use this file except in compliance withthe License. You may obtain a copy of the License at required by applicable law or agreed to in writing, softwaredistributed under the License is distributed on an "AS IS" BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions andlimitations under the License.--><beans xmlns:xsi="; xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xmlns="; xsi:schemaLocation=" http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <!-- consumer's application name, used for tracing dependency relationship (not a matching criterion), don't set it same as provider --> <dubbo:application name="demo-consumer"/> <!-- use multicast registry center to discover service --> <dubbo:registry address="zookeeper://127.0.0.1:2181"/> <!-- generate proxy for the remote service, then demoService can be used in the same way as the local regular interface --> <dubbo:reference id="demoService" check="false" interface="com.alibaba.dubbo.demo.DemoService"/></beans>同時在命令行輸入zkServer start啓動zk

分別啓動Proiver和Consumer

運行Provider類,將本身的服務接口對外開放

運行Consumer類,尋找服務提供方,並調用其接口實現

至此,對於Dubbo有了一個初步的認識並經過dubbo-demo項目瞭解Dubbo的運做模式。

網上找了一份PDF版的源碼閱讀心得,若是有須要,下方留下你的郵箱

相關文章
相關標籤/搜索