написать впереди
Я, как php-программист, перешедший на java-разработку, остаюсь на уровне hello world.Недавно хотел попробовать новую версию dubbo из-за лихорадки, но гитхаб искал снова и снова и не видел демки, и официальный пример дал Нет возможности запустить его в одиночку после копирования.Это не так и не так.В любом случае, это не решило это после полудня.
Поэтому я решил попробовать сам и заполнить пробел поисковой системы.
Среда разработки
- Spring Boot: 2.1.3.RELEASE
- Dubbo: 2.7.1-SNAPSHOT
- Средства разработки: Mac IDEA
реальный бой
Без лишних слов, покажи мне код!
Создать проект
Теперь начните использовать IDEA для создания проекта Spring boot maven без кода.
Выберите проект инициализации Spring Initializr.
Создать модуль
Создайте модуль API, который является определением интерфейса
Создайте сервисный модуль, провайдер сервис-провайдер
Создайте веб-модуль, потребительский потребитель услуг
После создания этого модуля выполните чистую установку mvn, чтобы попробовать, и в результате появится ошибка.
[INFO] skip non existing resourceDirectory /Users/jeftom/workspace/java/dubbo-sample/dubbo-demo/src/main/resources
[INFO]
[INFO] --- maven-compiler-plugin:3.8.0:compile (default-compile) @ dubbo-demo ---
[INFO] No sources to compile
[INFO]
[INFO] --- maven-resources-plugin:3.1.0:testResources (default-testResources) @ dubbo-demo ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory /Users/jeftom/workspace/java/dubbo-sample/dubbo-demo/src/test/resources
[INFO]
[INFO] --- maven-compiler-plugin:3.8.0:testCompile (default-testCompile) @ dubbo-demo ---
[INFO] No sources to compile
[INFO]
[INFO] --- maven-surefire-plugin:2.22.1:test (default-test) @ dubbo-demo ---
[INFO] No tests to run.
[INFO]
[INFO] --- maven-jar-plugin:3.1.1:jar (default-jar) @ dubbo-demo ---
[WARNING] JAR will be empty - no content was marked for inclusion!
[INFO] Building jar: /Users/jeftom/workspace/java/dubbo-sample/dubbo-demo/target/dubbo-demo-0.0.1-SNAPSHOT.jar
[INFO]
[INFO] --- spring-boot-maven-plugin:2.1.3.RELEASE:repackage (repackage) @ dubbo-demo ---
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3.142 s
[INFO] Finished at: 2019-03-23T22:05:17+08:00
[INFO] Final Memory: 24M/395M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:2.1.3.RELEASE:repackage (repackage) on project dubbo-demo: Execution repackage of goal org.springframework.boot:spring-boot-maven-plugin:2.1.3.RELEASE:repackage failed: Unable to find main class -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/PluginExecutionException
Найдите тестовый пример Tests, добавьте аннотацию @Ignore, чтобы перейти первым, и игнорируйте остальные.
Конфигурация основного модуля
Добавить в pom.xml корневого модуля
<packaging>pom</packaging>
<modules>
<module>dubbo-demo-api</module>
<module>dubbo-demo-service</module>
<module>dubbo-demo-web</module>
</modules>
Плагин упаковки также нуждается в корректировке, потому что корневой шаблон не использует основной класс запуска Spring Boot, и его можно в дальнейшем заменить плагином упаковки maven.
<build>
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<plugin>
<artifactId>maven-site-plugin</artifactId>
<version>3.7.1</version>
</plugin>
<plugin>
<artifactId>maven-project-info-reports-plugin</artifactId>
<version>3.0.0</version>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-site-plugin</artifactId>
<configuration>
<locales>en,fr</locales>
</configuration>
</plugin>
</plugins>
<!-- 这里要把 spring boot 自带的 spring-boot-maven-plugin 插件换成 maven-site-plugin,否则 mvn 打包会报错 -->
<!-- <plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins> -->
</build>
Добавьте в pom.xml остальные три подмодуля.
<packaging>jar</packaging>
После завершения модификации выполните mvn clean install, чтобы попробовать
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO]
[INFO] dubbo-demo-api ..................................... SUCCESS [ 5.428 s]
[INFO] dubbo-demo-service ................................. SUCCESS [ 1.299 s]
[INFO] dubbo-demo-web ..................................... SUCCESS [ 3.195 s]
[INFO] dubbo-demo ......................................... SUCCESS [ 0.039 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 11.258 s
[INFO] Finished at: 2019-03-23T22:21:46+08:00
[INFO] Final Memory: 50M/525M
[INFO] ------------------------------------------------------------------------
На шаг ближе к успеху, хотя кода еще нет, хотя бы несколько модулей собраны и пройдены.
модуль dubbo-demo-api
Удалите класс запуска в dubbo-demo-api, потому что этот модуль в основном сохраняет определение интерфейса.
Добавьте класс интерфейса DemoApi
package com.example.dubbo.demo.api;
/**
* Demo 接口定义
*
* @author jeftom
* @date 2019-03-23 22:35
* @since 1.0.0
*/
public interface DemoApi {
String sayHello(String name);
}
Плагин упаковки файла pom изменен на:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
</plugin>
</plugins>
</build>
модуль dubbo-demo-service
Основной функцией этого модуля является реализация интерфейсной, сервис-провайдерской бизнес-функции.
Давайте сначала посмотрим на конфигурацию модуля pom.xml:
<?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.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example.dubbo</groupId>
<artifactId>dubbo-demo-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>dubbo-demo-service</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- dubbo provider 启动不成功的主要问题在这里,没有添加 spring-boot-starter-web 依赖,所以启动日志里一直没有显示 “o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8087 (http)” 这行日志输出 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- 这个是定义的接口包,在 provider 和 consumer 都需要引用的 -->
<dependency>
<groupId>com.example.dubbo</groupId>
<artifactId>dubbo-demo-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<!-- 新增 dubbo 依赖 -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>2.7.1-SNAPSHOT</version>
<exclusions>
<exclusion>
<artifactId>spring</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.10</version>
<exclusions>
<exclusion>
<artifactId>slf4j-log4j12</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.0.1</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
Тут главное сказать, потому что веб-зависимость не проверялась при создании модуля, поэтому в пом есть только spring-boot-starter, и не содержит зависимости spring-boot-starter-web. запуская сервис, он всегда выходит после завершения. , mvn install тоже нормально, я не могу думать об этом, у меня это заняло несколько часов здесь. После добавления зависимости spring-boot-starter-web вы можете увидеть журнал tomcat в журнале запуска
o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8087 (http)
Теперь создадим класс DemoApiImpl, реализующий ответ на метод sayHello:
package com.example.dubbo.demo.service.impl;
import com.example.dubbo.demo.api.DemoApi;
import org.apache.dubbo.config.annotation.Service;
/**
* demo 实现类
*
* @author jeftom
* @date 2019-03-23 23:04
* @since 1.0.0
*/
@Service
public class DemoApiImpl implements DemoApi {
/**
* 实现 sayHello 接口
*
* @param name
* @return
*/
@Override
public String sayHello(String name) {
return "Hello, " + name + " (from Spring Boot with dubbo-2.7.1)";
}
}
Класс запуска DubboDemoServiceApplication должен добавить аннотации конфигурации dubbo:
package com.example.dubbo.demo.service;
import org.apache.dubbo.config.spring.context.annotation.DubboComponentScan;
import org.apache.dubbo.config.spring.context.annotation.EnableDubboConfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* 增加了 EnableDubboConfig 和 DubboComponentScan 的注解,启动时自动扫描
*
*/
@EnableDubboConfig
@DubboComponentScan("com.example.dubbo.demo.service.impl")
@SpringBootApplication
public class DubboDemoServiceApplication {
public static void main(String[] args) {
SpringApplication.run(DubboDemoServiceApplication.class, args);
}
}
Добавьте файл конфигурации dubbo:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<!-- 定义了提供方应用信息,用于计算依赖关系;在 dubbo-admin 或 dubbo-monitor 会显示这个名字 -->
<dubbo:application name="${dubbo.application.name}" owner="jeftom" organization="jeftom" />
<!-- 使用 zookeeper 注册中心暴露服务,注意要先开启 zookeeper-->
<dubbo:registry id="zookeeper-registry" protocol="${dubbo.registry.protocol}" address="${dubbo.registry.address}" />
<!-- dubbo协议在20880端口暴露服务 -->
<dubbo:protocol name="${dubbo.protocol.name}" port="${dubbo.protocol.port}" accesslog="dubbo-access.log"/>
<dubbo:provider retries="0" timeout="30000"/>
<dubbo:monitor protocol="registry"/>
<!-- 使用 dubbo 协议实现定义好的 Service Api 接口-->
<dubbo:service interface="com.example.dubbo.demo.api.DemoApi" ref="DemoApiImpl" retries="0" timeout="60000" />
</beans>
Файл конфигурации application.properties проекта spring:
spring.config.name=application
# spring 的环境配置
spring.profiles.active=dev
# 服务启动端口,即内置 tomcat 启动时占用的端口
server.port=8087
#dubbo config
#应用定义了提供方应用信息,用于计算依赖关系;在 dubbo-admin 或 dubbo-monitor 会显示这个名字,方便辨识
dubbo.application.name=dubbo-demo-service
#应用所属者
dubbo.application.owner=jeftom
#应用所属组织
dubbo.application.organization=jeftom
# 使用 zookeeper 注册中心暴露服务,注意要先开启 zookeeper
# 注册中心id
dubbo.registry.id=zookeeper-registry
# 注册中心协议
dubbo.registry.protocol=zookeeper
# 注册中心地址
dubbo.registry.address=zookeeper.tencus.com:2181
# dubbo协议在20880端口暴露服务
# 协议名称
dubbo.protocol.name=dubbo
# 协议端口
dubbo.protocol.port=20880
# 协议访问log
dubbo.protocol.accesslog=dubbo-access.log
# 重试次数
dubbo.provider.retries=0
# 超时时间
dubbo.provider.timeout=3000
# 注册监控中心
dubbo.monitor.protocol=registry
На этом этапе наш сервис-провайдер может нормально запускаться, и мы видим, что сервис был зарегистрирован в zookeeper через dubbo-admin.
модуль dubbo-demo-web
Этот модуль является потребительской службой dubbo, которая используется для потребления услуг, предоставляемых провайдером.После запуска службы он соединится с провайдером для завершения вызова службы.
файл конфигурации pom.xml:
<?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.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example.dubbo</groupId>
<artifactId>dubbo-demo-web</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>dubbo-demo-web</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- dubbo provider 启动不成功的主要问题在这里,没有添加 spring-boot-starter-web 依赖,所以启动日志里一直没有显示 “o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8087 (http)” 这行日志输出 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- 这个是定义的接口包,在 provider 和 consumer 都需要引用的 -->
<dependency>
<groupId>com.example.dubbo</groupId>
<artifactId>dubbo-demo-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<!-- 新增 dubbo 依赖 -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>2.7.1-SNAPSHOT</version>
<exclusions>
<exclusion>
<artifactId>spring</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.10</version>
<exclusions>
<exclusion>
<artifactId>slf4j-log4j12</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.0.1</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
Конфигурация application.properties весеннего приложения:
spring.config.name=application
# spring 的环境配置
spring.profiles.active=dev
# 服务启动端口,即内置 tomcat 启动时占用的端口
server.port=8088
# Qos 运维监控
dubbo.application.qosEnable=true
dubbo.application.qosPort=33333
dubbo.application.qosAcceptForeignIp=false
# dubbo config
# 应用定义了提供方应用信息,用于计算依赖关系;在 dubbo-admin 或 dubbo-monitor 会显示这个名字,方便辨识
dubbo.application.name=dubbo-demo-service
# 应用所属者
dubbo.application.owner=jeftom
# 应用所属组织
dubbo.application.organization=jeftom
# 使用 zookeeper 注册中心暴露服务,注意要先开启 zookeeper
# 注册中心id
dubbo.registry.id=zookeeper-registry
# 注册中心协议
dubbo.registry.protocol=zookeeper
# 注册中心地址
dubbo.registry.address=zookeeper.tencus.com:2181
# dubbo协议在20880端口暴露服务
# 协议名称
dubbo.protocol.name=dubbo
# 协议端口
dubbo.protocol.port=20880
# 协议访问log
dubbo.protocol.accesslog=dubbo-access.log
# 重试次数
dubbo.provider.retries=0
# 超时时间
dubbo.provider.timeout=3000
# 注册监控中心
dubbo.monitor.protocol=registry
Если две службы запущены одновременно на одном компьютере, это вызовет конфликт портов QoS:
main [server.Server] 102 [ERROR] [DUBBO] qos-server can not bind localhost:22222
Добавьте следующие две строки аннотации к классу запуска потребителя DubboDemoWebApplication:
@EnableDubboConfig
@DubboComponentScan("com.example.dubbo.demo.web.service")
Создайте класс службы DemoService и контроллер DemoController соответственно.
Класс DemoService.java
package com.example.dubbo.demo.web.service;
import com.example.dubbo.demo.api.DemoApi;
import org.apache.dubbo.config.annotation.Reference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
/**
* 消费者服务层
*
* @author jeftom
* @date 2019-03-24 00:49
* @since 1.0.0
*/
@Service
public class DemoService {
private static final Logger LOGGER = LoggerFactory.getLogger(DemoService.class);
@Reference
private DemoApi demoApi;
public String sayHello(String name) {
return demoApi.sayHello(name);
}
}
Класс контроллера DemoController.java
package com.example.dubbo.demo.web.controller;
import com.example.dubbo.demo.web.service.DemoService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
* demo 控制器
*
* @author jeftom
* @date 2019-03-24 00:51
* @since 1.0.0
*/
@RestController
@RequestMapping("/demo")
public class DemoController {
private static Logger logger = LoggerFactory.getLogger(DemoController.class);
@Autowired
private DemoService demoService;
/**
* 测试方法,浏览器访问 /demo/index 可以看到响应结果了
*
* @return
*/
@RequestMapping(value = "/index", method = RequestMethod.GET)
@ResponseBody
public String index() {
return demoService.sayHello("dubbo");
}
}
Хорошо, теперь вы можете повторно импортировать и mvn установить снова, чтобы увидеть, есть ли какие-либо ошибки.Если нет, запустите службу и веб-службу, а затем откройте браузер для доступа.Спустя столько времени, наконец, получилось.
Эпилог
Выше приведена демонстрация версии dubbo-2.7.1, на отладку которой я потратил два дня, чтобы вызвать службу.Если вы также готовитесь использовать dubbo, чтобы попробовать новую версию для разработки службы, я надеюсь, что эта статья вам немного поможет bit, большое спасибо* *Команда Alibaba** открыла исходный код для такого превосходного RPC-решения.
- Прикрепите исходный код демо-версии:GitHub.com/J EF Tom/Belly Daddy…