概述
Apache Dubbo 是一款高性能的、基于Java的开源RPC框架,它提供了以下特性:
- 基于接口的远程方法调用
- 智能负载均衡
- 服务自动注册和发现
- 高可扩展性
- 运行期流量调度
- 可视化的服务治理
架构
(0)provider基于dubbo容器启动
(1)provider注册到注册中心(Nacos)
(2)consumer订阅注册中心的服务变化
(3)注册中心将服务变化结果异步地通知给consumer
(4)consumer直接调用provider接口
(5)monitor监控流量请求数据
Spring Cloud Alibaba 整合 Dubbo
创建主工程
创建一个空的工程,pom配置如下:
<?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.13.RELEASE</version>
</parent>
<groupId>com.train</groupId>
<artifactId>alibaba-dubbo</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<project.version>1.0-SNAPSHOT</project.version>
<spring-cloud.version>Greenwich.SR6</spring-cloud.version>
<spring-cloud-alibaba.version>2.1.3.RELEASE</spring-cloud-alibaba.version>
</properties>
<modules>
<module>hello-dubbo-provider</module>
<module>hello-dubbo-consumer</module>
</modules>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- Spring Boot -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Dubbo -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>
<!-- Nacos -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
</project>
创建provider子工程:hello-dubbo-provider
在alibaba-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>com.train</groupId>
<artifactId>alibaba-dubbo</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>hello-dubbo-provider</artifactId>
<packaging>pom</packaging>
<modules>
<module>hello-dubbo-provider-api</module>
<module>hello-dubbo-provider-service</module>
</modules>
</project>
在hello-dubbo-provider工程下,创建hello-dubbo-provider子工程。目的是定义接口,后续consumer会引用该工程,然后就能直接调用provider借口了
<?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>com.train</groupId>
<artifactId>hello-dubbo-provider</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>hello-dubbo-provider-api</artifactId>
<packaging>jar</packaging>
</project>
创建接口类EchoService:
package com.train.dubbo.provider.api;
public interface EchoService {
String echo(String name);
}
这样api工程就完成了,很简单
在hello-dubbo-provider工程下,创建hello-dubbo-provider-service子工程。该工程是api工程的具体实现,因此必须依赖上一步创建的api工程
<?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>com.train</groupId>
<artifactId>hello-dubbo-provider</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>hello-dubbo-provider-service</artifactId>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>com.train</groupId>
<artifactId>hello-dubbo-provider-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
创建EchoServiceImpl实现EchoService接口
package com.train.dubbo.provider.service;
import com.train.dubbo.provider.api.EchoService;
import org.apache.dubbo.config.annotation.Service;
@Service(version = "1.0.0")
public class EchoServiceImpl implements EchoService {
@Override
public String echo(String name) {
return "Dubbo Hello:" + name;
}
}
注意:@Service注解必须引用dubbo的Service,而不是spring,不要弄错了
创建Application启动类
@SpringBootApplication
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class,args);
}
}
配置application.yml,前提必须安装好nacos,还没安装的童鞋参考前面的文章
spring:
application:
name: dubbo-provider
main:
allow-bean-definition-overriding: true
cloud:
nacos:
discovery:
server-addr: 192.168.25.131:8848
dubbo:
scan:
base-packages: com.train.dubbo.provider.service
protocol:
name: dubbo
port: -1
registry:
address: spring-cloud://192.168.25.131:8848
server:
port: 8010
整个provider工程结构如下
启动provider-service,然后查看Nacos,确认服务是否注册
在主工程下创建hello-dubbo-consumer消费者工程,因为要消费provider接口,所以依赖provider-api工程
<?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>com.train</groupId>
<artifactId>alibaba-dubbo</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>hello-dubbo-consumer</artifactId>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>com.train</groupId>
<artifactId>hello-dubbo-provider-api</artifactId>
<version>${project.parent.version}</version>
</dependency>
</dependencies>
</project>
创建controller接口以便测试
@RestController
public class EchoController {
@Reference(version = "1.0.0")
private EchoService echoService;
@GetMapping("/echo/{name}")
public String echo(@PathVariable String name){
return echoService.echo(name);
}
}
创建启动类
@SpringBootApplication
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class,args);
}
}
配置application.yml
server:
port: 8020
dubbo:
protocol:
name: dubbo
port: -1
registry:
address: spring-cloud://192.168.25.131:8848
scan:
base-packages: com.train.dubbo.consumer.controller
cloud:
subscribed-services: dubbo-provider
spring:
application:
name: dubbo-consumer
cloud:
nacos:
discovery:
server-addr: 192.168.25.131:8848
main:
allow-bean-definition-overriding: true
然后同样启动consumer工程,再确认Nacos
附上整个工程结构:
测试
在浏览器输入http://localhost:8020/echo/zhangsan,能正常输出provider-service实现的接口内容,就说明正常运行