Dubbo理論簡介
Apache Dubbo (incubating) |ˈdʌbəʊ| 是一款高性能、輕量級的開源Java RPC框架,它提供了三大核心能力:面向接口的遠程方法調用,智能容錯和負載均衡,以及服務自動註冊和發現。
官網:
http://dubbo.apache.org/
Dubbo的服務治理:
Dubbo原理圖(官方)
Dubbo角色:
Provider:暴露服務的服務提供者
Container:服務運行的容器
Consumer:調用遠程服務的消費者
Registry:服務註冊和發現的註冊中心
Minitor:統計服務調用次數和時間的監控中心
調用過程:
下面根據我的理解說明一下
0:服務器容器負責啓動、加載、運行服務提供者
1:服務提供者在啓動後就可以向註冊中心暴露服務
2:服務消費者在啓動後就可以向註冊中心訂閱想要的服務
3:註冊中心向服務消費者返回服務調用列表
4:服務消費者基於軟負載均衡算法調用服務提供者的服務,這個服務提供者有可能是一個服務提供者列表,調用那個服務提供者就是根據負載均衡來調用了
5:服務提供者和服務消費者定時將保存在內存中的服務調用次數和服務調用時間推送給監控中心
創建maven多模塊項目
duboo_parent
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 https://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.2.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.mr</groupId>
<artifactId>dubbo_parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>dubbo_parent</name>
<description>Demo project for Spring Boot</description>
<modules>
<module>dubbo_provider</module>
<module>dubbo_consumer</module>
</modules>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!-- dubbo -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>
<!-- 引入zookeeper的依賴,和服務器上的zookeeper版本對應 -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.9</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
創建子級模塊
創建服務端(duboo_proivder)
在啓動類上加@EnableDubbo註解
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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.mr</groupId>
<artifactId>dubbo_parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>com.mr</groupId>
<artifactId>dubbo_provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>dubbo_provider</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.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-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
編寫配置文件(yml格式)
server:
port: 8082
dubbo:
application:
name: dubbo-provider
registry: #註冊中心配置,用於配置連接註冊中心相關信息
address: zookeeper://127.0.0.1:2181
protocol: #協議配置,用於配置提供服務的協議信息,協議由提供方指定,消費方被動接受
name: dubbo
port: 20880
scan:
base-packages: com.mr.dubbo_provider.provider.service.impl
創建實體(序列化)
package com.mr.dubbo_provider.provider.entity;
import java.io.Serializable;
/**
* Created by ${方寸山} on 2019/11/1.
*/
public class User implements Serializable {
private Integer userId;
private String userName;
private Integer userAge;
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public Integer getUserAge() {
return userAge;
}
public void setUserAge(Integer userAge) {
this.userAge = userAge;
}
public User(Integer userId, String userName, Integer userAge) {
this.userId = userId;
this.userName = userName;
this.userAge = userAge;
}
@Override
public String toString() {
return "User{" +
"userId=" + userId +
", userName='" + userName + '\'' +
", userAge=" + userAge +
'}';
}
}
編寫service層(注意事項:導入duboo的包)
package com.mr.dubbo_provider.provider.service.impl;
import com.alibaba.dubbo.config.annotation.Service;
import com.mr.dubbo_provider.provider.entity.User;
import com.mr.dubbo_provider.provider.service.IProviderService;
/**
* Created by ${方寸山} on 2019/11/1.
*/
@Service
@org.springframework.stereotype.Service
public class ProviderService implements IProviderService {
@Override
public User getUser() {
User uu = new User(1,"bubbo",18);
return uu;
}
}
創建消費端(dubbo_consumer)
在啓動類上家@EnableDubbo註解
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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.mr</groupId>
<artifactId>dubbo_parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>com.mr</groupId>
<artifactId>dubbo_consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>dubbo_consumer</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>com.mr</groupId>
<artifactId>dubbo_provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
編寫配置文件
server:
port: 8083
dubbo:
application:
name: dubbo-consumer
registry: #註冊中心配置,用於配置連接註冊中心相關信息
address: zookeeper://127.0.0.1:2181
protocol: #協議配置,用於配置提供服務的協議信息,協議由提供方指定,消費方被動接受
port: 20880
編寫controler層
package com.mr.dubbo_consumer.controller;
import com.alibaba.dubbo.config.annotation.Reference;
import com.mr.dubbo_provider.provider.entity.User;
import com.mr.dubbo_provider.provider.service.IProviderService;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* Created by ${方寸山} on 2019/11/1.
*/
@Controller
public class UserController {
@Reference
private IProviderService providerService;
@RequestMapping("getUser")
@ResponseBody
public User getUser(){
return providerService.getUser();
}
}
啓動項目(測試):
請參考上一篇Dubbo安裝環境啓動服務
啓動成功!
測試接口