Dubbo是什么
Dubbo是一個分布式服務框架,致力于提供高性能和透明化的RPC遠程服務調(diào)用方案,以及SOA服務治理方案。。
為什么要用Dubbo
當網(wǎng)站變大,業(yè)務量飛速增長,需要對應用進行拆分,服務化,以提高項目的可維護性以及開發(fā)效率。但是當服務的數(shù)量多到一定程度時,服務之間的依賴,地址的配置與管理就變得復雜。服務之間的均衡負載問題也顯得尤為突出,這種時候,正需要dubbo來解決
dubbo常見配置解析
要點

Paste_Image.png
- Provider: 暴露服務的服務提供方。
- Consumer: 調(diào)用遠程服務的服務消費方。
- Registry: 服務注冊與發(fā)現(xiàn)的注冊中心。
注冊中心官方推薦采用zooKeeper,各種注冊中心策略點這里
- Monitor: 統(tǒng)計服務的調(diào)用次調(diào)和調(diào)用時間的監(jiān)控中心。
- Container: 服務運行容器。
調(diào)用關系說明:
- 服務容器負責啟動,加載,運行服務提供者。
- 服務提供者在啟動時,向注冊中心注冊自己提供的服務。
- 服務消費者在啟動時,向注冊中心訂閱自己所需的服務。
- 注冊中心返回服務提供者地址列表給消費者,如果有變更,注冊中心將基于長連接推送變更數(shù)據(jù)給消費者。
- 服務消費者,從提供者地址列表中,基于軟負載均衡算法,選一臺提供者進行調(diào)用,如果調(diào)用失敗,再選另一臺調(diào)用。
- 服務消費者和提供者,在內(nèi)存中累計調(diào)用次數(shù)和調(diào)用時間,定時每分鐘發(fā)送一次統(tǒng)計數(shù)據(jù)到監(jiān)控中心。
代碼

Paste_Image.png
一共分為3大塊
- 服務提供者API接口
- 服務提供端
- 服務消費端
服務提供者API接口
IProviderAPI.java
public interface IProviderAPI {
String dosomething(String json,long logId);
}
服務消費者
Consumer.java
@Service
public class Consumer {
private Long count=0L;
@Autowired
private IProviderAPI providerAPI;
// @Scheduled(cron = "0-59 * * * * ?")//定時
@Scheduled(fixedDelay = 1000 * 5 , initialDelay = 1000)//心跳更新,5000毫秒執(zhí)行一次,延遲1秒后才執(zhí)行
public void doSomething(){
System.out.println(providerAPI.dosomething("now is "+count,count++));
}
}
消費者Runner(用于啟動spring容器,加載dubbo,spring配置)
ConsumerRunner.java
public class ConsumerRunner {
public static void main(String[] args) throws IOException {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
new String[]{"consumer.xml", "spring.xml", "dubbo.xml"});
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
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-3.0.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd
">
<dubbo:reference id="providerImpl" check="false" timeout="25000" retries="0"
interface="com.m1.api.IProviderAPI" />
</beans>
服務提供者
ProviderImpl.java
@Service("providerImpl")
public class ProviderImpl implements IProviderAPI {
public String dosomething(String json, long logId) {
System.out.println(json);
return "i finish doing "+json +" where logid=="+logId;
}
}
提供者Runner(用于啟動spring容器,加載dubbo,spring配置)
ProviderRunner.java
public class ProviderRunner {
public static void main(String[] args) throws IOException {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
new String[] {
"provider.xml",
"spring.xml",
"dubbo.xml" });
while(true){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
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:service interface="com.m1.api.IProviderAPI" ref="providerImpl" />
</beans>
dubbo.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-3.0.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd ">
<dubbo:application name="dubbo-test"/>
<dubbo:registry address="zookeeper://yourIP:yourPort" />
<dubbo:protocol name="dubbo" port="21101" />
</beans>
spring.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:context="http://www.springframework.org/schema/context"
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd">
<context:annotation-config />
<context:component-scan base-package="com.m1" /><!--自動掃描-->
<!--開啟這個配置 啟用定時 -->
<task:annotation-driven scheduler="qbScheduler" mode="proxy"/>
<task:scheduler id="qbScheduler" pool-size="10"/>
</beans>
先運行ProviderRunner.java,后運行ConsumerRunner.java,每隔5秒鐘可以看到控制臺有不同的輸出,從zookeeper運行日志,也能發(fā)現(xiàn)訪問的ip