a high-performance, java based open source RPC framework.html
local.xml:git
<bean id=「xxxService」 class=「com.xxx.XxxServiceImpl」 /> <bean id=「xxxAction」 class=「com.xxx.XxxAction」> <property name=「xxxService」 ref=「xxxService」 /> </bean>
在本地服務的基礎上,只需作簡單配置,便可完成遠程化:github
local.xml
配置拆分紅兩份,將服務定義部分放在服務提供方 remote-provider.xml
,將服務引用部分放在服務消費方 remote-consumer.xml
。<dubbo:service>
,在消費方增長引用服務配置 <dubbo:reference>
。remote-provider.xml:web
<!-- 和本地服務同樣實現遠程服務 --> <bean id=「xxxService」 class=「com.xxx.XxxServiceImpl」 /> <!-- 增長暴露遠程服務配置 --> <dubbo:service interface=「com.xxx.XxxService」 ref=「xxxService」 />
remote-consumer.xml:spring
<!-- 增長引用遠程服務配置 --> <dubbo:reference id=「xxxService」 interface=「com.xxx.XxxService」 /> <!-- 和本地服務同樣使用遠程服務 --> <bean id=「xxxAction」 class=「com.xxx.XxxAction」> <property name=「xxxService」 ref=「xxxService」 /> </bean>
阿里官方demoapache
Dubbo Spring Boot (v0.1.0) : https://github.com/dubbo/dubbo-spring-boot-project
Dubbo (v2.0.1) : https://github.com/alibaba/dubbo
Google group : http://groups.google.com/group/dubbo安全
官方給出的一些案例:dubbo-spring-boot-samplesspringboot
將服務提供者註冊到註冊中心
1. 引入dubbo和zkclient組件依賴
2. 配置dubbo的掃描包和註冊中心的地址
3. 使用@Service發佈服務
<!-- springboot整合dubbo的start包 --> <dependency> <groupId>com.alibaba.spring.boot</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>2.0.0</version> </dependency> <!-- zookeeper相關的包 --> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.4.12</version> </dependency> <!-- 客戶端鏈接zookeeper所需的包 引入ZooKeeper客戶端工具 --> <dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</artifactId> <version>0.9</version> </dependency>
TicketService
接口
package com.gqz.ticket.service; /** * @ClassName: TicketService * @author: ganquanzhong * @date: 2019/10/30 9:40 */ public interface TicketService { /** dubbo中的公共api * 獲取票 */ public String getTicket(String name); }
TicketServiceImpl
實現類
package com.gqz.ticket.service; import com.alibaba.dubbo.config.annotation.Service; import org.springframework.stereotype.Component; /** * @ClassName: TicketServiceImpl * @author: ganquanzhong * @date: 2019/10/30 9:43 */ @Component @Service(version = "1.0.0") //Dubbo的註解,將服務發佈出去 public class TicketServiceImpl implements TicketService { @Override public String getTicket(String name) { return name+"成功訂購《銀河補習班》電影票"; } }
ProviderTicketApplication
package com.gqz.ticket; import com.alibaba.dubbo.config.spring.context.annotation.DubboComponentScan; import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; /** * 一、 將服務提供者註冊到註冊中心 * 1.引入dubbo和zkclient組件依賴 * 2.配置dubbo的掃描包和註冊中心的地址 * 3.使用@Service發佈服務 */ @EnableDubbo() @DubboComponentScan() @SpringBootApplication public class ProviderTicketApplication { public static void main(String[] args) { SpringApplication.run(ProviderTicketApplication.class, args); } }
#dubbo服務名稱 dubbo.application.name =provider-ticket # Base packages to scan Dubbo Component: @org.apache.dubbo.config.annotation.Service dubbo.scan.base-packages = com.gqz.ticket.service # Dubbo Application ## The default value of dubbo.application.name is ${spring.application.name} ## dubbo.application.name=${spring.application.name} # Dubbo Protocol # 通信規則dubbo,hession... dubbo.protocol.name=dubbo #dubbo服務端口,咱們無需知道dubbo服務運行在哪一個端口,故也將其設爲隨機端口 dubbo.protocol.port=12345 ## Dubbo Registry #註冊中心地址, 若是搭建是集羣,因此用逗號分開 192.168.1.112:2181,192.168.1.112:2182,192.168.1.112:2183 dubbo.registry.protocol=zookeeper dubbo.registry.address=192.168.1.112:2181
到這裏,服務提供者就配置完成了,能夠啓動應用將服務發佈到註冊中
調用註冊中的服務,完成本身的業務
1.引入依賴Dubbo和zkClient
2.配置dubbo的註冊中心地址
3.引用服務
<!-- springboot整合dubbo的start包 --> <dependency> <groupId>com.alibaba.spring.boot</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>2.0.0</version> </dependency> <!-- zookeeper相關的包 --> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.4.12</version> </dependency> <!-- 客戶端鏈接zookeeper所需的包 引入ZooKeeper客戶端工具 --> <dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</artifactId> <version>0.9</version> </dependency>
TicketService
公共接口
package com.gqz.ticket.service; /** * @ClassName: TicketService * @author: ganquanzhong * @date: 2019/10/30 9:40 */ public interface TicketService { /** dubbo中的公共api * 獲取票 */ public String getTicket(String name); }
UserService
自身的業務,調用遠程ticketService
服務
package com.gqz.user.service; import com.alibaba.dubbo.config.annotation.Reference; import com.gqz.ticket.service.TicketService; import org.springframework.stereotype.Service; /** * 調用遠程RPC Remote Procedure Call * 調用com.gqz.ticket.service.TicketService中的服務 * * @ClassName: UserService * @author: ganquanzhong * @date: 2019/10/30 9:48 */ @Service public class UserService { /** * @Reference註解 經過 @Reference 注入TicketService * 是經過全類名引用 */ @Reference(version = "1.0.0", url = "dubbo://127.0.0.1:12345") TicketService ticketService; //調用遠程接口的服務 public void orderTicket(String name){ System.out.println(ticketService.getTicket(name)); } }
# 配置Dubbo #dubbo服務名稱 dubbo.application.name =consumer-user #通信規則 dubbo.protocol.name=dubbo #註冊中心地址 dubbo.registry.protocol=zookeeper dubbo.registry.address=192.168.1.112:2181
ConsumerUserApplicationTests
測試
package com.gqz.user; import com.gqz.user.service.UserService; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest class ConsumerUserApplicationTests { @Autowired UserService userService; @Test void testRPC() { System.out.println("調用RPC provider中的訂票業務"); userService.orderTicket("甘全中-陳蓉"); } }
運行成功!!
服務者必須運行,提供服務
其中常常遇到空指針異常,不能調用遠程的服務主要是Dubbo配置、註解、版本等問題。嚴格參照官方的demo,不一樣版本可能出現一些架構方面的變動。
Dubbo Apache Dubbo™ 是一款高性能Java RPC框架。
Spring Boot 應用場景的開發。同時也整合了 Spring Boot 特性:
Apache Dubbo |ˈdʌbəʊ| 是一款高性能、輕量級的開源Java RPC框架,它提供了三大核心能力:面向接口的遠程方法調用,智能容錯和負載均衡,以及服務自動註冊和發現。
您能夠爲您的工程引入最新 dubbo-spring-boot-starter
的發佈,增長如下依賴到工程的 pom.xml
文件中:
<properties> <spring-boot.version>2.1.1.RELEASE</spring-boot.version> <dubbo.version>2.7.3</dubbo.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> </dependencies> </dependencyManagement> <dependencies> <!-- Dubbo Spring Boot Starter --> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>2.7.3</version> </dependency> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo</artifactId> </dependency> </dependencies>
若是您的工程遇到了依賴問題, 請嘗試添加以下 Maven 參考到工程的 pom.xml
文件中:
<repositories> <repository> <id>apache.snapshots.https</id> <name>Apache Development Snapshot Repository</name> <url>https://repository.apache.org/content/repositories/snapshots</url> <releases> <enabled>false</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> </repository> </repositories>
若是您如今使用的Dubbo版本低於2.7.0,請使用以下對應版本的Dubbo Spring Boot:
Dubbo Spring Boot | Dubbo | Spring Boot |
---|---|---|
0.2.1.RELEASE | 2.6.5+ | 2.x |
0.1.2.RELEASE | 2.6.5+ | 1.x |
若是您須要嘗試最新 dubbo-spring-boot-project
的特性,您可將當前工程手動 Maven install 到本地 Maven 倉庫:
Maven install =
mvn install
若是您對 Dubbo 不是很是瞭解,耽誤您幾分鐘訪問 http://dubbo.apache.org/ 。瞭解後,若是您指望更深刻的探討,能夠移步用戶手冊。
一般狀況 , Dubbo 應用有兩種使用場景 , 其一爲 Dubbo 服務提供方 , 另一個是 Dubbo 服務消費方,固然也容許二者混合,下面咱們一塊兒快速開始!
首先,咱們假設存在一個 Dubbo RPC API ,由服務提供方爲服務消費方暴露接口 :
public interface DemoService { String sayHello(String name); }
實現 DemoService
接口
@Service(version = "1.0.0") public class DefaultDemoService implements DemoService { /** * The default value of ${dubbo.application.name} is ${spring.application.name} */ @Value("${dubbo.application.name}") private String serviceName; public String sayHello(String name) { return String.format("[%s] : Hello, %s", serviceName, name); } }
編寫 Spring Boot 引導程序
@EnableAutoConfiguration public class DubboProviderDemo { public static void main(String[] args) { SpringApplication.run(DubboProviderDemo.class,args); } }
配置 application.properties
:
# Spring boot application spring.application.name=dubbo-auto-configuration-provider-demo # Base packages to scan Dubbo Component: @org.apache.dubbo.config.annotation.Service dubbo.scan.base-packages=org.apache.dubbo.spring.boot.demo.provider.service # Dubbo Application ## The default value of dubbo.application.name is ${spring.application.name} ## dubbo.application.name=${spring.application.name} # Dubbo Protocol dubbo.protocol.name=dubbo dubbo.protocol.port=12345 ## Dubbo Registry dubbo.registry.address=N/A
經過 @Reference
注入 DemoService
:
@EnableAutoConfiguration public class DubboAutoConfigurationConsumerBootstrap { private final Logger logger = LoggerFactory.getLogger(getClass()); @Reference(version = "1.0.0", url = "dubbo://127.0.0.1:12345") private DemoService demoService; public static void main(String[] args) { SpringApplication.run(DubboAutoConfigurationConsumerBootstrap.class).close(); } @Bean public ApplicationRunner runner() { return args -> { logger.info(demoService.sayHello("mercyblitz")); }; } }
配置 application.yml
:
spring: application: name: dubbo-auto-configure-consumer-sample
請確保 Dubbo 服務提供方服務可用, DubboProviderDemo
運行方可正常。
更多的實現細節,請參考 Dubbo 示例
若是您在使用 Dubbo Spring Boot 中遇到任何問題或者有什麼建議? 咱們很是須要您的支持!
Dubbo Spring Boot 採用多 Maven 模塊工程 , 模塊以下:
dubbo-spring-boot-parent 模塊主要管理 Dubbo Spring Boot 工程的 Maven 依賴
dubbo-spring-boot-autoconfigure 模塊提供 Spring Boot’s @EnableAutoConfiguration
的實現 - DubboAutoConfiguration
,
它簡化了 Dubbo 核心組件的裝配。
dubbo-spring-boot-actuator 提供 Production-Ready 特性:
http://www.javashuo.com/tag/dubbo-spring-boot-starter 模塊爲標準的 Spring Boot Starter ,
當您將它引入到工程後,dubbo-spring-boot-autoconfigure 模塊會一同被間接依賴。
Dubbo Spring Boot 示例工程包括: