Dubbo呼叫示例
阿新 • • 發佈:2018-11-17
用dubbo做一個“hello world”。
此次demo十分簡單,旨在對Dubbo有個整體上的初步瞭解。服務提供者(程式)和服務消費者(程式)雖然都是執行在同個伺服器上(本地tomcat),但是呼叫是通過Dubbo的RPC。
註冊中心是redis,部署在本地虛擬機器,地址為192.168.1.66:6379(在配置檔案中需要用到)。最終達到效果是服務消費者(Consumer)呼叫服務提供者(Provider)的sayHello()方法在控制檯輸出“Hello world”。
需要做的事情:
- 在pom.xml 當中引入Dubbo 依懶
- 編寫服務介面類
- 編寫服務實現類
- 編寫服務提供者 xml 配置
- 編寫服務消費者 xml 配置
- 啟動服務提供者
- 編寫並執行遠端服務呼叫
pom.xml
<dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.5.3</version> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.2.0</version> </dependency>
服務介面DemoService
public interface DemoService {
String sayHello(String str);
}
服務介面實現DemoService
public class DemoServiceImpl implements DemoService {
public String sayHello(String str) {
return "Hello " + str;
}
}
consumer.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <dubbo:application name="demo-consumer"/> <dubbo:registry protocol="redis" address="192.168.1.66:6379" check="true"/> <dubbo:consumer timeout="5000" retries="2" group="snowman" version="1.0.0"/> <dubbo:reference timeout="3000" retries="1" id="demoService" version="*" interface="com.snowman.service.DemoService"/> </beans>
provider.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<dubbo:application name="demo-provider"/>
<dubbo:registry protocol="redis" address="192.168.1.66:6379" check="true"/>
<dubbo:protocol name="dubbo" port="20880"/>
<dubbo:provider group="snowman"
threadpool="fixed"
threads="500"
timeout="5000"
retries="2"
/>
<dubbo:service interface="com.snowman.service.DemoService"
timeout="5000"
retries="1"
version="3.0.0"
ref="demoService">
<dubbo:method name="sayHello" timeout="2000"/>
</dubbo:service>
<bean id="demoService" class="com.snowman.service.DemoServiceImpl"/>
</beans>
服務提供者Provider
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Provider {
public static void main(String[] args) throws Exception {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
"config/spring-dubbo-redis-provider.xml");
context.start();
System.out.println("dubbo redis 服務啟動成功 ");
System.in.read();
}
}
服務消費者Consumer
import com.snowman.server.DemoService;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Consumer {
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
"config/spring-dubbo-redis-consumer.xml");
context.start();
DemoService demoService = (DemoService) context.getBean("demoService"); //獲取遠端服務
String hello = demoService.sayHello("world"); //執行遠端服務
System.out.println(hello);
}
}
專案工程結構
先啟動redis(如何安裝可參考《Redis之在Linux上安裝和簡單的使用》),因為它是註冊中心(在兩個xml都配置了redis的地址),沒起來會報錯,也沒辦法通知Consumer呼叫。
執行Provider,可以在控制檯看到輸出“dubbo redis 服務啟動成功 ”
再執行Consumer,可以在控制檯看到輸出“Hello world ”,遠端呼叫Provider的服務成功。
再去看redis,可以看到Provider和Consumer都把相關資訊傳送到註冊中心
(RedisDesktopManager,一個redis視覺化工具)
流程簡述:
- 啟動Provider,Provider根據配置檔案找到要提供的服務介面及其相關引數(版本號、超時時間等),向提供的註冊中心傳送資訊進行註冊。
- 啟動Consumer,Consumer根據配置檔案找到所需服務介面及其相關引數,向註冊中心傳送資訊進行註冊。
- 註冊中心接收到註冊資訊後盡心匹配,將服務和介面資訊傳送給Consumer。
- Consumer接到註冊資訊的資訊進行快取,並根據資訊進行介面的遠端呼叫。
(呼叫過程跟註冊中心沒半毛錢關係,資訊是從快取取得,取得註冊中心的資訊後,就算註冊中心掛掉可以正常呼叫)