Dubbo框架的使用操作文档.docx
《Dubbo框架的使用操作文档.docx》由会员分享,可在线阅读,更多相关《Dubbo框架的使用操作文档.docx(29页珍藏版)》请在冰豆网上搜索。
![Dubbo框架的使用操作文档.docx](https://file1.bdocx.com/fileroot1/2022-11/25/ae8be765-9293-4201-8cd2-7803ece784b6/ae8be765-9293-4201-8cd2-7803ece784b61.gif)
Dubbo框架的使用操作文档
Dubbo框架的使用操作文档
文件版本:
V1.0
文件编号:
发布日期:
2016年10月17日
编制:
审核:
批准:
修订版本号
修订人
修订日期
修订描述
1.0
2016年10月17日
创建
目录
1ZooKeeper的配置安装1
1.1ZooKeeper简介1
1.2详细安装文档说明参考1
2Dubbo-admin配置安装2
2.1管理平台的简介2
2.2详细安装文档的参考2
3创建使用Dubbo框架的Maven项目3
3.1创建Maven项目sinoep-interface-user3
3.1.1创建实体类3
3.1.2创建接口3
3.1.3在Pom.xml文件中引入依赖的包3
3.1.4打包3
3.2创建Maven项目sinoep-common-config3
3.2.1创建全局变量类3
3.2.2创建或者引入*.properties配置3
3.2.3在Pom.xml文件中引入依赖的包3
3.2.4打包3
3.3创建Maven项目sinoep-common-core3
3.3.1创建引入核心公用的类3
3.3.2在Pom.xml文件中引入依赖的包3
3.3.3打包3
3.4创建Maven项目sinoep-common-parent3
3.4.1创建项目3
3.4.2在Pom.xml文件中引入依赖的包3
3.4.3打包3
3.5创建Maven项目sinoep-service-user(服务提供者)3
3.5.1在Pom.xml文件中引入依赖的包3
3.5.2编写接口实现类3
3.5.3在resource目录下编写两个配置文件3
3.5.4编写测试类启动服务3
3.5.5打包3
3.6创建Maven项目sinoep-web-sso(消费者)3
3.6.1在Pom.xml文件中引入依赖的包3
3.6.2创建Controller或者Action类3
3.6.3在resource目录下编写两个配置文件3
3.6.4部署到tomact运行3
4创建使用Dubbo框架的普通web项目4
5Dubbo开发中restful风格的远程调用28
5.1快速入门28
5.1.1快速入门28
5.2REST服务提供端详解29
5.2.1HTTPPOST/GET的实现29
5.2.2Annotation放在接口类还是实现类29
5.2.3JSON、XML等多数据格式的支持29
5.2.3.1@Consumers注解使用的说明29
5.2.4中文字符支持30
5.2.5XML数据格式的额外要求30
5.2.6定制序列化29
5.2.7获取上下文(Context)信息29
6已开发的demo项目参考34
ZooKeeper的配置安装
简介
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。
它是一个为分布式应用提供一致性服务的软件,提供的功能包括:
配置维护、名字服务、分布式同步、组服务等。
ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。
理解Zookeeper的算法可代入现实生活的“投票选举”。
Zookeeper字面意思是“动物园管理员”,它是一个分布式的服务框架,基于FastPaxos算法。
Zookeeper分布式集群里,主要分为三个角色:
Leader接收所有Follower的提案请求并统一协调发起提案的投票,负责与所有的Follower进行内部的数据交换(同步);
Follower直接为客户端服务并参与提案的投票,同时与Leader进行数据交换(同步);
Observer直接为客户端服务但并不参与提案的投票,同时也与Leader进行数据交换(同步)。
ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。
安装配置文档
Dubbo-admin配置安装
简介
dubbo的使用,其实只需要有注册中心,消费者,提供者这三个就可以使用了,但是并不能看到有哪些消费者和提供者,为了更好的调试,发现问题,解决问题,因此引入dubbo-admin。
通过dubbo-admin可以对消费者和提供者进行管理。
dubbo管理控制台开源部分主要包含:
提供者 路由规则 动态配置 访问控制 权重调节 负载均衡 负责人,等管理功能。
安装配置文档
3创建使用Dubbo框架的Maven项目
备注(按照步骤完成,所用的工程都是maven工程)
在搭建Dubbo框架之前,先了解Dubbo框架的工作流程。
服务提供者先启动start,然后向注册中心注册暴露服务。
消费者向注册中心订阅服务。
监控中心统计服务的调用次数和调用时间的监控中心
3.1新建服务的接口及传输对象的项目。
接口用于下放给消费者,供消费者调用。
项目结构如下
代码
User.Java
/**
*用户Model
*@author***
*
*/
@Entity
@Table(name="sys_user_basicinfo")
publicclassUserimplementsSerializable{
@Id
@GeneratedValue
privateLongid;
privateStringusername;
publicUser(){
super();
}
publicUser(Stringusername,Longid){
this.username=username;
this.id=id;
}
publicUser(Longid){
this.id=id;
}
publicLonggetId(){
returnid;
}
publicvoidsetId(Longid){
this.id=id;
}
publicStringgetUsername(){
returnusername;
}
publicvoidsetUsername(Stringusername){
this.username=username;
}
}
接口UserService.java
/**
*根据用户ID获取用户
*@paramuserid
*@return
*/
UsergetUserById(Longid);
/**
*获取对应城市下的全部用户
*@paramcity
*@return
*/
publicListgetAllByCity(Stringcity);
/**
*验证用户名与密码是否正确
*@paramuserName
*@parampassWord
*@return
*/
publicUserlogin(StringuserName,StringpassWord);
/**
*测试接口
*@return
*/
publicStringisTest(Stringname);
}
Pom.xml文件中配置需要依赖的包
打开下图红框的部分
内容中需要配置的地方,加入依赖的包。
3.2创建服务提供者(即:
服务接口的实现方)
服务提供者主要把服务注册暴露在注册中心,接口的实现类。
项目结构
3.2.1在Pom.xml文件中添加依赖包,主要引入需要实现的接口。
(否则写实现类时候,报错)
3.2.2编写接口实现类UserServiceImpl.java
代码
@Service
publicclassUserServiceImplimplementsUserService{
@Autowired
publicUserDaouserDao;
publicStringisTest(Stringname){
return"UserServiceImpl:
"+name;
}
publicListgetAllByCity(Stringcity){
returnuserDao.getAllByCity(city);
}
publicUserlogin(StringuserName,StringpassWord){
returnuserDao.login(userName,passWord);
}
publicUsergetUserById(Longid){
return(User)userDao.getById(id);
}
publicUsersaveUser(Demouser){
//TODOAuto-generatedmethodstub
returnnull;
}
publicUsersaveUser(Useruser){
//TODOAuto-generatedmethodstub
returnnull;
}
}
3.2.3编写完实现类,需要把服务接口注册暴露给注册中心,需要在下图红框内的配置文件dubbo-provider.xml中暴露服务。
暴露服务的具体配置如下
--暴露服务的名称-->
applicationname="sso-service-user"/>
--配置zookeeper注册中心的ip地址-->
registryprotocol="zookeeper"address="${dubbo.registry.address}"timeout="50000"/>
--dubbo监控中心
monitorprotocol="registry"/>
--使用multicast广播注册中心暴露服务地址-->
protocolname="dubbo"port="9099"/>
--配置暴露的接口服务-->
serviceinterface="com.sinosoft.sinoep.user.service.UserService"ref="userService"/>
3.2.4完成把服务接口注册暴露给注册中心,需要编写一个启动测试类。
项目中的路径如下图
调用Dubbo服务时,先把服务提供者启动,向注册中心注册暴露服务,需要编写一个启动程序。
代码
publicclassDubboProvider{
privatestaticfinalLoglog=LogFactory.getLog(DubboProvider.class);
publicstaticvoidmain(String[]args){
try{
ClassPathXmlApplicationContextcontext=newClassPathXmlApplicationContext("classpath:
spring/spring-context.xml");
context.start();
UserServiceUserService=(UserService)SpringBeanUtils.getBean("userService");
log.info(UserService.isTest("kjx"));
}catch(Exceptione){
log.error("==DubboProvidercontextstarterror:
",e);
}
synchronized(DubboProvider.class){
while(true){
try{
DubboProvider.class.wait();
}catch(InterruptedExceptione){
log.error("==synchronizederror:
",e);
}
}
}
}
}
3.3创建服务消费者
项目结构如下
消费者主要向注册中心订阅服务。
3.3.1Pom.xml文件中配置需要依赖的包
Pom.xml文件中需要增加的内容(引入需要调用方法的接口)
3.3.2向注册中心订阅服务,需要新建配置文件Dubbo-consumer.xml,配置路径如下
需要在红框文件里面增加如下内容
--消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样-->
applicationname="sinoep-web-sso"/>
--使用zookeeper注册中心暴露服务地址-->
--注册中心地址-->
registryprotocol="zookeeper"address="${dubbo.registry.address}"/>
--需要调用用户服务接口,订阅的服务-->
referenceinterface="com.sinoep.user.service.UserService"id="userService"check="false"protocol="dubbo"/>
3.3.3编写消费者代码,调用订阅的服务
代码
publicclassDubboConsumer{
privatestaticfinalLoglog=LogFactory.getLog(DubboConsumer.class);
publicstaticvoidmain(String[]args){
try{
ClassPathXmlApplicationContextcontext=newClassPathXmlApplicationContext("classpath:
spring/spring-context.xml");
context.start();
UserServiceuserService=(UserService)SpringBeanUtils.getBean("userMsgService");
Useruserdb=userService.getUserById(6452L);
log.info("userdb:
"+userdb.getBirth_day());
System.out.println("实现类:
"+userService.isTest("kjx"));
}catch(Exceptione){
log.error("==DubboProvidercontextstarterror:
",e);
}
synchronized(DubboConsumer.class){
while(true){
try{
DubboConsumer.class.wait();
}catch(InterruptedExceptione){
log.error("==synchronizederror:
",e);
}
}
}
}
}
3.4Dubbo服务既是消费者又是服务提供者
按照上述方法新建Dubbo服务,新建接口sinoep-interface-pk和服务sinoep-service-pk,注册暴露到注册中心。
例如:
sinoep-service-user服务既是消费者有是服务的的提供者,
sinoep-service-user消费了sinoep-interface-pk提供的服务,
sinoep-service-user为sinoep-web-sso提供了服务。
如下图
sinoep-service-user既是消费者又为服务提供者
3.4.1在Pom.xml文件中添加依赖包,主要引入调用方法的接口。
(否则写调用的时候,报错)
3.4.2项目中引入两个配置文件dubboconsumer.xml,dubbo-provider.xml
dubbo:
application只能配置一个.如下图
3.4.3sinoep-service-user系统中直接配置对应消费服务。
配置文件中无需配置端口,如果为同一注册中心,无需再次添加注册中心。
可使用相同的注册中心配置,如下只配置调用的接口。
referenceinterface="com.sinosoft.sinoep.pk.service.PrimaryKeyService"id="primaryKeyService"check="false"protocol="dubbo"timeout="50000"/>
3.4.4sinoep-service-user系统中填写对应对外提供的协议并配置端口
如果同一台服务器部署上述两服务,sinoep-service-user系统端口需与sinoep-interface-pk系统区分。
3.4.5启动服务,测试。
本地先启动一个服务提供者的dubbo服务sinoep-interface-pk,系统sinoep-service-user系统可直接调用已订阅sinoep-interface-pk系统中的服务
4创建使用Dubbo框架的普通web项目
5Dubbo开发中restful风格的远程调用
5.1快速入门
在dubbo中开发一个REST风格的服务会比较简单,下面以一个注册用户的简单服务为例说明。
这个服务要实现的功能是提供如下URL(注:
这个URL不是完全符合REST的风格,但是更简单实用):
http:
//localhost:
8080/users/register
而任何客户端都可以将包含用户信息的JSON字符串POST到以上URL来完成用户注册。
首先,开发服务的接口:
PublicclassUserService{
VoidregisterUser(Useruser);
}
然后,开发服务的实现:
@Path("users")
PublicclassUserServiceImplimplementsUserService{
@POST
@Path("register")
@Consumes({MediaType.APPLICATION_JSON})
PublicvoidregisterUser(Useruser){
//savetheuser...
}
}
5.2REST服务提供端详解
5.2.1HTTPPOST/GET的实现
REST服务中虽然建议使用HTTP协议中四种标准方法POST、DELETE、PUT、GET来分别实现常见的“增删改查”,但实际中,我们一般情况直接用POST来实现“增改”,GET来实现“删查”即可(DELETE和PUT甚至会被一些防火墙阻挡)。
前面已经简单演示了POST的实现,在此,我们为UserService添加一个获取注册用户资料的功能,来演示GET的实现。
这个功能就是要实现客户端通过访问如下不同URL来获取不同ID的用户资料。
http:
//localhost:
8080/users/1001
http:
//localhost:
8080/users/1002
http:
//localhost:
8080/users/1003
当然,也可以通过其他形式的URL来访问不同ID的用户资料,例如:
http:
//localhost:
8080/users/load?
id=1001
JAX-RS本身可以支持所有这些形式。
但是上面那种在URL路径中包含查询参数的形式(http:
//localhost:
8080/users/1001)更符合REST的一般习惯,所以更推荐大家来使用。
下面我们就为UserService添加一个getUserById1(Longid)方法来实现这种形式的URL访问:
//http:
//192.168.1.103:
9090/usermsg/6452.json
@GET
@Path("{id:
\\d+}")
@Produces({MediaType.APPLICATION_JSON,MediaType.APPLICATION_XML})
publicUsergetUserById1(@PathParam("id")Longid){
return(User)userDao.getById(id);
}
@GET:
指定用HTTPGET方法访问
@Path("{id:
\d+}"):
根据上面的功能需求,访问getUserById1(Longid)的URL应当是“http:
//localhost:
8080/users/+任意数字",并且这个数字要被做为参数传入getUserById1(Longid)方法。
这里的annotation配置中,@Path中间的{id:
xxx}指定URL相对路径中包含了名为id参数,而它的值也将被自动传递给下面用@PathParam("id")修饰的方法参数id。
{id:
后面紧跟的\d+是一个正则表达式,指定了id参数必须是数字。
@Produces({MediaType.APPLICATION_JSON}):
指定getUserById1(Longid)输出JSON格式的数据。
框架会自动将User对象序列化为JSON数据。
5.2.2Annotation放在接口类还是实现类
在Dubbo中开发REST服务主要都是通过JAX-RS的annotation来完成配置的,在上面的示例中,我们都是将annotation放在服务的实现类中。
但其实,我们完全也可以将annotation放到服务的接口上,这两种方式是完全等价的,例如:
@Path("users")publicinterfaceUserService{
@GET
@Path("{id:
\