這邊咱們就不介紹怎麼安裝這些外部環境了,你們自行從安裝這些外部環境哈html
源碼的話咱們上GitHub 上面直接拉取dubbo的源碼便可, Dubbo 而後咱們 Fork出一個屬於咱們本身的倉庫,以後咱們就能夠在咱們GitHub的倉庫中看到這個項目了。而後咱們將這個項目down到本地進行調試java
具體Git操做不詳細介紹,下面貼出幾個比較好的供你們參考git
https://blog.csdn.net/qq_32040767/article/details/77096761github
https://blog.csdn.net/menggudaoke/article/details/77744541算法
https://juejin.im/entry/5a5f3b286fb9a01c9064e83bspring
https://www.cnblogs.com/MrJun/p/3351478.htmlapache
這裏咱們爲何使用Fork 而不是Star,這是由於star的項目你不是Pull Request 到源項目的,而Fork 是能夠的。想一想一下要是你在看源碼的過程當中發現了bug。而後提交給他們並審覈這是一件多酷的事情架構
下面的這個 Dubbo 官網上最爲經典的介紹,一張圖就將整個Dubbo 過程大體的介紹的差很少。app
什麼是Dubbo?負載均衡
一個分佈式服務治理框架
Dubbo的做用是什麼?
做用是解決下面的問題
單一應用架構
垂直應用架構
分佈式服務架構
流動計算架構
節點 | 角色說明 |
---|---|
Provider |
暴露服務的服務提供方 |
Consumer |
調用遠程服務的服務消費方 |
Registry |
服務註冊與發現的註冊中心 |
Monitor |
統計服務的調用次數和調用時間的監控中心 |
Container |
服務運行容器 |
服務容器負責啓動,加載,運行服務提供者。
由於這三者是整個Dubbo 調用過程的鏈路核心
talk is cheap show me the code
光說不行,我們經過看下項目中的源碼來看下dubbo整個結構
dubbo提供了 一個demo項目供你們測試調試 整個demo已經在你down的dubbo的項目中了
打開咱們的dubbo項目,咱們會看到這樣的一個子項目
這裏就是那個demo子項目 就是咱們能夠直接運行測試的項目
將整個測試項目展開,咱們會看見這幾個文件
咱們先進入consumer項目中的 Consumer類中,運行這個類。在這裏是一個main函數,咱們直接運行就ok了
以後咱們再啓動Provider 類。這樣的話,咱們就啓動了一對消費者和生產類。這樣的話,最簡單的dubbo程序就 啓動了。
下面咱們根據這個最簡單的類來分析下
package org.apache.dubbo.demo; // 服務對外暴露接口 public interface DemoService { String sayHello(String name); }
package org.apache.dubbo.demo.consumer; import org.apache.dubbo.demo.DemoService; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Consumer { /** * To get ipv6 address to work, add * System.setProperty("java.net.preferIPv6Addresses", "true"); * before running your application. */ public static void main(String[] args) { //加載配置的xml文件 ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"META-INF/spring/dubbo-demo-consumer.xml"}); context.start(); //從這個上下文bean中獲取類 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(); } } } }
消費者的測試demo,循環調用方法
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://dubbo.apache.org/schema/dubbo" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/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="multicast://224.5.6.7:1234"/> <!-- 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="org.apache.dubbo.demo.DemoService"/> </beans>
咱們經過配置文件xml來進行服務的發現和啓用,還有對註冊中心的配置
下面介紹下服務的提供者Provider
package org.apache.dubbo.demo.provider; import org.apache.dubbo.demo.DemoService; import org.apache.dubbo.rpc.RpcContext; import java.text.SimpleDateFormat; import java.util.Date; public class DemoServiceImpl implements DemoService { @Override public String sayHello(String name) { //對外暴露的服務內部實現類 System.out.println("[" + new SimpleDateFormat("HH:mm:ss").format(new Date()) + "] Hello " + name + ", request from consumer: " + RpcContext.getContext().getRemoteAddress()); return "Hello " + name + ", response from provider: " + RpcContext.getContext().getLocalAddress(); } }
package org.apache.dubbo.demo.provider; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Provider { /** * To get ipv6 address to work, add * System.setProperty("java.net.preferIPv6Addresses", "true"); * before running your application. */ public static void main(String[] args) throws Exception { //加載xml配置 ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"META-INF/spring/dubbo-demo-provider.xml"}); context.start(); System.in.read(); // press any key to exit } }
<?xml version="1.0" encoding="UTF-8"?> <!-- provider's application name, used for tracing dependency relationship --> <!-- 提供一個應用名稱,用於查找依賴的關係--> <dubbo:application name="demo-provider"/> <!-- use multicast registry center to export service --> <!-- 使用組播來進行服務的暴露--> <dubbo:registry address="multicast://224.5.6.7:1234"/> <!-- use dubbo protocol to export service on port 20880 --> <!-- 使用dubbo協議對外暴露時的端口--> <dubbo:protocol name="dubbo" port="20880"/> <!-- service implementation, as same as regular local bean --> <!-- 業務實現類,對外暴露類的內部實現--> <bean id="demoService" class="org.apache.dubbo.demo.provider.DemoServiceImpl"/> <!-- declare the service interface to be exported --> <!-- 對外暴露服務的接口 --> <dubbo:service interface="org.apache.dubbo.demo.DemoService" ref="demoService"/> </beans>