Apache DubboЭто высокопроизводительная и легкая программа с открытым исходным кодом.Java RPCFramework, которая обеспечивает три основные возможности: ориентированный на интерфейс вызов удаленных методов, интеллектуальную отказоустойчивость и балансировку нагрузки, а также автоматическую регистрацию и обнаружение служб.
Примечание, да
Apache Dubbo,Больше неAlibaba Dubbo. Проще говоряAlibabaбудетDubboсдать вApacheСообщество с открытым исходным кодом для обслуживания. видетьdubbo-spring-boot-project
старая версияDubboсмотрите подробностиSpring Boot Series: интеграция Alibaba Dubbo
1. Примеры этой статьи
1.1 Версия фреймворка
-
DubboВерсия
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.5</version>
</dependency>
-
Spring BootВерсия
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.1.RELEASE</version>
<relativePath/>
</parent>
1.2 Связь модуля
- корневой проект
order: управлять инженерной информацией; - подинжиниринг
order-api:определениеRPCИнтерфейс службы, параметры и результирующий набор результатов ответа; - подинжиниринг
order-provider:RPCпоставщик услуги; - подинжиниринг
order-consumer:RPCПотребительская сторона сервиса, реальная ситуация в реальном процессе разработки такова, что другие сервисы вызывают заказRPCСлужить
Во-вторых, корневой проект
2.1 Создать проектorder
Я здесь ради старой версии
alibabaизdubboОтличие проекта, имя файла берется какapache-dubbo-demo,mavenНазвание проектаorder.
Основная функция этого проекта — определение информации о проекте, управление версиями зависимостей всего проекта и т. д., поэтомуsrcСправочник не требуется.
2.2 pom.xml
используется в корневом проекте<dependencyManagement>и<dependencies>Займитесь управлением зависимостями.
-
<dependencyManagement>: объявить глобальную зависимость, и зависимость будет унаследована, когда подпроект указывает ссылку; -
<dependencies>: Объявляйте глобальные зависимости, а подпроекты напрямую и автоматически наследуют зависимости.
<?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>
<!-- 父级引用 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.1.RELEASE</version>
<relativePath/>
</parent>
<!-- 基本信息 -->
<groupId>cn.van.order</groupId>
<artifactId>order</artifactId>
<version>1.0.0-SNAPSHOT</version>
<name>${project.artifactId}</name>
<description>Apache Dubbo 根项目</description>
<!--配置-->
<properties>
<java.version>1.8</java.version>
<dubbo.version>2.7.5</dubbo.version>
<zookeeper.version>3.4.14</zookeeper.version>
</properties>
<!-- 子项目 -->
<modules>
<module>order-api</module>
<module>order-provider</module>
<module>order-consumer</module>
</modules>
<!--声明全局依赖(子项目需要显示的引用才会继承依赖)-->
<dependencyManagement>
<dependencies>
<!-- dubbo-start依赖 -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>${dubbo.version}</version>
</dependency>
<!--zookeeper 注册中心客户端引入 使用的是curator客户端 -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-dependencies-zookeeper</artifactId>
<version>${dubbo.version}</version>
<type>pom</type>
<exclusions>
<exclusion>
<artifactId>slf4j-log4j12</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</dependencyManagement>
<!--声明全局依赖(子项目不需要显示的引用,自动继承依赖)-->
<dependencies>
<!-- spring boot 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<!-- 打包插件 -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
три,order-api
3.1 Зависимости проекта
Больше никаких зависимостей не требуется, так что это просто.
<?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>
<parent>
<groupId>cn.van.order</groupId>
<artifactId>order</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<groupId>cn.van.order</groupId>
<artifactId>order-api</artifactId>
<version>1.0.0-SNAPSHOT</version>
<name>${project.artifactId}</name>
<description>dubbo公共项目</description>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
3.2 УпаковкаRPCнабор результатов
- Сначала инкапсулируйте класс перечисления кода возврата
ResultCodeEnum.java
public enum ResultCodeEnum {
/*** 通用部分 100 - 599***/
// 成功请求
SUCCESS(200, "successful"),
/*** 这里可以根据不同模块用不同的区级分开错误码,例如: ***/
// 1000~1999 区间表示用户模块错误
// 2000~2999 区间表示订单模块错误
// 3000~3999 区间表示商品模块错误
// 。。。
ORDER_NOT_FOUND(2000, "order not found"),
;
/**
* 响应状态码
*/
private Integer code;
/**
* 响应信息
*/
private String message;
ResultCodeEnum(Integer code, String msg) {
this.code = code;
this.message = msg;
}
public Integer getCode() {
return code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
- Сначала инкапсулируйте набор результатов ответа RPC.
RpcResult.java
public class RpcResult <T> implements Serializable {
/**
* 是否响应成功
*/
private Boolean success;
/**
* 响应状态码
*/
private Integer code;
/**
* 响应数据
*/
private T data;
/**
* 错误信息
*/
private String message;
// 构造器开始
/**
* 无参构造器(构造器私有,外部不可以直接创建)
*/
private RpcResult() {
this.code = 200;
this.success = true;
}
/**
* 有参构造器
* @param obj
*/
private RpcResult(T obj) {
this.code = 200;
this.data = obj;
this.success = true;
}
/**
* 有参构造器
* @param resultCode
*/
private RpcResult(ResultCodeEnum resultCode) {
this.success = false;
this.code = resultCode.getCode();
this.message = resultCode.getMessage();
}
// 构造器结束
/**
* 通用返回成功(没有返回结果)
* @param <T>
* @return
*/
public static<T> RpcResult<T> success(){
return new RpcResult();
}
/**
* 返回成功(有返回结果)
* @param data
* @param <T>
* @return
*/
public static<T> RpcResult<T> success(T data){
return new RpcResult<T>(data);
}
/**
* 通用返回失败
* @param resultCode
* @param <T>
* @return
*/
public static<T> RpcResult<T> failure(ResultCodeEnum resultCode){
return new RpcResult<T>(resultCode);
}
public Boolean getSuccess() {
return success;
}
public void setSuccess(Boolean success) {
this.success = success;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
@Override
public String toString() {
return "RpcResult{" +
"success=" + success +
", code=" + code +
", data=" + data +
", message='" + message + '\'' +
'}';
}
}
3.3 НапишитеRPCинтерфейс
public interface OrderDubboService {
RpcResult<OrderDomain> getOrder();
}
организация
OrderDomain.javaЭто очень просто, см.Githubсклад.
Четыре,order-provider
Этот подпроект является проектом класса службы, то есть служба интерфейса зарегистрирована вzookeeperЦентр регистрации используется потребителем.
4.1 Зависимости проекта
<?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>
<parent>
<groupId>cn.van.order</groupId>
<artifactId>order</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<groupId>cn.van.order</groupId>
<artifactId>order-provider</artifactId>
<version>1.0-SNAPSHOT</version>
<name>${project.artifactId}</name>
<description>Dubbo 服务提供者</description>
<dependencies>
<dependency>
<groupId>cn.van.order</groupId>
<artifactId>order-api</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
</dependency>
<!-- zookeeper依赖 -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-dependencies-zookeeper</artifactId>
<version>${dubbo.version}</version>
<type>pom</type>
<exclusions>
<exclusion>
<artifactId>slf4j-log4j12</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
4.2 Интерфейс реализации службы
@Service
public class OrderDubboServiceImpl implements OrderDubboService {
@Override
public RpcResult<OrderDomain> getOrder() {
return RpcResult.success(new OrderDomain(1, 10086, LocalDateTime.now()));
}
}
Уведомление:
@ServiceдаdubboАннотация под пакетом неSpringПримечания внутри.
4.3 Конфигурация проекта
-
dubboКонфигурация используется напрямуюdubbo, уже не сSpringначало; -
base-packages: указывает путь, по которому находится реализация интерфейса.
server:
# 服务端口
port: 7777
spring:
application:
name: order-provider
# dubbo 相关配置(dubbo 的配置不再以 Spring 开头)
dubbo:
application:
# 应用名称
name: order-provider
scan:
# 接口实现者(服务实现)包
base-packages: cn.van.order.service.impl
# 注册中心信息
registry:
address: zookeeper://127.0.0.1:2181
protocol:
# 协议名称
name: dubbo
# 协议端口
port: 20880
пять,order-consumer
Эта подпозиция является статьей потребления, такой как товарный модуль, финансовый модуль и так далее.
5.1 Зависимости проекта
<?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>
<parent>
<groupId>cn.van.order</groupId>
<artifactId>order</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<groupId>cn.van.order</groupId>
<artifactId>order-consumer</artifactId>
<version>1.0-SNAPSHOT</version>
<name>${project.artifactId}</name>
<description>Dubbo 消费者</description>
<dependencies>
<dependency>
<groupId>cn.van.order</groupId>
<artifactId>order-api</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<!-- web项目依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- dubbo依赖 -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
</dependency>
<!-- dubbo的zookeeper依赖 -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-dependencies-zookeeper</artifactId>
<version>${dubbo.version}</version>
<type>pom</type>
<exclusions>
<exclusion>
<artifactId>slf4j-log4j12</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
5.2 Тестовый интерфейс
Смоделируйте интерфейс, чтобы получить информацию о заказе.
@RestController
@RequestMapping("/order")
public class OrderConsumerController {
@Reference
OrderDubboService orderDubboService;
@GetMapping("getOrder")
public RpcResult getOrder() {
return orderDubboService.getOrder();
}
}
Уведомление:@ReferenceПредставленоDubboинтерфейс так себеDubboаннотации.
5.3 Файлы конфигурации
server:
port: 7000
spring:
application:
name: order-consumer
# dubbo 相关配置
dubbo:
application:
name: order-consumer
registry:
address: zookeeper://127.0.0.1:2181
6. Тест
все готово, если вorder-consumerТестовый интерфейс может успешно запрашивать данные, это доказывает, чтоDubboСлужба была успешно построена.
6.1 Запускzookeeper
мы выбираемzookeeperКак реестр, его необходимо запустить перед запуском проекта.
6.2 dubbo-admin
dubbo-adminлегко наблюдатьorder-providerЕсли интерфейс успешно зарегистрирован, пожалуйста, обратитесь к конкретным шагам установки.apache/dubbo-admin
Порт по умолчанию:
8080.
6.3 Запускdubbo-provider
После успешного запуска вы можетеdubbo-admin: Интерфейс был успешноOrderServiceзарегистрироваться наzookeeperВышеизложенное выглядит следующим образом:
Успешно зарегистрировал оправдание в реестре, заявивdubbo-providerВы успешно зарегистрировались.
6.4 Запускorder-cosumer
Запустите потребительский проект и запросите потребительский интерфейс в браузере:http://localhost:7000/order/getOrder, успешные возвращаемые данные выглядят следующим образом:
{
"success":true,
"code":200,
"data":{
"id":1,
"orderNum":10086,
"gmtCreate":"2020-05-06T11:59:45.535"
},
"message":null
}
успешно запрошенorder-providerДанные предоставлены, заявивDubboСтройте успешно!
7. Резюме
Полный код выше, который я загрузил наGithub, вы можете пройти тест самостоятельно, если вам это нужно, добро пожаловатьstar!
7.1 Секреты предков
Blogger Pass CheatsВесенняя коллекция подсолнуховОткрытый исходный код, добро пожаловать, чтобы пожаловаться, упомянутьissues, сообщите блогеру, какую статью обновить следующей,Vanтвердо верю:1 + 1 > 2!
7.2 Культурный обмен
Последняя статья, добро пожаловать на внимание: публичный аккаунт-блог fengchen; обмен мнениями, добро пожаловать на добавление: личный WeChat