一.开篇介绍
Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和Spring框架无缝集成。最近半年来,Dubbo的得到了快速的维护,官方也推出了集成Springboot的jar包,及其贴合时代潮流,那么现在就来讲Springboot如何集成Dubbo(dubbo-spring-boot-starter2.0),采用properties 配置文件,使dubbo的配置方式更加简洁,小白就一盏茶的时间就能入手,赶紧来看看吧!
二.开发环境
运行环境:JDK 8.+,Maven 3.3+ 技术栈:SpringBoot 1.5.9.RELEASE、dubbo-spring-boot-starter2.0、ZooKeeper 3.4.10 工具:IntelliJ IDEA、谷歌浏览器
三、关键的依赖
<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要知道服务提供者和消费者概念,而且最好调用的服务要有共同的Api,如下图是写的入门项目。
#####1.dubbo-demo说明
dubbo-demo项目作为其他模块的父模块,子模块主要利用父模块的poml包,下面给出dubbo-demo的poml文件:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>dubbo-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>dubbo-demo</name>
<description>Demo project for Spring Boot</description>
<modules>
<module>dubbo-api</module>
<module>dubbo-consumer</module>
<module>dubbo-provider</module>
</modules>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
<!--<version>1.5.9.RELEASE</version>-->
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<dubbo.starter.version>2.0.0</dubbo.starter.version>
<zookeeper.version>3.4.13</zookeeper.version>
<curator-framework.version>4.0.1</curator-framework.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.spring.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>${dubbo.starter.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>${curator-framework.version}</version>
</dependency>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
#####2.dubbo-api说明
(1) pom文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>dubbo-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>dubbo-api</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>com.example</groupId>
<artifactId>dubbo-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
</project>
(2)接口定义
public interface UserServiceInter {
TResult login(User user);//用户登录
}
(2) model定义,记得要实现序列化,以保证数据传输
模型基础类TResult和用户类User
public class TResult<T> implements Serializable{
Integer errCode =0;
String errMsg ="ok" ;
T data ;
public Integer getErrCode() {
return errCode;
}
public void setErrCode(Integer errCode) {
this.errCode = errCode;
}
public String getErrMsg() {
return errMsg;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
public void setErrMsg(String errMsg) {
this.errMsg = errMsg;
}
}
public class User implements Serializable{
private String userName;
private String password;
public User() {
}
public User(String userName, String password) {
this.userName = userName;
this.password = password;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
#####3.dubbo-provider说明
(1) pom文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>dubbo-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>dubbo-provider</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>com.example</groupId>
<artifactId>dubbo-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>com.example</groupId>
<artifactId>dubbo-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
(2) UserServiceInter接口实现类
@Service(interfaceClass = UserServiceInter.class,version = "${user.version}")
@Component
public class UserServiceImpl implements UserServiceInter{
@Override
public TResult login(User user) {
TResult<User> result = new TResult<>();
if(user.getUserName().equals("lss")){
result.setData(user);
}else {
result.setErrCode(-1);
result.setErrMsg("登录失败,您的用户名或者密码有误");
}
return result;
}
}
(3)application.properties配置文件,主要配置dubbo的相关
spring.application.name = dubbo-provider
server.port= 86
#是否作为服务
spring.dubbo.server=true
#用户接口版本
user.version= 1.0.0
#注册中心的注册地址
spring.dubbo.registry.address= zookeeper://192.168.153.130:2181
#是否开启注册检查
spring.dubbo.registry.check= true
#配置协议名
spring.dubbo.protocol.name= dubbo
# 用dubbo协议在20880端口暴露服务
spring.dubbo.protocol.port= 20880
# 配置dubbo的扫描包
spring.dubbo.scan= com.example.dubboprovider.service
(4) 启动类文件Application
@SpringBootApplication
@EnableDubboConfiguration
public class DubboProviderApplication {
public static void main(String[] args) {
SpringApplication.run(DubboProviderApplication.class, args);
}
}
(5) log4j日志实现配置文件
# rootLogger参数分别为:根Logger级别,输出器stdout,输出器log
log4j.rootLogger = info,stdout,log
# 输出信息到控制台
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = %d [%-5p] %l %rms: %m%n
# 输出DEBUG级别以上的日志到D://logs/debug.log
log4j.appender.log = org.apache.log4j.DailyRollingFileAppender
log4j.appender.log.DatePattern = '.'yyyy-MM-dd
log4j.appender.log.File = D://debug.log
log4j.appender.log.Encoding = UTF-8
#log4j.appender.log.Threshold = INFO
log4j.appender.log.layout = org.apache.log4j.PatternLayout
log4j.appender.log.layout.ConversionPattern = %d [%-5p] (%c.%t): %m%n
#####4.dubbo-consumer 消费端说明
(1) poml文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>dubbo-consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>dubbo-consumer</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>com.example</groupId>
<artifactId>dubbo-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>com.example</groupId>
<artifactId>dubbo-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
(2)application.properties 配置文件
spring.application.name = dubbo-consumer
server.port= 88
#用户接口版本号
user.version= 1.0.0
#注册中心地址
spring.dubbo.registry.address=zookeeper://192.168.153.130:2181
#dubbo扫描包路径
spring.dubbo.scan=com.example.dubboconsumer.controller
(3) controller接口测试UserController
@RestController
public class UserController {
@Reference(version = "${user.version}")
UserServiceInter userServiceInter;
@GetMapping("/login")
public TResult<User> login(@NotNull String name){
User user = new User();
user.setPassword("123456");
user.setUserName(name);
return userServiceInter.login(user);
}
}
(4) Application 启动类,只需配置EnableDubboConfiguration即可
@SpringBootApplication
@EnableDubboConfiguration
public class DubboConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(DubboConsumerApplication.class, args);
}
}
(5)跟上面一样配置log4j文件
#####5.启动zookeeper注册中心
zookeeper在centos如何配置安装,在上个帖子有详细说明地址:https://blog.csdn.net/u010520146/article/details/82499334,下面是说明下如何启动,
打开zookeeper路径
[root@localhost ~]# cd /usr
[root@localhost usr]# cd local
[root@localhost local]# cd zookeeper-3.4.10/
[root@localhost zookeeper-3.4.10]# cd bin
启动start服务
[root@localhost bin]# zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper-3.4.10/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
重启防火墙
[root@localhost bin]# systemctl restart iptables.service
[root@localhost bin]#
五.测试
首先启动服务提供者dubbo-provider,在启动服务调用者dubbo-consumer,最后打开谷歌浏览器,
1.输入http://localhost:88/login?name=11
{“errCode”:-1,“errMsg”:“登录失败,您的用户名或者密码有误”,“data”:null}
2.输入http://localhost:88/login?name=lss
{“errCode”:0,“errMsg”:“ok”,“data”:{“userName”:“lss”,“password”:“123456”}}
3.zookeeper.out注册中心的节点记录
2018-09-16 19:20:22,354 [myid:] - INFO [main:ZooKeeperServer@838] - minSessionTimeout set to -1
2018-09-16 19:20:22,354 [myid:] - INFO [main:ZooKeeperServer@847] - maxSessionTimeout set to -1
2018-09-16 19:20:22,437 [myid:] - INFO [main:NIOServerCnxnFactory@89] - binding to port 0.0.0.0/0.0.0.0:2181
2018-09-16 19:20:54,001 [myid:] - INFO [SessionTracker:ZooKeeperServer@358] - Expiring session 0x165d602f9470003, timeout of 30000ms exceeded
2018-09-16 19:20:54,001 [myid:] - INFO [SessionTracker:ZooKeeperServer@358] - Expiring session 0x165d602f9470000, timeout of 30000ms exceeded
2018-09-16 19:20:54,003 [myid:] - INFO [ProcessThread(sid:0 cport:2181)::PrepRequestProcessor@486] - Processed session termination for sessionid: 0x165d602f9470003
2018-09-16 19:20:54,004 [myid:] - INFO [ProcessThread(sid:0 cport:2181)::PrepRequestProcessor@486] - Processed session termination for sessionid: 0x165d602f9470000
2018-09-16 19:20:54,004 [myid:] - INFO [SyncThread:0:FileTxnLog@203] - Creating new log file: log.91
2018-09-16 20:11:49,707 [myid:] - INFO [NIOServerCxn.Factory:0.0.0.0/0.0.0.0:2181:NIOServerCnxnFactory@192] - Accepted socket connection from /192.168.153.1:65033
2018-09-16 20:11:49,746 [myid:] - INFO [NIOServerCxn.Factory:0.0.0.0/0.0.0.0:2181:ZooKeeperServer@942] - Client attempting to establish new session at /192.168.153.1:65033
2018-09-16 20:11:49,761 [myid:] - INFO [SyncThread:0:ZooKeeperServer@687] - Established session 0x165e55429fb0000 with negotiated timeout 30000 for client /192.168.153.1:65033
2018-09-16 20:11:49,845 [myid:] - INFO [ProcessThread(sid:0 cport:2181)::PrepRequestProcessor@648] - Got user-level KeeperException when processing sessionid:0x165e55429fb0000 type:create cxid:0x4 zxid:0x95 txntype:-1 reqpath:n/a Error Path:/dubbo/com.example.dubboapi.ServerInter.UserServiceInter/configurators Error:KeeperErrorCode = NodeExists for /dubbo/com.example.dubboapi.ServerInter.UserServiceInter/configurators
2018-09-16 20:12:28,877 [myid:] - INFO [NIOServerCxn.Factory:0.0.0.0/0.0.0.0:2181:NIOServerCnxnFactory@192] - Accepted socket connection from /192.168.153.1:65073
其中提示个错误:KeeperErrorCode = NodeExists for ,提示节点已存在,但是不影响使用
六.爬坑记录##
1.model类必须实现序列化,以保证对象能正常传输
2.zookeeper的防火墙记得开启
3.为了实现其日志类,需要实现dubbo定义几种日志框架,比如用logj
####demo项目源码