SpringBoot+Dubbo+Zookeeper搭建教程
寫在前面的話:技術路上的坑只能一個一個的踩過去了嗎?以爲很簡單,但還是浪費了很長時間。。。這是目前發現的配置最簡單的一種搭建方式。
項目GitHub地址
https://github.com/libaolei007/springboot-dubbo-zookeeper
搭建前需要安裝Zookeeper
https://blog.csdn.net/weixin_39819880/article/details/98472507
文章目錄
一.創建名稱爲springboot-dubbo-zookeeper的Maven項目
項目創建完成之後,注意檢查一下Maven的配置
二.創建module名稱爲api的Maven項目
api中一般存放entity實體類和service接口,consumer和provider模塊都需要依賴這個模塊。
三.創建module名稱爲consumer的springboot項目
consumer作爲消費者的角色,可以存放controller控制類,當然,如果有其他的,比如攔截器,權限控制,也可以放這裏。
四.創建module名稱爲provider的springboot項目
provider作爲消費者角色,可以存放service接口的實現類,如果項目中集成了mybatis,也可以放在這個模塊下
五.項目配置
1.配置springboot-dubbo-zookeeper
在springboot-dubbo-zookeeper的pom.xml文件添加module依賴
<modules>
<module>api</module>
<module>consumer</module>
<module>provider</module>
</modules>
2.配置api
2.1配置api的pom.xml
添加
<packaging>jar</packaging>
2.2創建DemoService接口
package com.rpc.api;
public interface DemoService {
String sayHello(String name);
}
[外鏈圖片轉存失敗(img-8OhtlkxK-1565009124239)(./1565000077208.png)]
3.配置consumer
3.1配置consumer的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>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.rpc.consumer</groupId>
<artifactId>consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>consumer</name>
<description>Demo project for Spring Boot</description>
<packaging>jar</packaging>
<properties>
<java.version>1.8</java.version>
<dubbo-spring-boot>1.0.0</dubbo-spring-boot>
</properties>
<dependencies>
<!-- 添加對api模塊的依賴 -->
<dependency>
<groupId>com.rpc.demo</groupId>
<artifactId>api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- Spring Boot Dubbo 依賴 -->
<dependency>
<groupId>io.dubbo.springboot</groupId>
<artifactId>spring-boot-starter-dubbo</artifactId>
<version>${dubbo-spring-boot}</version>
<exclusions>
<exclusion>
<artifactId>slf4j-log4j12</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</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>
主要修改三點:
3.2配置consumer的application.properties
## 避免和provider工程端口衝突
server.port=7001
## Dubbo 服務消費者配置
spring.dubbo.application.name=consumer
## Dubbo 服務對象的註冊中心zookeeper的地址和端口
spring.dubbo.registry.address=zookeeper://192.168.19.22:2181
## 服務對象的被注入的包掃描範圍
spring.dubbo.scan=com.rpc.consumer.controller
3.3建立DemoController類
package com.rpc.consumer.controller;
import com.alibaba.dubbo.config.annotation.Reference;
import com.rpc.api.DemoService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/demo")
public class DemoController {
@Reference(version = "1.0.0")
private DemoService demoService;
@RequestMapping("/getHello")
public String getHello() {
return demoService.sayHello("李保磊");
}
}
4.配置provider
4.1配置provider的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>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.rpc.provider</groupId>
<artifactId>provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>provider</name>
<description>Demo project for Spring Boot</description>
<packaging>jar</packaging>
<properties>
<java.version>1.8</java.version>
<dubbo-spring-boot>1.0.0</dubbo-spring-boot>
</properties>
<dependencies>
<!-- 添加對api模塊的依賴 -->
<dependency>
<groupId>com.rpc.demo</groupId>
<artifactId>api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- Spring Boot Dubbo 依賴 -->
<dependency>
<groupId>io.dubbo.springboot</groupId>
<artifactId>spring-boot-starter-dubbo</artifactId>
<version>${dubbo-spring-boot}</version>
<exclusions>
<exclusion>
<artifactId>slf4j-log4j12</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
<!-- zookeeper -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.12</version>
</dependency>
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</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>
主要修改四點
4.2配置provider的application.properties
server.port=8001
## Dubbo 服務提供者配置
spring.dubbo.application.name=provider
## Dubbo 服務對象的註冊中心zookeeper的地址和端口
spring.dubbo.registry.address=zookeeper://192.168.19.22:2181
## 用Dubbo協議在20880端口暴露服務
spring.dubbo.protocol.name=dubbo
spring.dubbo.protocol.port=20880
## 包掃描範圍
spring.dubbo.scan=com.rpc.provider.impl;
4.3創建DemoServiceImpl.java
@Service
註解,是dubbo提供的註解
package com.rpc.provider.impl;
import com.alibaba.dubbo.config.annotation.Service;
import com.rpc.api.DemoService;
@Service(version = "1.0.0")
public class DemoServiceImpl implements DemoService {
@Override
public String sayHello(String name) {
return "Hello" + name;
}
}
5.項目啓動
5.1 啓動zookeeper
首先要啓動zookeeper,它是註冊中心,沒有啓動的話,provider的服務提供者怎麼註冊呢?
5.2 將api安裝到consumer和provider模塊中
注意,由於consumer和provider都依賴api,那麼要將api模塊通過maven,依次通過clean,install命令,將api安裝到consumer和provider模塊中。
5.3 啓動provider
啓動provider,將服務註冊到zookeeper中心
5.4啓動consumer
5.5測試
@Reference註解引入的service實例爲null
我哭了,你呢???
哭了幾個小時之後,我好了!
我的原因是:
首先檢查一下你的spring boot版本是多少?
如果是2.X 不用看了,spring boot 2.x 必定會出現這個問題,
改爲 1.5.8 版本。
將consumer和provider裏面的pom.xml文件裏的parenet標籤下的version標籤內容改爲1.5.8.RELEASE
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.8.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>