SpringBoot2.0+Dubbo+Zookeeper 实现简单的服务调用
网上t整合DUBBO的springBoot大都是1.#版本的,现在springBoot 的版本都已经2.#了,springBoot版本升级后区别跟之前还是挺大的,网上的例子百分之九十的整合有问题(反正拉下来的代码是不能运行的),而且还都是配置xml。我个人还是喜欢升级后的springBoot,做项目也大多用的是2.#的版本。恰好,项目中正好用到了dubbo,自己整合一版就当学习!
1. 项目结构
项目地址:git 地址
说明:项目为子父模块,dubboExample为父工程,红框中的为子模块。
1.1 父工程 pom.xml
<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>com.zxf</groupId>
<artifactId>dubboExample</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>dubboExample</name>
<description>dubboExample</description>
<packaging>pom</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<java.version>1.8</java.version>
<curator-framework>4.0.1</curator-framework>
<zookeeper.version>3.4.13</zookeeper.version>
<dubbo.starter.version>0.2.0</dubbo.starter.version>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.1.RELEASE</version>
</parent>
<dependencies>
<!-- SpringBoot 整合 Web组件 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>${dubbo.starter.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<modules>
<module>consumers</module>
<module>providers</module>
<module>common</module>
</modules>
</project>
说明:这里跟网上其他的不同,只引入<dubbo.starter.version>0.2.0</dubbo.starter.version>
是因为依赖中自己引入了zookeeper及其客户端,所以我没有额外引入。
1.2 common 模块
说明:只有一个接口,接口中有一个testRpc 方法
public interface BookService {
String testRpc(String name);
}
1.3 providers 模块
1.3.1 pom.xml
<!--引入common模块-->
<dependency>
<groupId>com.zxf</groupId>
<artifactId>common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
1.3.2 application.properties
server.port=8001
#注册到注册中心的名称
dubbo.application.name=service-providers
#采用协议和端口号
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880
#注册中心地址
dubbo.registry.address=zookeeper://localhost:2181
#控制台彩色输出
spring.output.ansi.enabled=always
1.3.3 定义BookServiceImpl 实现 BookService
package com.zxf.provider.serviceImpl;
import org.springframework.beans.factory.annotation.Value;
import com.alibaba.dubbo.config.annotation.Service;
import com.zxf.common.service.BookService;
@Service()
public class BookServiceImpl implements BookService {
@Value("${server.port}")
private String provitePort;
@Override
public String testRpc(String name) {
// TODO Auto-generated method stub
return "接受到的name=" + name + " 端口号为=" + provitePort;
}
}
注意:这里的@Service是com.alibaba.dubbo.config.annotation.Service;
1.3.4 启动类
package com.zxf.provider;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
@EnableDubbo
@SpringBootApplication
public class ProviderApp {
public static void main(String[] args) throws InterruptedException {
SpringApplication.run(ProviderApp.class, args);
}
}
注意:加上@EnableDubbo 它会自动扫描有“@Service”的类,将其暴露为服务。
服务提供者配置完毕,启动服务(一定先启动注册中心,要不然会报错,有关zookeeper请自己去查资料),如下所示表明服务提供者已经注册等到注册中心:
或者打开dubbo-admin
1.4 consumers 模块
1.4.1 pom.xml
<!-- 引入common模块 -->
<dependency>
<groupId>com.zxf</groupId>
<artifactId>common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
1.4.2 application.properties
#tomcat端口号
server.port=8082
dubbo.application.name=service-consumers
#zookeeper注册中心的地址
dubbo.registry.address=zookeeper://localhost:2181
dubbo.protocol.name=dubbo
#dubbo默认超时为1s,有时服务调用会超过默认时间,所以设置超时稍微大一点
dubbo.consumer.timeout=5000
#控制台彩色输出
spring.output.ansi.enabled=always
1.4.3 定义 controller
package com.zxf.consumer.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.ResponseBody;
import com.alibaba.dubbo.config.annotation.Reference;
import com.zxf.common.service.BookService;
@RestController
public class BookController{
// dubbo用@Reference 调用服务
@Reference
private BookService bookService;
@RequestMapping(value = "testRpc/", method = RequestMethod.GET)
@ResponseBody
public String testRpc(String name){
return bookService.testRpc(name);
}
}
注意:dubbo 中 用 @Reference 调用服务
1.4.4 启动类
package com.zxf.consumer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
@EnableDubbo
@SpringBootApplication
public class ConsumerApp{
public static void main(String[] args) {
SpringApplication.run(ConsumerApp.class, args);
}
}
启动消费端,再查看dubbo-admin:
如上所示,服务提供者和服务消费者都已注册到zookeeper。
访问:http://127.0.0.1:8082/testRpc/?name=20200403,如下所示,服务调用成功:
至此,springBoot2.0+dubbo+zookeeper 实现服务调用完成!