文章14 | 阅读 6812 | 点赞0
本节将会介绍Dubbo与SpringBoot整合的四种方式:1、xml配置方式;2、使用@DubboComponentScan;3、使用Dubbo的外部化配置方式@EnableDubboConfig;4、使用 incubator-dubbo-spring-boot-project 或者**dubbo-spring-boot-starter**。第一种方式Dubbo的新老版本都可以使用,不会有版本限制;第二、第三种适合于Dubbo跟SpringBoot整合想用注解,但是又没用Dubbo的SpringBoot的starter;第四种使用了提供的starter,可以帮助我们自动配置,比二三种使用更加简便,也是目前比较流行的。
这种方式最为简单,Dubbo的新老版本都能使用,可以直接在项目的启动类中导入Dubbo的服务提供者、消费者的xml配置文件即可,如下所示
@SpringBootApplication
@ImportResource("classpath:dubbo-provider.xml")
public class Application {
public static void main(String[] args) throws IOException {
SpringApplication.run(Application.class, args);
}
}
@SpringBootApplication
@ImportResource("classpath:dubbo-consumer.xml")
public class Application {
public static void main(String[] args) throws IOException {
SpringApplication.run(Application.class, args);
}
}
主要就是利用@Configuration和@Bean注解将Dubbo的xml配置转化为spring的bean,并且利用Dubbo的@DubboComponentScan注解去扫描添加了Dubbo的@Service和@Reference注解的类。如果您感兴趣的话可以看一下我的上一节博客《(7)Dubbo的四种配置方式》中介绍的第四种注解配置方式。(注意:该注解在Dubbo2.5.7及以后版本才支持)
在上面一种方式中,无论是服务提供方,还是服务消费方,都要配Dubbo相关配置Bean,用起来还是不够方便,Dubbo参考了SpringBoot的外部化配置(External Configuration),提供了一个比上面更好用更简便的注解@EnableDubboConfig(注意:该注解在Dubbo2.5.8及以后版本才支持)。当标注 @EnableDubboConfig 的类被扫描注册后,同时 Spring(SpringBoot)应用配置(PropertySources)中存在dubbo.application.* 时,ApplicationConfig Bean 将被注册到在 Spring 上下文。否则,不会被注册。如果出现dubbo.registry.*的配置,那么,RegistryConfig Bean 将会创建,以此类推。即按需装配 Dubbo 配置 Bean。举例如下:
# 单 Dubbo 配置 Bean 绑定
## application
dubbo.application.id = applicationBean
dubbo.application.name = dubbo-demo-application
## module
dubbo.module.id = moduleBean
dubbo.module.name = dubbo-demo-module
## registry
dubbo.registry.address = zookeeper://192.168.74.4:2181?backup=192.168.74.5:2181,192.168.74.6:2181
## protocol
dubbo.protocol.name = dubbo
dubbo.protocol.port = 20880
## monitor
dubbo.monitor.address = zookeeper://192.168.74.4:2181?backup=192.168.74.5:2181,192.168.74.6:2181
@EnableDubboConfig配置Dubbo的Bean
@EnableDubboConfig
@PropertySource("classpath:dubbo-config.properties")
@Configuration
public class DubboConfiguration {
}
项目启动类
@SpringBootApplication
public class ProviderTestApp {
public static void main(String[] args) throws IOException {
SpringApplication.run(ProviderTestApp.class, args);
}
}
看过一篇博客对@EnableDubboConfig的使用讲的听详细的,如果您对这个很感兴趣的话,请参考https://segmentfault.com/a/1190000012661402 http://dubbo.apache.org/zh-cn/blog/dubbo-annotation.html
常用的主要有两个:
Dubbo Spring Boot 工程致力于简化 Dubbo RPC 框架在 Spring Boot 应用场景的开发。同时也整合了 Spring Boot 特性:
从现在开始, dubbo-spring-boot-project
将在每个发布中发行两个版本 (推荐使用0.2.X)
版本 | Java | Spring Boot | Dubbo |
---|---|---|---|
0.2.0 | 1.8+ | 2.0.x | 2.6.2 + |
0.1.1 | 1.7+ | 1.5.x | 2.6.2 + |
关于incubator-dubbo-spring-boot-project中在application.properties的配置属性可以参考如下:dubbo-spring-boot-autoconfigure-0.2.0.jar下面的spring-configuration-metadata.json里面有完整的定义
下面通过一个案例,来介绍一下跟Dubbo的整合是怎么用的。
公共项目,服务提供者和消费者都会依赖这个项目,里面主要存放暴露的api接口,接口中用到的model、枚举、自定义异常类等。
pom.xml如下:
<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.wkp</groupId>
<artifactId>dubbo-spring-boot-demo-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
</project>
里面只有一个接口如下所示
package com.dubbo.springboot.demo.provider.service;
public interface DemoService {
String sayHello(String name);
}
该项目为服务提供者,pom.xml如下
<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.wkp</groupId>
<artifactId>dubbo-spring-boot-demo-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.3.RELEASE</version>
</parent>
<dependencies>
<!-- Spring Boot dependencies -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-actuator</artifactId>
<version>0.2.0</version>
</dependency>
<dependency>
<groupId>com.wkp</groupId>
<artifactId>dubbo-spring-boot-demo-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
DemoService接口的实现类如下:
package com.dubbo.springboot.demo.provider.service.impl;
import com.alibaba.dubbo.config.annotation.Service;
import com.dubbo.springboot.demo.provider.service.DemoService;
@Service
public class DemoServiceImpl implements DemoService {
public String sayHello(String name) {
return "hello "+name;
}
}
application.properties配置如下
# Spring boot application
spring.application.name = dubbo-provider-demo
# Base packages to scan Dubbo Component: @com.alibaba.dubbo.config.annotation.Service
dubbo.scan.basePackages = com.dubbo.springboot.demo.provider.service.impl
# Dubbo Config properties
## ApplicationConfig Bean
dubbo.application.id = dubbo-provider-demo
dubbo.application.name = dubbo-provider-demo
## ProtocolConfig Bean
dubbo.protocol.id = dubbo
dubbo.protocol.name = dubbo
dubbo.protocol.port = 20880
## RegistryConfig Bean
dubbo.registry.id = my-registry
dubbo.registry.address = zookeeper://192.168.74.4:2181?backup=192.168.74.5:2181,192.168.74.6:2181
服务提供者启动类,注意这里是以非web工程启动的
package com.dubbo.springboot.demo.provider.bootstrap;
import org.springframework.boot.WebApplicationType;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
@SpringBootApplication
public class DubboProviderApplication {
public static void main(String[] args) {
new SpringApplicationBuilder(DubboProviderApplication.class)
.web(WebApplicationType.NONE) // NONE为非web工程,一般用于专门提供接口的jar
.run(args);
}
}
服务消费者pom.xml如下
<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.wkp</groupId>
<artifactId>dubbo-spring-boot-demo-consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.3.RELEASE</version>
</parent>
<dependencies>
<!-- Spring Boot dependencies -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-actuator</artifactId>
<version>0.2.0</version>
</dependency>
<dependency>
<groupId>com.wkp</groupId>
<artifactId>dubbo-spring-boot-demo-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
里面的调用业务类及Controller如下
package com.dubbo.springboot.demo.consumer.service;
import org.springframework.stereotype.Service;
import com.alibaba.dubbo.config.annotation.Reference;
import com.dubbo.springboot.demo.provider.service.DemoService;
@Service
public class DemoConsumerService {
@Reference
private DemoService demoService;
public String sayHello(String name) {
return demoService.sayHello(name);
}
}
package com.dubbo.springboot.demo.consumer.controller;
import javax.annotation.Resource;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.dubbo.springboot.demo.consumer.service.DemoConsumerService;
@RestController
public class HelloController {
@Resource
private DemoConsumerService demoConsumerService;
@RequestMapping("/sayHello")
public String sayHello(@RequestParam String name) {
return demoConsumerService.sayHello(name);
}
}
application.properties配置如下
# Spring boot application
spring.application.name = dubbo-consumer-demo
server.port = 8080
management.server.port = 8081
# Dubbo Config properties
## ApplicationConfig Bean
dubbo.application.id = dubbo-consumer-demo
dubbo.application.name = dubbo-consumer-demo
## RegistryConfig Bean
dubbo.registry.id = my-registry
dubbo.registry.address = zookeeper://192.168.74.4:2181?backup=192.168.74.5:2181,192.168.74.6:2181
# Dubbo Endpoint (default status is disable)
endpoints.dubbo.enabled = true
# Dubbo Health
## StatusChecker Name defaults (default : "memory", "load" )
management.health.dubbo.status.defaults = memory
# Enables Dubbo All Endpoints
management.endpoint.dubbo.enabled = true
management.endpoint.dubbo-shutdown.enabled = true
management.endpoint.dubbo-configs.enabled = true
management.endpoint.dubbo-services.enabled = true
management.endpoint.dubbo-references.enabled = true
management.endpoint.dubbo-properties.enabled = true
# Exposes all web endpoints
management.endpoints.web.exposure.include = *
消费者启动类如下:
package com.dubbo.springboot.demo.consumer.bootstrap;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication(scanBasePackages = "com.dubbo.springboot.demo.consumer")
public class DubboConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(DubboConsumerApplication.class, args);
}
}
服务提供者、消费者启动完成后,访问结果如下表示已经成功。
健康检查 : http://localhost:8081/actuator/health
Dubbo Endpoints : http://localhost:8081/actuator/dubbo
至此,Dubbo与SpringBoot已经整合完成,使用@Service注解的时候注意一下不要把Dubbo跟Spring的弄错啦。
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/u012988901/article/details/84963766
内容来源于网络,如有侵权,请联系作者删除!