刚开始自己学习dubbo的时候看到大佬写的最全最简单的dubbo教程-以XML的形式整合dubbo《二》,应该算是最入门的dubbo demo,所以想把跟着他搭建入门dubbo demo的过程中遇到的问题也分享一下或者说更详细的讲解下,案例均使用springboot的形式,传统mian方法启动的方式.
本文所讲的dubbo示例代码github地址(含dubbo-admin-2.8.4.war)
:https://github.com/catboshi/dubbo-demo
目前官网给出了,四种整合dubbo的方式分别是,XML配置、属性配置、API配置、注解配置,看官网写的api跟注解配置的方式是类似的,所以我这里只写三种配置方式。详细说明见dubbo官网,这里就不再多说了。但是建议开发中用XML的形式,其它形式最好作为了解。XML整合的案例在快速入门中已经有了,只不过不是与springboot方式整合的,所以这里再次整合一遍。注意服务启动前需要启动注册中心zookeeper,且不要关闭,不知道的请参考:Dubbo-Admin管理平台和Zookeeper注册中心的搭建重复的后面的都不做陈述了。
所需环境
zookeeper作为dubbo的注册中心,dubbo服务提供方和消费方都需要在zookeeper注册中心注册。 关于zookeeper安装、配置、启动请参考:https://blog.csdn.net/lamfang/article/details/108866448
注意,zookeeper启动成功后,请勿关闭
废话不多说,开始搭建
项目结构图
共同需要的依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>
<dependency>
<groupId>com.study.dubbo</groupId>
<artifactId>dubbo-xml-springboot-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
共同接口的定义
public interface DubboService {
String sayHello(String name);
}
服务生产者
项目结构
服务生产者
生产者实现接口
package com.study.server;
import org.springframework.stereotype.Service;
import com.study.service.DubboService;
@Service("dubboService")
public class DubboServiceImpl implements DubboService{
@Override
public String sayHello(String name) {
// TODO Auto-generated method stub
return "hello,"+name;
}
}
声明相关配置信息
在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:application name="provider" />
<!-- 用于配置连接注册中心相关信息 -->
<dubbo:registry address="zookeeper://localhost:2181" />
<!-- 用于配置提供服务的协议信息,协议由提供方指定,消费方被动接受 -->
<dubbo:protocol name="dubbo" port="20880" accesslog="true" />
<!--用于暴露一个服务,定义服务的元信息,一个服务可以用多个协议暴露,一个服务也可以注册到多个注册中心 -->
<!--每个接口都应定义版本号,为后续不兼容升级提供可能 -->
<!--ref:服务的真正实现类 -->
<dubbo:service interface="com.study.service.DubboService" ref="dubboService" version="1.0.0" />
<!--监控中心配置 监控中心协议,如果为protocol="registry",表示从注册中心发现监控中心地址,否则直连监控中心。 -->
<!--<dubbo:monitor protocol="registry"></dubbo:monitor>-->
<!-- 直连监控中心服务器地址 -->
<!-- <dubbo:monitor address="localhost:6379"></dubbo:monitor> -->
</beans>
服务启动
注意包扫描,与加载provider.xml
文件
package com.study;
import java.util.Random;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ImportResource;
/**
* @author Jackie Wang
** 项目名称:dubbo-xml-springboot-provider
* 类名称:DubboProviderApplication
* 类描述:springboot-dubbo启动类
* 创建时间:2019年5月4日 下午8:47:04
*/
@SpringBootApplication
@ComponentScan(basePackages={"com.study"})
@ImportResource(locations = "classpath:provider.xml")
public class DubboProviderApplication implements WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> {
public static void main(String[] args) {
// TODO Auto-generated method stub
SpringApplication.run(DubboProviderApplication.class, args);
}
@Override
public void customize(ConfigurableServletWebServerFactory factory) {
// TODO Auto-generated method stub
factory.setPort(getRandomPort());
}
public static int getRandomPort() {
int portStart = 8000;
int portEnd = 10000;
Random r = new Random();
int ra = r.nextInt(portEnd-portStart)+portStart;
return ra;
}
}
服务消费者
项目结构
服务注册
在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="consumer" />
<dubbo:registry protocol="zookeeper" address="zookeeper://localhost:2181"/>
<!-- 生成远程服务代理,可以和本地bean一样使用demoService -->
<!-- version 版本号必须和服务提供者版本号对应 -->
<!--interface 引入服务提供者对外暴露的接口 -->
<!--url:服务消费者直接服务提供者,服务提供者地址 -->
<dubbo:reference id="dubboService" interface="com.study.service.DubboService" version="1.0.0" />
<!--监控中心配置 监控中心协议,如果为protocol="registry",表示从注册中心发现监控中心地址,否则直连监控中心。 -->
<!--<dubbo:monitor protocol="registry"></dubbo:monitor>-->
<!--关闭所有消费者启动时检查 -->
<!--<dubbo:consumer check="false"></dubbo:consumer>-->
</beans>
服务启动
注意包扫描与consumer.xml
配置文件的加载
package com.study;
import java.util.Random;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ImportResource;
/**
* @author Jackie Wang
** 项目名称:dubbo-xml-springboot-consumer
* 类名称:DubboConsumerApplication
* 类描述:springboot-dubbo启动类
* 创建时间:2019年5月6日 上午9:33:15
*/
@SpringBootApplication
@ComponentScan(basePackages={"com.study"})
@ImportResource(locations = "classpath:consumer.xml")
public class DubboConsumerApplication implements WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> {
public static void main(String[] args) {
// TODO Auto-generated method stub
SpringApplication.run(DubboConsumerApplication.class,args);
}
@Override
public void customize(ConfigurableServletWebServerFactory factory) {
// TODO Auto-generated method stub
factory.setPort(getRandomPort());
}
public static int getRandomPort() {
int portStart = 8000;
int portEnd = 10000;
Random r = new Random();
int ra = r.nextInt(portEnd-portStart)+portStart;
return ra;
}
}
调用服务
服务调用的代码为:
package com.study.Controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.study.service.DubboService;
@RestController
public class DemoController {
@Autowired
private DubboService dubboService;
@RequestMapping("/sayHello")
public String sayHello(@RequestParam String name) {
return dubboService.sayHello(name);
}
}
调用结果测试
启动服务提供端,再启动消费端
访问:http://localhost:8164(消费端启动端口)/sayHello?name=Jackie
如果出现如图说明ok了:
注意:本文归作者所有,未经作者允许,不得转载