1、spring+dubbo+zookeeper集群环境搭建(示例学习)
1.1、zookeeper集群搭建
zookeeper下载地址:https://www.apache.org/dyn/closer.cgi/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管理中心(可选)
dubbo-admin.war包下载地址:https://download.csdn.net/download/chen_jia_hao/10791836
上面地址,是笔者已经重新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 高效序列化:
https://www.codercto.com/a/29184.html
https://www.cnblogs.com/Eilen/p/6559040.html
2、dubbo-admin管理中心项目下载: