[dubbo]springboot2.x整合dubbo之使用dubbo-spring-boot-starter
本文主要讲解在springboot2.x中,整合官方版本的dubbo-spring-boot-starter实现RPC服务化框架的搭建。
服务提供方
首先讲解服务提供方的集成过程,我们在IDEA中通过spring-initializr建立一个springboot应用,使用springboot版本为2.1.2.RELEASE
引入dubbo依赖
在pom.xml中引入依赖,坐标如下
<!-- dubbo依赖开始 -->
<dependency>
<groupId>com.alibaba.spring.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<!-- dubbo依赖结束 -->
由于2.0.0版本的>dubbo-spring-boot-starter对应的dubbo版本为2.6.0,因此需要依赖zkclient,后续的高版本使用的zookeeper客户端为apache-curator。
编写服务接口
我们定义一个简单的服务接口用作测试,该接口需要被服务提供方和消费方同时引用,建议将接口及公共的model以及异常等打为一个公共的jar包,供服务提供方和消费方引用,
public interface HelloService {
/**
* @param message
* @return
*/
String sayHello(String message);
}
编写服务实现类
在服务提供方中编写实现类。HelloServiceImpl,实现HelloService接口,如下,因为主要描述的是整合过程,因此demo很简单,说明问题即可。
import com.alibaba.dubbo.config.annotation.Service;
import com.gaoyang.marketing.dev.prototype.dubbo.api.HelloService;
import org.springframework.stereotype.Component;
@Component
@Service(interfaceClass = HelloService.class)
public class HelloServiceImpl implements HelloService {
@Override
public String sayHello(String message) {
return "HELLO:" + message;
}
}
发布一个dubbo服务就是这么简单,只需要将一个spring的bean标注 @Service ,注意选择 import com.alibaba.dubbo.config.annotation.Service
其中interfaceClass是要发布服务的接口.
启动类标注开启dubbo自动装配支持
在入口main方法上标注 @EnableDubboConfiguration 即可开启dubbo的自动装配支持。
配置文件修改
修改配置文件application.properties,将当前服务标记为一个dubbo服务端,同时添加zookeeper注册中心地址。
########################################################################
#
# dubbo配置
#
#########################################################################
spring.dubbo.server=true
spring.dubbo.registry=zookeeper://127.0.0.1
此时,应用已经具备启动条件。只需要在IDEA中右键run即可启动服务,dubbo默认的服务暴露端口为8080
服务消费方
接着我们开发服务消费方,并对提供方的接口发起调用
引入依赖
同样先在pom.xml中引入依赖,和提供方保持一致即可,不再赘述
<!-- dubbo依赖开始 -->
<dependency>
<groupId>com.alibaba.spring.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<!-- dubbo依赖结束 -->
编写业务类,调用提供方服务
我们写一个业务类,并在该类中调用提供方的服务。
@Component
public class Hello implements HelloService {
/**
* @Reference
* 如果添加interfaceClass = HelloService.class,则按照interfaceClass = HelloService.class
* 对应的接口寻找
* 如果不添加则按照注解的接口寻找服务
*/
@Reference(interfaceClass = HelloService.class, check = false)
private IHelloService iHelloService;
@Override
public String sayHello(String message) {
return iHelloService.sayHello(message);
}
}
看起来很简洁,只需要在消费者的业务类中通过 @Reference(interfaceClass = HelloService.class, check = false) 引用远程的dubbo服务,
便可以像调用本地服务一样调用远程的dubbo服务。最终会在本地生成一个服务的代理,该代理负责发起真正的服务调用。
启动类标注开启dubbo自动装配支持
这一步与服务提供方一致,在入口main方法上标注 @EnableDubboConfiguration 即可开启dubbo的自动装配支持。
修改配置文件
在服务消费方配置文件application.properties中配置注册中心地址。
########################################################################
#
# dubbo配置
#
#########################################################################
spring.dubbo.registry=zookeeper://127.0.0.1
如果服务消费者同时也是提供者,则添加配置
spring.dubbo.server=true
测试服务调用
这里我们直接在main方法中调用远程服务,具体代码如下
ApplicationContext context = SpringApplication.run(Application.class, args);
Hello hello = context.getBean("hello", Hello.class);
String sayHello = hello.sayHello("SnoWalker");
System.out.println(sayHello);
注意服务端一定要启动。
在消费方服务的控制台可以看到输出如下字样,表明调用成功
HELLO:SnoWalker
小结
我们在本次实例中,实现了在springboot2.x中,整合官方版本的dubbo-spring-boot-starter实现RPC服务化框架的搭建,及验证。
笔者个人建议这种方式可以用在小而精的业务开发中,对于复杂的业务开发,还是建议通过传统的xml方式进行服务的定义与暴露,基于xml的方式要比注解方式更加的灵活。