dubbo服務治理框架
1、spring+dubbo+zookeeper叢集環境搭建(示例學習)
1.1、zookeeper叢集搭建
(1)將zookeeper解壓成三份,分別修改conf/zoo.cfg配置檔案。
(2)zookeeper-1配置:
syncLimit=5 initLimit=10 tickTime=2000 #client連線的埠 clientPort=2181 #存放記憶體資料庫快照的位置,該目錄需要提前建立好 dataDir=e:/dubbo-test/zookeeper/zookeeper-1/data #事務日誌目錄,目錄需要提前建立好 dataLogDir=e:/dubbo-test/zookeeper/zookeeper-1/log #zookeeper服務配置列表 dynamicConfigFile=E:/dubbo-test/zookeeper/zoo.cfg.dynamic
zookeeper-2、zookeeer-3的zoo.cfg配置和上面類似,只有clientPort、dataDir、dataLogDir不同。
(3)zoo.cfg.dynamic 配置註冊中心叢集列表:
server.1=127.0.0.1:2281:3381
server.2=127.0.0.1:2282:3382
server.3=127.0.0.1:2283:3383
server.A=B:C:D。其中 A 是一個數字,表示這個是第幾號伺服器;B 是這個伺服器的 ip 地址;C 表示的是這個伺服器與叢集中的 Leader 伺服器交換資訊的埠;D 表示的是萬一叢集中的 Leader 伺服器掛了,需要一個埠來重新進行選舉,選出一個新的 Leader,而這個埠就是用來執行選舉時伺服器相互通訊的埠。
(4)在zookeeper配置檔案中配置的dataDir目錄下建立myid檔案,內容和server.A中的A一樣。
三個都配好之後,啟動即可。
1.2、dubbo+spring實現服務註冊與發現
主要是將dubbo相關配置好就好了。
maven 依賴配置:
<!-- https://mvnrepository.com/artifact/com.alibaba/dubbo --> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.6.2</version> </dependency> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.5.1-alpha</version> </dependency> <!--zkclient客戶端連線zookeeper 和curator二選一即可--> <dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</artifactId> <version>0.9</version> </dependency> <!--curator客戶端連線zookeeper--> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-framework</artifactId> <version>2.12.0</version> </dependency> <!--kryo序列化 https://mvnrepository.com/artifact/com.esotericsoftware/kryo --> <dependency> <groupId>com.esotericsoftware</groupId> <artifactId>kryo</artifactId> <version>4.0.0</version> </dependency> <!-- Caused by: java.lang.NoClassDefFoundError: Could not initialize class com.alibaba.dubbo.common.serialize.kryo.utils.KryoUtils https://mvnrepository.com/artifact/de.javakaffee/kryo-serializers --> <dependency> <groupId>de.javakaffee</groupId> <artifactId>kryo-serializers</artifactId> <version>0.42</version> </dependency>
(1)服務提供方dubbo配置:
<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">
<!-- 應用名 -->
<dubbo:application name="demo-provider"/>
<!--使用zookeeper註冊中心暴露服務,並設定叢集註冊中心地址 -->
<dubbo:registry address="zookeeper://127.0.0.1:2181?backup=127.0.0.1:2182,backup=127.0.0.1:2183" client="curator">
</dubbo:registry>
<!--使用dubbo協議暴露服務在20881埠,並使用kryo序列化(需引入其依賴),預設是hessian2 -->
<dubbo:protocol name="dubbo" port="20881" serialization="kryo"/>
<bean id="userService" class="com.cjh.service.impl.UserServiceImpl"/>
<!-- 宣告暴露哪些服務 -->
<dubbo:service interface="com.cjh.service.UserService" ref="userService"/>
</beans>
(2)消費方配置:
<?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">
<dubbo:application name="demo-consumer"/>
<!--配置註冊中心地址,用於發現服務-->
<dubbo:registry address="zookeeper://127.0.0.1:2181?backup=127.0.0.1:2182,backup=127.0.0.1:2183" client="zkclient"/>
<!-- 生成遠端代理服務, 然後userService服務就可以向本地服務一樣使用了 -->
<dubbo:reference id="userService" check="false" interface="com.cjh.service.UserService" />
</beans>
(3)提供方程式碼:
/**
* @author chen jia hao
*/
public class Test {
public static void main(String[] args) throws IOException {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"config/dubbo-provider.xml"});
context.start();
System.out.println("Provider started.");
System.in.read();
}
}
(4)消費方程式碼:
/**
* @author chen jia hao
*/
public class Test {
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"config/dubbo-consumer.xml"});
context.start();
UserService userService = (UserService)context.getBean("userService");
User user = new User();
user.setUid(1);
user.setBirthDate(new Date());
user.setUserName("陳嘉豪");
User result = userService.getUser(user);
System.out.println(result.getUid()+"--"+result.getUserName()+"--"+result.getBirthDate());
}
}
(4)啟動提供方、消費方測試即可。
1.3、dubbo中過濾器
上面的註冊與發現,沒有做任何安全性考慮,為了統一管理,我們可以通過dubbo提供的過濾器來為我們的提供方做完成一些校驗。
(1)實現介面com.alibaba.dubbo.rpc.Filter。
import com.alibaba.dubbo.rpc.*;
import java.util.Arrays;
/**
* @author chen jia hao
*/
public class AuthFillter implements Filter {
@Override
public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
///在這裡先寫具體的攔截邏輯,如果不讓通過,可返回異常資訊
Object[] arguments = RpcContext.getContext().getArguments();
if(arguments!=null){
Arrays.stream(arguments).forEach(item->{
System.out.println(item);
});
}
RpcResult rpcResult = new RpcResult();
rpcResult.setException(new RuntimeException("您沒有這個許可權!"));
return rpcResult;
//return invoker.invoke(invocation);//呼叫invoker.invoke(invocation)方可執行後面的操作
}
}
(2)在resources目錄下建立META-INF/dubbo/com.alibaba.dubbo.rpc.Filter ,新增如下資訊:
com.alibaba.dubbo.rpc.Filter內容格式如下:
authFilter=com.cjh.AuthFilter
(3)修改dubbo的provider配置檔案,在dubbo提供方中新增配置filter。裡面的filter值對應於(2)中內容。
<dubbo:provider filter="authFilter" />
(4)啟動提供方和消費方,消費方執行結果應如下:
1.4、dubbo-admin管理中心(可選)
上面地址,是筆者已經重新package的。可部署到tomcat8。
下載之後,將war包部署到tomcat,然後訪問。
輸入管理員密碼即可。
這裡的密碼可在專案的dubbo.proerties配置:
#註冊中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181?backup=127.0.0.1:2182,127.0.0.1:2183
#root密碼配置
dubbo.admin.root.password=root
dubbo.admin.guest.password=guest
登入後如下:
更多參考:
1、dubbo kryo 高效序列化:
2、dubbo-admin管理中心專案下載: