给他人解释什么是dubbo

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介:

小小最近开始学习dubbo了,这次进行相关的学习。
简介
思维导图如下
什么是Dubbo
dubbo 是一款高性能的分布式服务框架,高性能的,透明化的RPC远程调用方案,SOA服务治理方案,与Spring 体系同时并驾崎岖于Java体系生态中。
每天为上千个服务提供,使用以及应用。
在上方的词语中,出现了,分布式服务,RPC远程调用执行方案,SOA服务治理方案,这里对这几个词语进行依次解释。
分布式服务 包含,服务注册中心和服务治理中心,对微服务进行有效的治理。
RPC 远程调用方案 RPC为一种通信方式,用于进行远程通信。
SOA服务治理 一种面向服务的体系架构。

YRgHpQ.png
dubbo的logo
Dubbo的由来
网站需要由单一的架构演化到分布式架构,以及流动计算架构,如图所示。

YRgLXn.png
网站演化图
在上图中,网站由最初的一个应用,即单一应用架构,由jsp,hibernate等逐步应用,当流量变大时,逐步发展到垂直应用架构,对机器进行拆分,拆分出多个,用F5等应用,进行负载均衡,流量越来越大,进行分布式服务架构,此时,应用之间交互相当复杂,把核心的抽取出来,使用RPC进行远程调用。流量达到越来越大,此时,增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率,即资源调度与治理,即SOA。
在整个过程中,逐步的衍生出了一些问题,需要解决以下的问题。
1 依赖管理,服务逐渐的变的更加的多,服务的URL配置变的更加的艰难,负债均衡保持单点的压力相当的大,此时需要注册中心,管理相关的依赖管理,以及服务注册等。
2 路由透明,服务的注册,由原先的手动,变成了自动化,这里全部依赖于路由透明。
3 服务治理,当单一节点出现故障的时候,链路出现血崩的时候,如何治理服务。这里需要服务治理。对微服务进行相关的治理。
由此Dubbo应生而出,提供了以上问题的解决方案。
Dubbo的主要应用
dubbo主要应用于中大型应用,主要解决中大型应用的各种疑难问题。即分布式应用架构。
Dubbo 架构
核心 生产者与消费者问题
Dubbo 对应于计算机核心知识的生产者与消费者的问题
生产者与消费者是经典的并发协助的经典问题,该问题描述了共享固定大小缓冲区的两个进程——即所谓的“生产者”和“消费者”——在实际运行时会发生的问题。生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。与此同时,消费者也在缓冲区消耗这些数据。该问题的关键就是要保证生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区中空时消耗数据。
Dubbo的核心应用为生产者与消费者问题
节点调用关系
此时节点调用关系如上所示
调用关系说明
服务提供者启动时,向注册中心注册自己的服务。
消费者启动时候,注册中心订阅自己的服务。
注册中心返回地址列表给消费者。
服务消费者,从地址中,获取进行调用。
服务消费者和提供者,用于每隔一段时间,统计数据到监控中心。
特点
具有以下的特点,连通性,健壮性,伸缩性和升级性。
连通性指注册中心负责注册与查找。监控中心负责进行相关的统计,注册中心和其余服务都是连通的,监控中心与其他服务也是连通的。
健壮性指,监控中心宕机的时候,其余应用也可使用。
伸缩性,可以动态的部署集群。
升级性,未来可以进行逐步的升级。
第一个项目 Hello World
zookeeper 节点安装
这里安装zk节点。使用docker镜像安装
PS C:UsersAdministratorDesktop试写参考> docker pull zookeeper:3.5
3.5: Pulling from library/zookeeper
afb6ec6fdc1c: Pull complete
ee19e84e8bd1: Pull complete
6ac787417531: Pull complete
f3f781d4d83e: Pull complete
424c9e43d19a: Pull complete
f0929561e8a7: Pull complete
f1cf0c087cb3: Pull complete
2f47bb4dd07a: Pull complete
Digest: sha256:883b014b6535574503bda8fc6a7430ba009c0273242f86d401095689652e5731
Status: Downloaded newer image for zookeeper:3.5
docker.io/library/zookeeper:3.5
PS C:UsersAdministratorDesktop试写参考>
PS C:UsersAdministratorDesktop试写参考> docker create --name zddk -p 2181:2181 zookeeper:3.5
15b27748e07dc6cf44ca7943c49f9881e6d488a7cc5c61bfc5d3170a58321ff9
PS C:UsersAdministratorDesktop试写参考> docker start zk
zk
PS C:UsersAdministratorDesktop试写参考> docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d3eb0b087850 zookeeper "/docker-entrypoint.…" 2 weeks ago Up 22 seconds 2888/tcp, 3888/tcp, 0.0.0.0:2181->2181/tcp, 8080/tcp zk
PS C:UsersAdministratorDesktop试写参考>
先拉取镜像,再创建相关的容器,最后启动docker容器。
编写服务提供方
选择新的maven工程
创建工程目录如下
添加服务提供方
添加相关依赖

<?xml version="1.0" encoding="UTF-8"?>

 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">

<artifactId>untitled9</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>


4.0.0
service-dubbo

<!--添加SpringBoot测试-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>com.alibaba.boot</groupId>
    <artifactId>dubbo-spring-boot-starter</artifactId>
    <version>0.2.0</version>
</dependency>
<!--添加dubbo依赖-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>dubbo</artifactId>
    <version>2.6.4</version>
</dependency>


创建User对象

package com.ming.pojo;
import java.io.Serial;
import java.io.Serializable;
// 使用dubbo要求传输的对象必须实现序列化接口
public class User implements Serializable {
private static final long serialversionUID = -809897897879L;
private Long id;
private String username;
private String password;
private Integer age;
public static long getSerialversionUID() {

return serialversionUID;

}
public Long getId() {

return id;

}
public void setId(Long id) {

this.id = id;

}
public String getUsername() {

return username;

}
public void setUsername(String username) {

this.username = username;

}
public String getPassword() {

return password;

}
public void setPassword(String password) {

this.password = password;

}
public Integer getAge() {

return age;

}
public void setAge(Integer age) {

this.age = age;

}
}

创建UserService(接口)提供查询服务

package com.ming.pojo;
import java.util.List;
public interface UserService {
List queryAll();
}

创建实现类

package com.ming.pojo;
import com.alibaba.dubbo.config.annotation.Service;
import java.util.ArrayList;
import java.util.List;
@Service(version = "${dubbo.service.version}") // 声明一个服务
public class UserServiceImpl implements UserService {
public List queryAll() {

// 实现查询
List<User> list = new ArrayList<User>();
for(int i = 0; i < 10; i++){
    User user = new User();
    user.setAge(10 + i);
    user.setId(Long.valueOf(i + 1));
    user.setPassword("123456");
    user.setUsername("username_" + 1);
    list.add(user);
}
return list;

}
}

编写相关的application

// 版本
dubbo:
service:
version: 1.0.0
protocol:
name: dubbo
port: 20880
// 服务扫描
scan:
basePackages: com.ming.pojo
application:
name: dubbo-provider-demo
//zk
registry:
address: zookeeper://172.0.0.1:2181
client: zkclient

启动以后,查看注册中心,已经注册
服务消费方
导入相关依赖

<?xml version="1.0" encoding="UTF-8"?>

 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">

<artifactId>untitled9</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>


4.0.0
consumer-dubbo

<!--添加springboot依赖,非web项目-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
    <groupId>org.apache.zookeeper</groupId>
    <artifactId>zookeeper</artifactId>
    <version>3.4.13</version>
</dependency>
<dependency>
    <groupId>com.github.sgroschupf</groupId>
    <artifactId>zkclient</artifactId>
    <version>0.1</version>
</dependency>
<!--引入service的依赖-->
<dependency>
    <groupId>cn.itcast.dubbo</groupId>
    <artifactId>itcast-dubbo-service</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>


编写测试用例
@RunWith(SpringRunner.class)
@SpringBootTest
public class TestUserService {

@Reference(version="1.0.0")
private UserService userService;

@TestpublicvoidtestQueryAll(){
    List<User>users=this.userService.queryAll();
}
for(Useruser:users){
    System.out.println(user);
}

}
编写配置文件
spring:
application:

name: ming-consumer

port: 9091

dubbo:
registry:

address: zookeeper://172.0.0.1:2181
client: zkclient

测试
前置知识
Java 基本语法,计算机科学的基础知识体系
适合人群
刚刚走入社会,或正在实习的,大学生们

相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
目录
相关文章
|
3月前
|
缓存 负载均衡 Dubbo
Dubbo 第二节_ Dubbo的基本应用与高级应用
官⽹地址:http://dubbo.apache.org/zh/docs/v2.7/user/examples/loadbalance/ 如果在消费端和服务端都配置了负载均衡策略,以消费端为准。 这其中⽐较难理解的就是最少活跃调⽤数是如何进⾏统计的? 讲道理,最少活跃数应该是在服务提供者端进⾏统计的,服务提供者统计有多少个请求正在执⾏中。 但在Dubbo中,就是不讲道理,它是在消费端进⾏统计的,为什么能在消费端进⾏统计? 逻辑是这样的:官⽹地址:http://dubbo.apache.org/zh/docs
|
3月前
|
负载均衡 Dubbo 算法
深入理解Dubbo-2.Dubbo功能之高级特性分析
深入理解Dubbo-2.Dubbo功能之高级特性分析
55 0
|
2月前
|
Dubbo Java 应用服务中间件
Dubbo框架介绍与手写模拟Dubbo
Dubbo框架介绍与手写模拟Dubbo
|
3月前
|
负载均衡 Dubbo Java
Dubbo 第一节_ Dubbo框架介绍与手写模拟Dubbo 第二节_ Dubbo的基本应用与高级应用
官⽹地址:http://dubbo.apache.org/zh/docs/v2.7/user/examples/generic-service/官⽹地址:http://dubbo.apache.org/zh/docs/v2.7/user/examples/local-mock/官⽹地址:http://dubbo.apache.org/zh/docs/v2.7/user/examples/async-call/
|
4月前
|
Dubbo Java 应用服务中间件
dubbo(2.7.3) 4.用法
dubbo(2.7.3) 4.用法
|
11月前
|
负载均衡 Dubbo 算法
【JavaP6大纲】Dubbo篇:如何自己设计一个类似 Dubbo 的 RPC 框架?
【JavaP6大纲】Dubbo篇:如何自己设计一个类似 Dubbo 的 RPC 框架?
|
11月前
|
负载均衡 监控 Dubbo
【JavaP6大纲】Dubbo篇:Dubbo特性?
【JavaP6大纲】Dubbo篇:Dubbo特性?
|
存储 开发框架 负载均衡
Dubbo框架知识点
Dubbo框架知识点
79 0
|
Dubbo Java 应用服务中间件
Dubbo源码学习一
首先,我们知道dubbo在以前都是基于zookeeper作为配置中心的,同时是建立在spring基础之上的。因此,就需要思考一些问题: 首先dubbo是怎样和spring集成的,也即dubbo集成在spring上需要具备什么条件?接着dubbo作为一个服务治理的微服务框架,那它的生产者和消费者与注册中心怎样进行交互的。 dubbo是基于spring的基础之上进行开发的RPC框架。需要和spring整合,必然就需要按照Spring解析默认标签和自定义标签的方式进行。而在Spring中,我们知道在Spring中是在ParseBeanDefintions(Elemen
127 0
Dubbo源码学习一
|
缓存 Dubbo Java
初识Dubbo及简单案例使用
初识Dubbo及简单案例使用
初识Dubbo及简单案例使用