Apache Dubbo
Это высокопроизводительная и легкая программа с открытым исходным кодом.Java
RPC
Framework, которая обеспечивает три основные возможности: ориентированный на интерфейс вызов удаленных методов, интеллектуальную отказоустойчивость и балансировку нагрузки, а также автоматическую регистрацию и обнаружение служб.
Примечание, да
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