1、dubbo简介
1.1Dubbo是什么?
- 一款分布式服务框架
- 高性能和透明化的RPC远程服务调用方案
- SOA服务治理方案
属于流动计算架构(SOA): 随着服务化的进一步发展,服务越来越多,服务之间的调用和依赖关系也越来越复杂,诞生了面向服务的架构体系(SOA),也因此衍生出了一系列相应的技术,如对服务提供、服务调用、连接处理、通信协议、序列化方式、服务发现、服务路由、日志输出等行为进行封装的服务框架
1.2Dubbo架构
?名字解释:
节点 | 说明 | Provider | 暴露服务的服务提供方(生产者) | Consumer | 调用远程服务的服务消费方(消费者) | Registry???????? | 服务注册与发现的注册注册中心(nacos) | monitor | 统计服务的调用次数和调用时间的监控中心(监控问题不影响服务调用) | container? ? ? ? ? ? | 服务运行容器 |
调用关系说明 :
-
服务提供者在启动时,向添加中心添加自己提供的服务。 -
服务消费者在启动时,向添加中心订阅自己所需的服务。 -
添加中心返回服务提供者地址列表给消费者,如果有变更,添加中心将基于长连接推送变更数据给消费者。 -
服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。 -
服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心
2、dubbo快速入门
?
从上图我们可用看出在一个标准的dubbo服务调用中,他分为3个部分
dubbo-interface:
????????负责接口的定义,这里我们通常定义***Face结构的接口类,例如:UserFace
dubbo-producer:
????????【生产者】负责接口的实现,这里我们通常用==@DubboService==定义***FaceImpl结构的接口类,例如:UserFaceImpl
dubbo-web:
????????【消费者】负责调用接口,通常我们在web层使用==@DubboReference==调用接口
三步走
1导依赖
下面我们来构建第一个dubbo服务,我们需要在dubbo-parent中pom.xml引入下列依赖:
<dependencies>
<!--接口定义层-->
<dependency>
<groupId>com.cheng.dubbo</groupId>
<artifactId>dubbo-interface</artifactId>
<version>${interFace.version}</version>
</dependency>
<!---spring-cloud-alibaba主配置-->
<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>
<!---springboot主配置-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring.boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
在dubbo-producer和dubbo-web中pom.xml导入:
<dependencies>
<!--接口定义层-->
<dependency>
<groupId>com.cheng.dubbo</groupId>
<artifactId>dubbo-interface</artifactId>
</dependency>
<!--web支持-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--nacos支持-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--dubbo支持-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>
</dependencies>
2.生产者配置
#服务配置
server:
#端口
port: 8080
#服务编码
tomcat:
uri-encoding: UTF-8
#spring相关配置
spring:
#应用配置
application:
#应用名称
name: dubbo-producer
main:
allow-bean-definition-overriding: true
cloud:
#nacos添加中心
nacos:
discovery:
server-addr: 192.168.112.77:8848 #nacos配置
namespace: public
group: SEATA_GROUP
dubbo:
#dubbo服务版本
application:
version: 1.0.0
logger: slf4j
#dubbo接口扫描路径
scan:
base-packages: com.cheng.dubbo
#dubbo服务添加
registry:
address: spring-cloud://192.168.112.77
#dubbo服务协议类型及端口,线程数【这里是默认配置】
protocol:
name: dubbo
port: 28080
threads: 200
accesslog: D:/logs/dubbo-producer-01.log
消费者也要配置:
ps:dubbo端口号不一致
#服务配置
server:
#端口
port: 8080
#服务编码
tomcat:
uri-encoding: UTF-8
#spring相关配置
spring:
#应用配置
application:
#应用名称
name: dubbo-producer
main:
allow-bean-definition-overriding: true
cloud:
#nacos添加中心
nacos:
discovery:
server-addr: 192.168.112.77:8848
namespace: public
group: SEATA_GROUP
dubbo:
#dubbo服务版本
application:
version: 1.0.0
logger: slf4j
#dubbo接口扫描路径
scan:
base-packages: com.cheng.dubbo
#dubbo服务添加
registry:
address: spring-cloud://192.168.112.77
#dubbo服务协议类型及端口,线程数【这里是默认配置】
protocol:
name: dubbo
port: 28080
threads: 200
accesslog: D:/logs/dubbo-producer-01.log
1.编写接口:当前是另一个服务dubbo-interface
public interface UserFace {
/***
* @description 你好用户
* @param userName 用户名称
* @return
* @return: java.lang.String
*/
String helloUser(String userName);
}
2.编写实现接口:实现dubbo-interface的Userface接口
/**
* @ClassName UserFaceImpl.java
* @Description 用户接口实现
*/
@DubboService(version = "${dubbo.application.version}",timeout = 5000)
public class UserFaceImpl implements UserFace {
@Override
public String helloUser(String userName) {
return "Hello!"+userName;
}
}
ps:实现业务写的是:@DubboService
3.调用dubbo-interface的Userface接口:
/**
* @ClassName UserController.java
* @Description 用户controller
*/
@RestController
public class UserController {
@DubboReference(version = "${dubbo.application.version}",check = false)
UserFace userFace;
@GetMapping("{userName}")
public String helloUser(@PathVariable("userName") String userName){
return userFace.helloUser(userName);
}
}
ps:调用者写的是
@DubboReference注解
4.测试:启动dubbo-producer和dubbo-web模块,访问http://127.0.0.1:8081/xxx
?
|