天天看點

給他人解釋什麼是dubbo

小小最近開始學習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

先拉取鏡像,再建立相關的容器,最後啟動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(接口)提供查詢服務

import java.util.List;

public interface UserService {

List queryAll();

建立實作類

import com.alibaba.dubbo.config.annotation.Service;

import java.util.ArrayList;

@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

啟動以後,檢視注冊中心,已經注冊

服務消費方

導入相關依賴

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>           

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:

name: ming-consumer           

port: 9091

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

測試

前置知識

Java 基本文法,計算機科學的基礎知識體系

适合人群

剛剛走入社會,或正在實習的,大學生們