spring boot + dubbo + zookeeper 搭建及問題解決

Dubbo 是一款高性能Java RPC框架,現在有很多公司都在使用,鑑於技多不壓身的原則,折騰一下這玩意

簡介

  • spring boot 是當前比較流行的開發工具組合框架,他並不是一個新框架;由於它集合了很多其他的框架和工具,所以用起來很方便
  • zookeeper 是一個分佈式的,開放源碼的分佈式應用程序協調服務,是Google的Chubby一個開源的實現,它是集羣的管理者,監視着集羣中各個節點的狀態根據節點提交的反饋進行下一步合理操作。最終,將簡單易用的接口和性能高效、功能穩定的系統提供給用戶。也是dubbo推薦的註冊中心

安裝

安裝zookeeper

下載地址 zookeeper

解壓後啓動 windows

bin/zkServer.cmd

Linux

./zkServer.sh

dubbo 管理控制檯dubbo-admin

2.6.x 版本後 dubbo-admin 庫被遷移新地址 dubbo-admin 部分功能尚不能使用,而且是英文的

這裏使用 2.5.x ,依然還是原來的倉庫,只不過需要將分支切換到 2.5.x 才能下載到

下載下來之後打包

cd <path>/incubator-dubbo-dubbo-2.5.10/dubbo-admin
mvn install -Dmaven.test.skip=true 

target目錄下的dubbo-admin-2.5.10.war放到tomcat中運行

注意:dubbo-admin不支持jdk1.8,所以要更改 jdk 環境變量, 這裏提供不更改 jdk 環境變量的方法

cd <path>/apache-tomcat-8.5.23/bin

window 修改 setclasspath.bat在開頭加入jdk

set JAVA_HOME=<path>\jdk1.7.0_75
set JRE_HOME=<path>\jdk1.7.0_75\jre


linux 修改 setclasspath.sh

JAVA_HOME=<path>/jdk1.7.0_75
JRE_HOME=<path>/jdk1.7.0_75/jre

啓動tomcat 訪問 http://host:port/dubbo-admin-2.5.10

用戶名和密碼在WEB-INF/dubbo.properties 可修改

Dubbo項目搭建

官方也有相關的示例可供參考 參見:Dubbo Spring-Boot

創建maven項目,項目結構如下

父級模塊pom.xml

添加依賴

<parent>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-parent</artifactId>
	<version>2.0.5.RELEASE</version>
	<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependency>
	<groupId>com.alibaba.boot</groupId>
	<artifactId>dubbo-spring-boot-starter</artifactId>
	<version>0.2.0</version>
</dependency>

在公共模塊寫一個接口

package com.dubbo.api;
public interface DemoService {
	public String helloWorld(String name);
}

生產者模塊

pom.xml

  • 添加父級
<parent>
	<groupId>com.dubbo</groupId>
	<artifactId>DubboDemo</artifactId>
	<version>0.0.1-SNAPSHOT</version>
</parent>
  • 添加公共模塊
<dependency>
	<groupId>com.dubbo</groupId>
	<artifactId>DubboDemoApi</artifactId>
	<version>0.0.1-SNAPSHOT</version>
</dependency>

配置文件

src/main/resources/application.properties

spring.application.name = dubbo-provider-demo
server.port = 9090

# 當前dubbo應用ID
dubbo.application.id=live-dubbo-provider
# 當前dubbo應用名稱
dubbo.application.name=live-dubbo-provider
# 註冊中心
dubbo.registry.address=zookeeper://127.0.0.1:2181
dubbo.server=true	
# 生產者暴露給消費者協議
dubbo.protocol.name=dubbo
# 生產者暴露給消費者端口
dubbo.protocol.port=20880

實現API接口

package com.dubbo.provider.service;

import org.springframework.util.StringUtils;
import com.alibaba.dubbo.config.annotation.Service;
import com.dubbo.api.DemoService;

@Service
public class DemoServiceImpl implements DemoService {
	@Override
	public String helloWorld(String name) {
		return "Hello "+(StringUtils.isEmpty(name) ? "world": name);
	}

}

注意 @Service 註解不是 spring 的註解 而是 com.alibaba.dubbo.config.annotation.Service

啓動類

@EnableDubbo
@SpringBootApplication
public class DubboProviderApp {
	public static void main(String[] args) {
		SpringApplication.run(DubboProviderApp.class, args);
	}
}
  • @EnableDubbo 註解表示 開啓 dubbo 服務 或者在配置文件(application.properties) 添加dubbo.scan ( 掃描 dubbo 包 ) 也可以開啓
  • 可以不是 web 項目

啓動該項目 啓動完成後在 dubbo-admin 能看到有一個應用說明註冊成功,否則不成功

消費者模塊

pom.xml

  • 添加父級
<parent>
	<groupId>com.dubbo</groupId>
	<artifactId>DubboDemo</artifactId>
	<version>0.0.1-SNAPSHOT</version>
</parent>
  • 添加公共模塊
<dependency>
	<groupId>com.dubbo</groupId>
	<artifactId>DubboDemoApi</artifactId>
	<version>0.0.1-SNAPSHOT</version>
</dependency>
  • 添加 spring boot web 支持
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>

配置文件

src/main/resources/application.properties

# Spring boot application
Spring.application.name = dubbo-consumer-demo
server.port = 8010

# 消費者應用ID
dubbo.application.id=live-dubbo-consumer
# 消費者應用名稱
dubbo.application.name=live-dubbo-consumer
# 註冊中心
dubbo.registry.address=zookeeper://127.0.0.1:2181

# 生產者提供的協議ID
dubbo.protocol.id = dubbo
# 生產者提供的協議名稱
dubbo.protocol.name = dubbo
# 生產者提供的協議端口號
dubbo.protocol.port = 20880

啓動類

@SpringBootApplication
public class DubboConsumerApp {
	public static void main(String[] args) {
		SpringApplication.run(DubboConsumerApp.class, args);
	}
}

調用生產者

@RestController
public class DemoConsumerController {

	@Reference
	private DemoService demoService;
	
	@RequestMapping("/hello")
	public String hello(String name) {
		return demoService.helloWorld(name);
	}

}

啓動後訪問 http://host:8010/hello 出現如下界面則表示成功

到此基本的入門是沒有問題了

注意

注意使用了spring-boot + dubbo的配置文件dubbo的配置信息是沒有spring前綴的
錯誤示例

spring.dubbo.application.name=live-dubbo-consumer

這樣 dubbo 是無法獲取的,除非在 @Service 註解中指定

結語

如果學習中遇到困難,歡迎留言討論

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章