环境准备
zookeeper
IDEA / eclipse 开发工具
SpringBoot
安装zookeeper
先去zookeeper.zip下载安装,解压到自己所在的文件目录
进入conf 文件夹复制一份zoo_sample.cfg 副本,然后修改文件名为 zoo.cfg
我项目用的zookeeper版本为3.5.8,配置如下
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=D:\\zookeeper\\data
dataLogDir=D:\\zookeeper\\log
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
clientPort:这个端口就是客户但连接Zookeeper服务器的端口,Zookeeper会监听这个端口,接收客户端的访问请求
dataDir:保存数据的目录
dataLogDir:保存日志的目录
tickTime:这个时间事作为zookeeper服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每隔tickTime时间就会发送一个心跳
initLimit:配置zookeeper接受客户端初始化连接时最长能忍受多少个心跳时间间隔数,当已经超过initLimit(默认为10)个心跳的时间(也就是tickTime)长度后Zookeeper服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。总的时间长度就是5*2000=10秒
syncLimit:配置Leader与Follower之间发送信息,请求与应答时间长度,最长不能超过多少个tickTime的时间长度,总的时间长度就是2*2000=4秒
在/bin目录下有个脚本:zkCleanup.sh可以手动清理快照和事务日志;
定时清理(zookeeper从3.4.0开始提供了自动清理快照和事务日志的功能)以下两个参数配合使用:
autopurge.snapRetainCount:指定了需要保留的文件数目。默认事保留3个。
autopurge.purgeInterval:指定了清理频率,单位是小时,需要填写一个1或者更大的数字,默认是0,表示不开启自己清理功能。
如果要配置zookeeper 集群可以参考 zookeeper 集群搭建
运行zookeeper 服务端
进入bin目录 window 下直接双击 zkServer.cmd 文件。linux 就运行 zkServer.sh
显示如下基本成功
打开zkCli.cmd 查看zookeeper 结构目录
输入 ls / 命令
正常启动的话只有一个 [zookeeper ]
dubbo api
工程目录如下
maven 配置 pom.xml
<?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>hk.com.hkbn.itbss</groupId>
<artifactId>dubbo-api</artifactId>
<version>0.0.1</version>
<properties>
<java.version>1.8</java.version>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
接口定义 ava service interface
package hk.com.hkbn.itbss.service;
import hk.com.hkbn.itbss.entity.User;
import java.util.List;
/**
* Created by wy on 2020/08/21.
*/
public interface DemoService {
List<String> getPermissions(Long id);
User getUser();
}
实体 user entity
package hk.com.hkbn.itbss.entity;
import java.io.Serializable;
public class User implements Serializable {
private static final long serialVersionUID = 7739394865008699599L;
private Long id;
private String username;
private String password;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
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;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
dubbo provider
provider 工程目录结构如下
maven 配置 pom.xml
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.9.RELEASE</version>
</parent>
<groupId>hk.com.hkbn.itbss</groupId>
<artifactId>dubbo-provider</artifactId>
<version>0.0.1</version>
<name>dubbo-provider</name>
<description>Demo project for Spring Boot</description>
<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>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- dubbo与spring boot整合的包 -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.3</version>
</dependency>
<!-- 注册中心是zookeeper -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.2.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.2.0</version>
</dependency>
<!-- dubbo底层的通信方式 -->
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.24.Final</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
<!--引入api-->
<dependency>
<groupId>hk.com.hkbn.itbss</groupId>
<artifactId>dubbo-api</artifactId>
<version>0.0.1</version>
<scope>compile</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
接口实现类 DemoServiceImpl.java
package hk.com.hkbn.itbss.provider;
import hk.com.hkbn.itbss.entity.User;
import hk.com.hkbn.itbss.service.DemoService;
import org.apache.dubbo.config.annotation.Service;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
@Component
@Service(interfaceClass = DemoService.class)
public class DemoServiceImpl implements DemoService {
@Override
public List<String> getPermissions(Long aLong) {
List<String> list = new ArrayList<>();
list.add("DomeProvider1");
return list;
}
@Override
public User getUser() {
User user = new User();
user.setId(1L);
user.setPassword("123456");
user.setUsername("jack");
return user;
}
}
provider 程序入口 DubboProviderApplication.java
package hk.com.hkbn.itbss;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DubboProviderApplication {
public static void main(String[] args) {
SpringApplication.run(DubboProviderApplication.class, args);
}
}
provider resource application.yml配置文件
server:
port: 6001
#spring:
dubbo:
application:
name: dubbo-provider
registry:
address: zookeeper://127.0.0.1:2181
protocol:
name: dubbo
port: 20880
serialization: fastjson
scan:
base-packages: hk.com.hkbn.itbss
dubbo consumer
工程目录结构
maven pom.xml
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>hk.com.hkbn.itbss</groupId>
<artifactId>dubbo-consumer</artifactId>
<version>0.0.1</version>
<name>dubbo-consumer</name>
<description>Demo project for Spring Boot</description>
<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>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- dubbo与spring boot整合的包 -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.3</version>
</dependency>
<!-- 注册中心是zookeeper -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.2.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.2.0</version>
</dependency>
<!-- dubbo底层的通信方式 -->
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.24.Final</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
<!--引入api-->
<dependency>
<groupId>hk.com.hkbn.itbss</groupId>
<artifactId>dubbo-api</artifactId>
<version>0.0.1</version>
<scope>compile</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
consumer 控制器 ProductController.java
package hk.com.hkbn.itbss.controller;
import com.alibaba.fastjson.JSON;
import hk.com.hkbn.itbss.entity.User;
import hk.com.hkbn.itbss.service.DemoService;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
/**
* 产品controller
*/
@RestController
public class ProductController {
@Reference
private DemoService demoService;
/**
* 添加完 返回总共消费
* @param a
* @return
*/
@RequestMapping("/add")
public String getCost(Long a){
return JSON.toJSONString(demoService.getPermissions(a)) ;
}
@GetMapping("/user")
@ResponseBody
public User getUser(){
return demoService.getUser();
}
}
consumer 程序主入口
package hk.com.hkbn.itbss;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DubboConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(DubboConsumerApplication.class, args);
}
}
consumer 配置文件application.yml
server:
port: 6002
#spring:
dubbo:
application:
name: dubbo-consumer
registry:
address: zookeeper://127.0.0.1:2181
protocol:
name: dubbo
port: 20880
serialization: fastjson
scan:
base-packages: hk.com.hkbn.itbss
程序运行的顺序
先打开zookeeper server 服务注册中心、zookeeper client 客户端
运行dubbo-api 的package 打包成jar ,不然dubbo-provider 和dubbo-consumer 无法引用jar
先运行dubbo-provider ,运行之后zookeeper server 会收到注册信息创建dubbo 路径
之后看一下zookeeper client 客户端 是否有注册service 不然consumer 会出现空指针
最后启动 dubbo-consumer (一定要先启动dubbo-provider),
启动完访问项目http://localhost:6002/user