本文讲解如何在springboot项目中整合dubbo,zookeeper.
详细代码地址:https://github.com/lightClouds917/springboot-dubbo-zookeeper
具体步骤分为五部:
- 1.安装,启动zookeeper
- 2.新建dubbo-api项目
- 3.新建dubbo-server项目
- 4.新建dubbo-client项目
- 5.启动项目
1.安装,启动zookeeper
如果基础的linux命令不熟练,请参考:Linux—(1)linux常用命令
- 下载
地址: http://www.apache.org/dyn/closer.cgi/zookeeper
- 解压
tar zxvf zookeeper-3.4.8.tar.gz
- 配置文件
在 conf 目录新建 zoo.cfg ,配置如下
tickTime=2000
dataDir=/javaee/zookeeper/data
dataLogDir=/javaee/zookeeper/log
clientPort=2181
- 启动
bin目录下,启动
cd zookeeper-3.3.6/bin
./zkServer.sh start
2.新建dubbo-api项目
此项目主要是用于存放dubbo-server,dubbo-client公用的东西,比如实体类,服务接口等。
1.User实体
package com.java4all.domain;
import java.io.Serializable;
/**
* Author: momo
* Date: 2018/6/9
* Description:用户实体
*/
public class User implements Serializable{
private static final long serialVersionUID = -6591900875272367270L;
private Integer id;
private String name;
private Integer age;
public User() {
}
public User(Integer id, String name, Integer age) {
this.id = id;
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
2.接口
package api;
import com.java4all.domain.User;
/**
* Author: momo
* Date: 2018/6/9
* Description:对外服务的接口
*/
public interface UserApi {
/**根据id查询user*/
User getUserById(Integer id);
}
3.新建dubbo-server项目
此项目用来实现dubbo-api项目中对外暴露的服务接口。
1.引入dubbo相关依赖
<!-- Spring Boot Dubbo 依赖 -->
<dependency>
<groupId>io.dubbo.springboot</groupId>
<artifactId>spring-boot-starter-dubbo</artifactId>
<version>1.0.0</version>
</dependency>
<!--log4j-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.9</version>
</dependency>
<!--api模块-->
<dependency>
<groupId>com.java4all</groupId>
<artifactId>api</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
2.配置文件application.properties
server.port=8011
## Dubbo 服务提供者配置
spring.dubbo.application.name=provider
spring.dubbo.registry.address=zookeeper://xx.xx.xx.xx:2181
spring.dubbo.protocol.name=dubbo
spring.dubbo.protocol.port=20880
# 这个扫描到实现类的所在包
spring.dubbo.scan=com.java4all.apiImpl
3.接口实现类
package com.java4all.apiImpl;
import api.UserApi;
import com.alibaba.dubbo.config.annotation.Service;
import com.java4all.domain.User;
/**
* Author: momo
* Date: 2018/6/9
* Description:接口服务实现类
*/
//对外暴露为dubbo服务,注意,这个@service为dubbo的@service,版本号可不要,或者自定义
@Service(version = "1.0.0")
public class UserApiImpl implements UserApi
{
@Override
public User getUserById(Integer id) {
return new User(id,"汪汪啊",22);
}
}
4.新建dubbo-client项目
此项目,我们用来调用对外暴露的接口。
1.引入dubbo相关依赖
<!-- Spring Boot Dubbo 依赖 -->
<dependency>
<groupId>io.dubbo.springboot</groupId>
<artifactId>spring-boot-starter-dubbo</artifactId>
<version>1.0.0</version>
</dependency>
<!--log4j-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.9</version>
</dependency>
<!--api模块-->
<dependency>
<groupId>com.java4all</groupId>
<artifactId>api</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
2.配置文件application.properties
server.port=8022
## Dubbo 服务消费者配置
spring.dubbo.application.name=consumer
spring.dubbo.registry.address=zookeeper://xx.xx.xx.xx:2181
spring.dubbo.scan=com.java4all.controller
3.接口实现类
package com.java4all.controller;
import api.UserApi;
import com.alibaba.dubbo.config.annotation.Reference;
import com.java4all.domain.User;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
/**
* Author: momo
* Date: 2018/6/9
* Description:
*/
@RestController
@RequestMapping(value = "user")
public class UserController {
//指定服务实现类以及版本
@Reference(version = "1.0.0")
private UserApi userApi;
@RequestMapping(value = "getUserById",method = RequestMethod.GET)
public User getUserById(Integer id){
//调用服务提供的方法
return userApi.getUserById(88);
}
}
5.启动项目
启动顺序为api,server,client;然后我们访问接口,发现服务被调用。
整合过程中遇到什么问题,欢迎留言探讨。