使用springboot+dubbo搭建RPC入門案例
本文背景簡述:
最近在學習公司的一套RPC框架,初步接觸的時候感覺挺復雜的。但是知道其原理肯定是和dubbo很相似的,畢竟都是RPC框架嘛,只是各自使用的范圍和使
用者群體有些不同罷了。於是就去dubbo官網熟悉了其相關文檔和案例教程,然后結合網上大佬的一些資料,自己搭了個簡單的分布式遠程調用案例。這里
強調一個東西--記住官方文檔第一!!!下面分享一下我的案例代碼吧,也希望本案例能對在讀的讀者啟動一點幫助......
先來一張簡單的架構圖吧,這個圖是自己使用processOn畫的(這里推薦一波processOn線上作圖神器):
1、創建一個比較原生的Maven項目dubbo-common
這個項目中只定義公共接口和實體,以供后面的provider工程項目和consumer工程項目使用(如下圖所示):
TeamService中的代碼也很簡單,如下:
package com.chandler.dubbo.service;
import com.chandler.dubbo.entity.Team;
public interface TeamService {
Team getTeamInfo(String city);
}
2、下載與配置zookeeper
下載地址:https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/
至於怎么配置和使用,可以自己移駕度娘,上面很多,其實也比較簡單。
3、創建dubbo-provider項目
首先從下圖所示這里創建一個springboot項目:
創建后的工程大概如下圖所示,這個provider項目很簡單,就是一個實現了dubbo-common項目中的那個接口的service方法。
項目創建完了后我們首先要把dubbo-common中的那個划紅線的jar包手動添加到lib庫中,以備后面使用(正常來說我們肯定是將類似於dubbo-common這樣一個公共工程上傳到Maven公共鏡像倉庫或者是公司內部的是有個Maven鏡像倉庫中去,以備提服務的項目和消費服務的項目通過pom文件直接添加依賴就可以使用。這里我們為了簡單演示就直接手動添加算了)。手動添加步驟如下:
File-->Project Structure-->Modules-->Dependencies-->右側+號找到那個jar包-->點擊底部apply-->點擊ok
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.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.chandler.dubbo</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>
<!--boot依賴-->
<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>
<!-- 引入dubbo的依賴 -->
<dependency>
<groupId>com.alibaba.spring.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
<!-- 引入zookeeper的依賴 -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<!-- slf4j依賴 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
application.yml中的內容:
server.port=8081
spring.application.name=dubbo-provider
#本地zookeeper注冊中心地址
spring.dubbo.registry=zookeeper://localhost:2181
MyServiceImpl代碼:(由於這里只是為了簡單演示,所以就沒有使用數據庫什么的了,直接在static代碼塊中使用集合存儲幾個對象以備后面查詢)
package com.chandler.dubbo.dubboprovider.service;
import com.alibaba.dubbo.config.annotation.Service;
import com.chandler.dubbo.entity.Team;
import com.chandler.dubbo.service.TeamService;
import org.springframework.stereotype.Component;
import java.util.HashMap;
@Component
//這個service注解是dubbo中的,目的就是將這個服務暴露出去。
//里面可以指定代理版本,代理名稱還有很多的其他可選配置項,dubbo官網的文檔中都有說明
@Service(version = "1.0.0",proxy = "TeamServer")
public class MyserviceImpl implements TeamService {
private static HashMap<String,Team> teamHashMap = new HashMap<>(16);
static {
Team team1 = new Team();
team1.setCity("chicago");
team1.setName("bulls");
team1.setTopPlayer("jordan&rose");
Team team2 = new Team();
team2.setTopPlayer("james&kobe");
team2.setName("lakers");
team2.setCity("loss angeles");
teamHashMap.put("chicago",team1);
teamHashMap.put("lal",team2);
}
@Override
public Team getTeamInfo(String s) {
return teamHashMap.get(s);
}
}
最后是DubboProviderApplication啟動類:
package com.chandler.dubbo.dubboprovider;
import com.alibaba.dubbo.spring.boot.annotation.EnableDubboConfiguration;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@EnableDubboConfiguration
public class DubboProviderApplication {
public static void main(String[] args) {
SpringApplication.run(DubboProviderApplication.class, args);
}
}
到這一步就可以啟動項目了,啟動項目后可以使用dubbo的管理控制台查看和管理服務,具體怎么弄可以參考官網文檔:
http://dubbo.apache.org/zh-cn/docs/admin/introduction.html,我們接着在創建消費者項目。
4、創建dubbo-consumer項目
同創建dubbo-provider一樣的步驟創建consumer項目,項目結構如下圖:
然后呢,也同dubbo-provider項目中一樣手動添加dubbo-common項目的jar包到lib庫中。
接下來就是pom文件內容,和provider項目中的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.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.chandler.dubbo</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>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>
<!-- 引入dubbo的依賴 -->
<dependency>
<groupId>com.alibaba.spring.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
<!-- 引入zookeeper的依賴 -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<!-- slf4j依賴 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.60</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
TeamService類代碼:
package com.chandler.dubbo.dubboconsumer.service;
import com.alibaba.dubbo.config.annotation.Reference;
import com.chandler.dubbo.entity.Team;
import org.springframework.stereotype.Service;
@Service
public class TeamService {
@Reference(proxy = "TeamServer",version = "1.0.0")
com.chandler.dubbo.service.TeamService teamService;
public Team getTeam(String cityName){
return teamService.getTeamInfo(cityName);
}
}
TeamController類代碼:
package com.chandler.dubbo.dubboconsumer.controller;
import com.chandler.dubbo.dubboconsumer.service.TeamService;
import com.chandler.dubbo.entity.Team;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@RestController
@RequestMapping("/api")
public class TeamController {
@Resource
private TeamService teamService;
@GetMapping("/getTeam")
public Team getTeam(@RequestParam("cityName") String cityName){
return teamService.getTeam(cityName);
}
}
DubboConsumerApplication啟動類代碼:
package com.chandler.dubbo.dubboconsumer;
import com.alibaba.dubbo.spring.boot.annotation.EnableDubboConfiguration;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@EnableDubboConfiguration
public class DubboConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(DubboConsumerApplication.class, args);
}
}
最后就可以依次啟動zookeeper、dubbo-provider和dubbo-consumer項目了,然后可以使用瀏覽器或者postman測試dubbo-consumer項目中的controller方法了。
我是一頭實習中的小菜雞,第一次寫博客,有很多不到位的地方,還請各位大佬直接評論!無論是贊賞還是噴,本人都是可以接受的。。。