(二).Dubbo结合springboot初体验

一.开篇介绍

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日志实现配置文件

扫描二维码关注公众号,回复: 3421302 查看本文章
# 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项目源码

https://download.csdn.net/download/u010520146/10671225

猜你喜欢

转载自blog.csdn.net/u010520146/article/details/82734401