本篇是基于Zookeeper实现Dubbo与Spring Boot的集成整合(需要提前准备好zk环境)。
1.创建dubbo-demo工程作为父工程,POM依赖如下
<?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>
<groupId>com.itheima</groupId>
<artifactId>dubbo-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<modules>
<module>dubbo-spring-interface</module>
<module>dubbo-spring-provider</module>
<module>dubbo-spring-consumer</module>
<module>spi-java</module>
</modules>
<packaging>pom</packaging>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<dubbo-version>2.7.8</dubbo-version>
<spring-boot.version>2.3.0.RELEASE</spring-boot.version>
</properties>
<dependencyManagement>
<dependencies>
<!-- Spring Boot -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- Apache Dubbo -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-dependencies-bom</artifactId>
<version>${dubbo-version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>${dubbo-version}</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
</exclusion>
<exclusion>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
</exclusion>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.22</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.22</version>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- Dubbo Spring Boot Starter -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>${dubbo-version}</version>
</dependency>
<!-- Dubbo核心组件 -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
</dependency>
<!--Spring Boot web 依赖 -->
<!--<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring-boot.version}</version>
</dependency>-->
<!-- Zookeeper客户端框架 -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.0.1</version>
</dependency>
<!-- Zookeeper dependencies -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-dependencies-zookeeper</artifactId>
<version>${dubbo-version}</version>
<type>pom</type>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</project>
2.创建公共接口调用工程dubbo-spring-interface
工程结构如下:
定义一个订单服务接口
public interface OrderService {
String getOrder(Long orderId) ;
}
3.创建服务端工程dubbo-spring-provider
工程结构如下:
pom依赖如下:
<?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">
<parent>
<artifactId>dubbo-demo</artifactId>
<groupId>com.itheima</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>dubbo-spring-provider</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- Dubbo Spring Boot Starter -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>${dubbo-version}</version>
</dependency>
<!-- <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>-->
<!-- Dubbo 核心依赖 -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
</dependency>
<!-- 公用RPC接口依赖 -->
<dependency>
<groupId>com.itheima</groupId>
<artifactId>dubbo-spring-interface</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
</project>
application.yml配置文件内容如下:
# 服务端口
server:
port: 18081
# 应用程序名称
spring:
application:
name: dubbo-spring-provider
# dubbo相关配置
dubbo:
scan:
base-packages: com.itheima.service # 服务扫描路径
protocol:
name: dubbo # 通讯协议
port: 20880 # dubbo服务提供方的端口,该默认值 -1代表随机分配
dispatcher: "message"
threads: 300
registry:
address: zookeeper://127.0.01:2181 # 注册中心地址
file: ${user.home}/dubbo-cache/${spring.application.name}/dubbo.cache
#password:
provider:
weight: 100
version: v1.0
timeout: 6000
retries: 3
consumer:
version: v1.0
编写服务端的实现类接口(通过DubboService注解, 声明为RPC服务,version可以标识具体的版本号, 消费端需匹配保持一致。)
@DubboService(
timeout = 4000
,methods = {@Method(name = "getOrder",timeout = 3000)}
,retries = 3
,group = "1"
)
public class OrderServiceImpl implements OrderService {
@Value("${dubbo.protocol.port}")
private String rpcServerPort;
@Value("${dubbo.provider.version}")
private String serviceVersion;
@Override
public String getOrder(Long orderId) {
String result = "get order detail ,orderId="+orderId +",rpcServerPort="+rpcServerPort +",serviceVersion="+serviceVersion;
System.out.println(result);
try {
Thread.sleep(1500);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (orderId == 0L) {
throw new RpcException("请降级");
}
return result;
}
}
服务端启动类编写
package com.itheima;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @description
* @author: ts
* @create:2021-05-25 09:54
*/
@SpringBootApplication
public class DubboSpringProviderApplication {
public static void main(String[] args) {
SpringApplication.run(DubboSpringProviderApplication.class,args);
}
}
4.创建消费端工程
消费端工程接口如下:
pom依赖如下:
<?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">
<parent>
<artifactId>dubbo-demo</artifactId>
<groupId>com.itheima</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>dubbo-spring-consumer</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<!-- Dubbo Spring Boot Starter -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>${dubbo-version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 公用RPC接口依赖 -->
<dependency>
<groupId>com.itheima</groupId>
<artifactId>dubbo-spring-interface</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
</project>
application.yml配置文件如下:
# 服务端口
server:
port: 18084
spring:
application:
name: dubbo-spring-consumer
admin:
enabled: false
dubbo:
scan:
base-packages:
consumer:
loadbalance: random #全局loadbalance配置 random是默认
version: v1.0
#timeout:
check: false
#forks: 3
cluster: failfast
protocol:
name: dubbo # 通讯协议
#port: 20880 # dubbo服务提供方的端口,该默认值
registry:
register: false
address: zookeeper://127.0.0.1:2181
file: ${user.home}/dubbo-cache/${spring.application.name}/dubbo.cache
spring:
provider:
version: 1.0.0 #自定义配置
消费端调用代码编写
package com.itheima.controller;
import com.itheima.api.OrderService;
import org.apache.dubbo.config.annotation.DubboReference;
import org.apache.dubbo.config.annotation.Method;
import org.apache.dubbo.config.annotation.Reference;
import org.apache.dubbo.registry.NotifyListener;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @description
* @author: ts
* @create:2021-05-25 14:25
*/
@RestController
@RequestMapping("/order")
public class OrderController {
@DubboReference(
timeout = 2500
,methods = {
@Method(name = "getOrder",timeout = 2000)
}
,check = false
,retries = 3
,cluster = "failsafe "
//,loadbalance = ""
,loadbalance = "roundrobin"
,group = "1"
//,version = "v2.0"
,stub = "com.itheima.api.stub.OrderServiceStub"
,mock = "com.itheima.api.mock.OrderServiceMock"
)
private OrderService orderService;
@GetMapping("/getOrder")
public String getOrder(Long orderId) {
System.out.println(orderService);
return orderService.getOrder(orderId);
}
public void onreturn(String result,Long orderId) {
System.out.println("返回之后的结果="+result+"-"+orderId);
}
}
消费单启动类编写
package com.itheima;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @description
* @author: ts
* @create:2021-05-25 10:10
*/
@SpringBootApplication
public class DubboSpringConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(DubboSpringConsumerApplication.class,args);
}
}
5.工程调用验证
1. 启动ZK注册中心
2. 启动服务端, 运行DubboSpringProviderApplication
3. 启动消费端, 运行DubboSpringConsumerApplication
4. 请求获取订单接口, 地址: http://127.0.0.1:18084/order/getOrder?
orderId=1001
调用成功:浏览器成功返回数据