最近開始接觸了分布式的一些東西,這里給自己作一個學習筆記。
這里只是做一個運行demo,具體的理論知識就不在這里闡述了。
1.zookeeper的安裝與啟動
下載地址:http://www.apache.org/dyn/closer.cgi/zookeeper
下載完成之后,解壓,進入到"conf"目錄下,新建一個"zoo.cfg"
內容如下:
tickTime=2000 dataDir= /Users/chenqimiao/zookeeper-3.4.8/data dataLogDir=/Users/chenqimiao/zookeeper-3.4.8/logs clientPort=2181
參數說明:
#tickTime: zookeeper中使用的基本時間單位, 毫秒值.
#dataDir: 數據目錄. 可以是任意目錄.
#dataLogDir: log目錄, 同樣可以是任意目錄. 如果沒有設置該參數, 將使用和#dataDir相同的設置.
#clientPort: 監聽client連接的端口號.
執行
以上介紹的就是zookeeper的單機模式。當然還有偽分布式和分布式的部署方式,這里就不再闡述,有興趣的可以自行百度。
2.dubbo-admin的部署
介於每個人機子的環境都不盡相同,我建議大家可以自行打包所需war包。
我這里給出一個dubbo的下載地址:http://github.com/alibaba/dubbo,下載全部的文件之后。
執行如下命令
之后找到dubbo-master/dubbo-admin/target路徑下面的dubbo-admin-2.5.4-SNAPSHOT.war包。
把這個包丟到tomcat進行部署就ok了。
3.利用IDEA構建spring boot生產者和消費者
一路next完成之后,在pom中加入如下依賴(dubbo和zookeeper)
<dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.4.10</version> <exclusions> <exclusion> <artifactId>spring</artifactId> <groupId>org.springframework</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.4.6</version> <exclusions> <exclusion> <artifactId>slf4j-log4j12</artifactId> <groupId>org.slf4j</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.github.sgroschupf</groupId> <artifactId>zkclient</artifactId> <version>0.1</version> </dependency>
接下來先構建一個生產者
來一個測試接口:
package com.example.service; /** * Created by chenqimiao on 17/3/24. */ public interface TestService { String sayHello(String name); }
來一個實現類
package com.example.service.impl; import com.example.service.TestService; /** * Created by chenqimiao on 17/3/24. */ public class TestServiceImpl implements TestService { @Override public String sayHello(String name) { return "Hello " + name + "!"; } }
在resource下面加入一個providers.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="dubbo-provider" owner="dubbo-provider"/> <dubbo:registry address="zookeeper://localhost:2181" check="false" subscribe="false"/> <dubbo:service interface="com.example.service.TestService" ref="testService"/> <bean id="testService" class="com.example.service.impl.TestServiceImpl"></bean> </beans>
啟動類:
package com.example; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.ImportResource; @SpringBootApplication @ImportResource(value = {"classpath:providers.xml"}) public class DubboProviderApplication { public static void main(String[] args) { SpringApplication.run(DubboProviderApplication.class, args); } }
最后在application.properties中加入啟動端口:
server.port=8011
at last run application!
那么我們就可以在admin管理界面,看到這個注冊的生產者服務
同樣的道理 接下來我們來構建消費者 。消費者的依賴和生產者一致,這里不再重復。
在resource下加入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="dubbo-consumer"/> <dubbo:registry check="false" address="zookeeper://localhost:2181"/> <dubbo:reference interface="com.example.service.TestService" id="testService"/> </beans>
來一個controller
package com.example.controller; import com.example.service.TestService; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import javax.annotation.Resource; /** * Created by chenqimiao on 17/3/24. */ @Controller public class TestController { @Resource private TestService testService; @RequestMapping(value = "/" ,produces = "application/json;charset=utf-8") @ResponseBody public String test(){ return testService.sayHello("Chenqimiao"); } }
啟動之后,首先我們發現服務有了消費者
緊接着,我們用chrome請求restful接口,消費者服務通過RPC調用請求生產者提供的服務,經過兩層服務調用返回后,chrome得到最終的response。
大致這樣就完成了簡單的分布式項目構建。但在其中我碰到了一個小小問題 ,不知道社區的朋友有沒有辦法!
IDEA不會檢測dubbo的遠程調用,導致這里誤報了一個ERROR,有朋友知道怎么關閉這個錯誤嘛?