dubbo是基于rpc的微服务架构
RPC远程过程调用 : Remote Procedure Call Protocol
远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。
dubbo主要角色
registry
注册中心. 是用于发布和订阅服务的一个平台.用于替代SOA结构体系框架中的ESB服务总线的。
发布
开发服务端代码完毕后, 将服务信息发布出去. 实现一个服务的公开.
订阅
客户端程序,从注册中心下载服务内容 这个过程是订阅.
订阅服务的时候, 会将发布的服务所有信息,一次性下载到客户端.
客户端也可以自定义, 修改部分服务配置信息. 如: 超时的时长, 调用的重试次数等.
consumer
服务的消费者, 就是服务的客户端.
消费者必须使用Dubbo技术开发部分代码. 基本上都是配置文件定义.
provider
服务的提供者, 就是服务端.
服务端必须使用Dubbo技术开发部分代码. 以配置文件为主.
container
容器. Dubbo技术的服务端(Provider), 在启动执行的时候, 必须依赖容器才能正常启动.
默认依赖的就是spring容器. 且Dubbo技术不能脱离spring框架.
在2.5.3版本的dubbo中, 默认依赖的是spring2.5版本技术. 可以选用spring4.5以下版本.
在2.5.7版本的dubbo中, 默认依赖的是spring4.3.10版本技术. 可以选择任意的spring版本.
monitor dubbo admin
监控中心. 是Dubbo提供的一个jar工程.
主要功能是监控服务端(Provider)和消费端(Consumer)的使用数据的. 如: 服务端是什么,有多少接口,多少方法, 调用次数, 压力信息等. 客户端有多少, 调用过哪些服务端, 调用了多少次等.
dubbo执行流程
启动Spring容器时,自动启动Dubbo的Provider
Provider在启动后自动会去注册中心注册内容.注册的内容包括:ip,port,对外提供的接口列表.哪些方法.哪些接口类,dubbo的版本,访问Provider的协议
当Consumer启动时,自动去Registry获取到所已注册的服务的信息.这个过程称为订阅
当Provider的信息发生变化时, 自动由Registry向Consumer推送通知
搭建provider工程
建立springboot项目
导入依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.10.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<java.version>1.8</java.version>
<dubbo.version>2.7.1</dubbo.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>${dubbo.version}</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>${dubbo.version}</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.14</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.2.0</version>
</dependency>
<!-- zookeeper客户端 -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.2.0</version>
<exclusions>
<exclusion>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.16</version>
</dependency>
</dependencies>
在application.yml中添加dubbo服务所需要的配置
server:
port: 9002
dubbo:
application:
name: dubbo-provider
#提供服务的IP,端口号
protocol:
port: 20880
name: dubbo
host: 192.168.1.102
#注册中心
registry:
address: zookeeper://192.168.220.136:2181
#dubbo包扫描
scan:
base-packages: com.cz.demo
spring:
application:
name: dubbo-provider
编写接口和实现类
public interface ITestOne {
public void test1();
}
实现类
package com.cz.demo.service.impl;
import com.cz.demo.service.ITestOne;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.Service;
import org.springframework.stereotype.Component;
@Service(version = "1.0.0", timeout = 10000, interfaceClass = ITestOne.class)
@Component
@Slf4j
public class Impl implements ITestOne {
@Override
public void test1() {
log.info("生产端---dubbo测试");
}
}
其中@Service为dubbo的注解,这里不能是spring的注解,这样就将服务暴露出来的
@Service中有版本属性,超时时间,权重等等信息
启动服务端
可以看到dubbo版本信息
看到以上信息则启动成功
搭建消费者工程
建立springboot项目,导入包和服务端一样,配置注册中心
server:
port: 9001
dubbo:
registry:
address: zookeeper://192.168.220.131:2181
spring:
application:
name: dubbo-customer
消费者调用实现
package com.cz.demo.controller;
import com.cz.demo.service.ITestOne;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RequestMapping("/customer")
@RestController
@Slf4j
public class CustomerController {
@Reference(version = "1.0.0")
private ITestOne test;
@GetMapping("/test")
public String test() {
log.info("----执行远程调用");
test.test1();
return "调用成功";
}
}
其中@Reference为dubbo注解,这里version属性要和@Server中version要一样,否则将失败
ITestOne为服务端中的接口
启动消费者
启动成功
浏览器输入http://localhost:9001/customer/test可以看到结果,则正常。