spring boot + dubbo + zookeeper 搭建及问题解决

Dubbo 是一款高性能Java RPC框架,如今有不少公司都在使用,鉴于技多不压身的原则,折腾一下这玩意java

简介

  • spring boot 是当前比较流行的开发工具组合框架,他并非一个新框架;因为它集合了不少其余的框架和工具,因此用起来很方便
  • zookeeper 是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操做。最终,将简单易用的接口和性能高效、功能稳定的系统提供给用户。也是dubbo推荐的注册中心

安装

安装zookeeper

下载地址 zookeeperlinux

解压后启动 windowsgit

bin/zkServer.cmd

Linuxgithub

./zkServer.sh

dubbo 管理控制台dubbo-admin

2.6.x 版本后 dubbo-admin 库被迁移新地址 dubbo-admin 部分功能尚不能使用,并且是英文的web

这里使用 2.5.x ,依然仍是原来的仓库,只不过须要将分支切换到 2.5.x 才能下载到spring

下载下来以后打包apache

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

target目录下的dubbo-admin-2.5.10.war放到tomcat中运行 windows

注意:dubbo-admin不支持jdk1.8,因此要更改 jdk 环境变量, 这里提供不更改 jdk 环境变量的方法api

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

window 修改 setclasspath.bat在开头加入jdktomcat

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 注解中指定

结语

若是学习中遇到困难,欢迎留言讨论

相关文章
相关标签/搜索