由于公司使用的是springboot+dubbo的分布式架构,虽然个人更偏向于springcloud,但是日常中使用dubbo更多,所以也参考了很多的资料,自己搭建了一个基于目前最新版本的RPC服务demo。(springboot 2.0.5+dubbo2.6.3+zookeeper3.4.10)用来熟悉dubbo和学习相关技术,把搭建过程记录下来,防止自己和他人踩坑。
下图是dubbo官网给的图。在系统越来越庞大的情况下,分布式就显得尤为重要了,应用之间交互是不可避免的,将核心业务抽取出来,作为独立的服务,然后逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。此时,用于提高业务复用及整合的分布式服务框架(RPC)是关键。
在项目搭建之前首先需要一个注册中心,dubbo推荐使用zookeeper,所以我这里使用的也是zookeeper,下载地址:http://zookeeper.apache.org/。下载完成后解压就行。不会的参考:http://dubbo.apache.org/zh-cn/docs/admin/install/zookeeper.html
首先使用idea创建一个空的springboot项目用来做多模块的父工程:spring-boot-dubbo-parent。这里要注意把打包方式改为pom类型。代码如下:
4.0.0
com.wangzc
spring-boot-dubbo-parent
0.0.1-SNAPSHOT
pom
spring-boot-dubbo-parent
Demo project for Spring Boot
org.springframework.boot
spring-boot-starter-parent
2.0.5.RELEASE
UTF-8
UTF-8
1.8
org.springframework.boot
spring-boot-maven-plugin
然后在父工程下创建一个module:spring-boot-dubbo-api。用来存放所有的公共接口。pom文件同上,打包类型为jar。
再创建一个服务生产者:spring-boot-dubbo-provider。这里需要添加dubbo以及zookeeper的包,同时使用dubbo官方给出的starter。github地址:https://github.com/apache/incubator-dubbo-spring-boot-project(不是alibaba的那个,那个不维护了。)同时引入刚才创建的api。
4.0.0
com.wangzc
spring-boot-dubbo-provider
0.0.1-SNAPSHOT
jar
spring-boot-dubbo-provider
Demo project for Spring Boot
org.springframework.boot
spring-boot-starter-parent
2.0.5.RELEASE
UTF-8
UTF-8
1.8
org.springframework.boot
spring-boot-starter
org.springframework.boot
spring-boot-starter-test
test
com.wangzc
spring-boot-dubbo-api
0.0.1-SNAPSHOT
com.alibaba
dubbo
2.6.3
org.apache.zookeeper
zookeeper
3.4.10
org.slf4j
slf4j-log4j12
log4j
log4j
com.alibaba.boot
dubbo-spring-boot-starter
0.2.0
org.springframework.boot
spring-boot-maven-plugin
最后一个就是服务消费者了:spring-boot-dubbo-consumer。pom文件同上,多了一个web包。
org.springframework.boot
spring-boot-starter-web
parent的pom文件引入3个module
spring-boot-dubbo-api
spring-boot-dubbo-provider
spring-boot-dubbo-consumer
这里就用dubbo官网给出的最简单的sayHello例子用来验证服务是否发布成功,在api的module包下创建一个接口用来提供服务。
package com.FarStars.springbootdubboapi.service;
/**
* @author FarStars
* @date 2018/9/13
*/
public interface HelloService {
/**
* sayHello
*
* @author FarStars
* @param name name
* @return java.lang.String
*/
String sayHello(String name);
}
provider的application.properties配置文件:
# Spring boot application
spring.application.name = spring-boot-dubbo-provider
server.port = 9090
management.port = 9091
# Service version
provider.service.version = 1.0.0
# Base packages to scan Dubbo Components (e.g @Service , @Reference)
# 实现类的包路径(换成自己的)
dubbo.scan.basePackages = com.xxx.springbootdubboprovider.impl
# Dubbo Config properties
## ApplicationConfig Bean
dubbo.application.id = dubbo-provider
dubbo.application.name = dubbo-provider
## ProtocolConfig Bean
dubbo.protocol.id = dubbo
dubbo.protocol.name = dubbo
dubbo.protocol.port = 20880
## RegistryConfig Bean
dubbo.registry.id = my-registry
# zookeeper的地址(换成自己的)
dubbo.registry.address = zookeeper://xxx:2181
HelloService的实现类,注意这里要用dubbo的service注解,不是spring的。
package com.FarStars.springbootdubboprovider.impl;
import com.alibaba.dubbo.config.annotation.Service;
import com.FarStars.springbootdubboapi.service.HelloService;
/**
* @author FarStars
* @date 2018/9/13
*/
@Service(
version = "${provider.service.version}",
application = "${dubbo.application.id}",
protocol = "${dubbo.protocol.id}",
registry = "${dubbo.registry.id}"
)
public class HelloServiceImpl implements HelloService {
/**
* sayHello
*
* @param name name
* @return java.lang.String
* @author FarStars
*/
@Override
public String sayHello(String name) {
return "Hello, " + name;
}
}
consumer的application.properties配置文件:
# Spring boot application
spring.application.name = spring-boot-dubbo-consumer
server.port = 8080
management.port = 8081
# Service Version
consumer.service.version = 1.0.0
# Dubbo Config properties
## ApplicationConfig Bean
dubbo.application.id = dubbo-consumer
dubbo.application.name = dubbo-consumer
## ProtocolConfig Bean
dubbo.protocol.id = dubbo
dubbo.protocol.name = dubbo
dubbo.protocol.port = 20880
HelloController类:
package com.FarStars.springbootdubboconsumer.controller;
import com.alibaba.dubbo.config.annotation.Reference;
import com.FarStars.springbootdubboapi.service.HelloService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
* @author FarStars
* @date 2018/9/13
*/
@RestController
public class HelloController {
@Reference(
version = "${consumer.service.version}",
application = "${dubbo.application.id}",
url = "dubbo://localhost:20880"
)
private HelloService helloService;
@RequestMapping("/sayHello")
public String sayHello(@RequestParam String name) {
return helloService.sayHello(name);
}
}
启动类上要加controller包扫描
@SpringBootApplication(scanBasePackages =
"com.FarStars.springbootdubboconsumer.controller")
这样就算搭建完成了,测试时先启动provider,再启动consumer。
示例 Controller
: http://localhost:8080/sayHello?name=FarStars 网页输出如下,表示服务发布成功
本文参考:dubbo官网:http://dubbo.apache.org/zh-cn/index.html
starter中文文档:https://github.com/apache/incubator-dubbo-spring-boot-project/blob/master/README_CN.md
也可以引入actuator包检查健康状态,请参考以上文档。
(本人才疏学浅,如有错误纯属正常,欢迎指出!)