Spring Boot Dubbo 構(gòu)建分布式服務(wù)的方法
概述:

節(jié)點(diǎn)角色說(shuō)明
| 節(jié)點(diǎn) | 角色說(shuō)明 |
|---|---|
| Provider | 暴露服務(wù)的服務(wù)提供方 |
| Consumer | 調(diào)用遠(yuǎn)程服務(wù)的服務(wù)消費(fèi)方 |
| Registry | 服務(wù)注冊(cè)與發(fā)現(xiàn)的注冊(cè)中心 |
| Monitor | 統(tǒng)計(jì)服務(wù)的調(diào)用次數(shù)和調(diào)用時(shí)間的監(jiān)控中心 |
| Container | 服務(wù)運(yùn)行的容器 |
調(diào)用關(guān)系說(shuō)明
- 服務(wù)容器 Container 負(fù)責(zé)啟動(dòng),加載,運(yùn)行服務(wù)提供者。
- 服務(wù)提供者 Provider 啟動(dòng)的時(shí)候,向注冊(cè)中心 Registry 注冊(cè)自己提供的服務(wù)。
- 服務(wù)消費(fèi)者 Consumer 在啟動(dòng)的時(shí)候,向注冊(cè)中心 Registry 訂閱自己所需要的服務(wù)。注冊(cè)中心 Registry 返回服務(wù)提供者的地址列表給消費(fèi)者,如果有變更注冊(cè)中心將基于長(zhǎng)連接推送變更數(shù)據(jù)給消費(fèi)者。
- 服務(wù)消費(fèi)者從提供者地址列表中,基于軟負(fù)載均衡算法,選擇一臺(tái)提供者進(jìn)行進(jìn)行調(diào)用,如果調(diào)用失敗再選擇另外一臺(tái)。
- 服務(wù)消費(fèi)者與提供者在內(nèi)存中統(tǒng)計(jì)調(diào)用次數(shù)和調(diào)用時(shí)間,定時(shí)每分鐘發(fā)送一次統(tǒng)計(jì)數(shù)據(jù)到監(jiān)控中心 Monitor 。
項(xiàng)目構(gòu)建
開(kāi)發(fā)環(huán)境主要涉及以下方面:
- Spring Boot
- JDK 8
- Dubbo 2.7.1
- Zookeeper
具體代碼可以查看 github 的 dubbo 模塊: https://github.com/UniqueDong/springboot-study
Dubbo API
定義服務(wù)接口,打成 jar 包讓消費(fèi)者依賴(lài),服務(wù)者實(shí)現(xiàn)接口。該工程只有接口定義以及 model 對(duì)象。@Data 屬于lombok 開(kāi)源庫(kù)提供的特性,方便開(kāi)發(fā)。
model 對(duì)象定義:
@Data
public class User implements Serializable {
private Long id;
private String username;
}
provider 接口定義:
public interface UserProvider {
List<User> listUser();
}
Provider 服務(wù)提供者
pom依賴(lài):
引入spring-boot-starter,dubbo-api 接口就是我們上面提到的 接口定義 jar ,dubbo-spring-boot-starter ,dubbo-dependencies-zookeeper。
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<artifactId>spring-boot-starter-logging</artifactId>
<groupId>org.springframework.boot</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>zero.springboot.study</groupId>
<artifactId>dubbo-api</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<!--dubbo start-->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.1</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>2.7.1</version>
</dependency>
<!-- Zookeeper dependencies -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-dependencies-zookeeper</artifactId>
<version>2.7.1</version>
<type>pom</type>
<exclusions>
<exclusion>
<artifactId>log4j</artifactId>
<groupId>log4j</groupId>
</exclusion>
<exclusion>
<artifactId>slf4j-log4j12</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
<!--dubbo end-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.57</version>
</dependency>
</dependencies>
配置文件 yaml 定義:
spring:
application:
name: dubbo-provider
#自定義配置
embedded:
zookeeper:
# zookeeper 服務(wù)連接端口
port: 2181
# dubbo 配置
dubbo:
# 注冊(cè)中心配置
registry:
id: dubbo-provider
address: zookeeper://127.0.0.1:${embedded.zookeeper.port}
group: local
application:
name: dubbo-provider
id: dubbo-provider
logger: slf4j
qosEnable: true
qosPort: 22224
qosAcceptForeignIp: false
# dubbo 協(xié)議配置
protocol:
# -1 表示使用隨機(jī)未被占用的端口
port: -1
name: dubbo
scan:
# dubbo 服務(wù)提供者實(shí)現(xiàn)類(lèi)所在包
base-packages: com.zero.provider.impl
實(shí)現(xiàn) api 定義的接口
注意 @Service 是 Dubbo 的,不要導(dǎo)入了 Spring 的。
import com.google.common.collect.Lists;
import com.zero.api.model.User;
import com.zero.api.provider.UserProvider;
import org.apache.dubbo.config.annotation.Service;
import java.util.List;
@Service(interfaceClass = UserProvider.class)
public class UserProviderImpl implements UserProvider {
@Override
public List<User> listUser() {
User user = new User();
user.setId(1L);
user.setUsername("青龍");
return Lists.newArrayList(user);
}
}
Consumer
Pom 定義:
我們要依賴(lài) spring-boot-starter-web 提供http rest接口給前端調(diào)用。同時(shí)內(nèi)部通過(guò) Dubbo 實(shí)現(xiàn) RPC調(diào)用服務(wù)提供者。
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>zero.springboot.study</groupId>
<artifactId>dubbo-api</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<!--dubbo start-->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.1</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>2.7.1</version>
</dependency>
<!-- Zookeeper dependencies -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-dependencies-zookeeper</artifactId>
<version>2.7.1</version>
<type>pom</type>
<exclusions>
<exclusion>
<artifactId>log4j</artifactId>
<groupId>log4j</groupId>
</exclusion>
<exclusion>
<artifactId>slf4j-log4j12</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
<!--dubbo end-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
yaml 定義:
server:
# web 日更年期端口
port: 9005
spring:
application:
name: dubbo-comsumer
#自定義配置
embedded:
zookeeper:
port: 2181
# dubbo 配置
dubbo:
registry:
id: dubbo-comsumer
address: zookeeper://127.0.0.1:${embedded.zookeeper.port}
group: local
application:
name: dubbo-comsumer
id: dubbo-comsumer
logger: slf4j
qosEnable: false
qosPort: 22223
qosAcceptForeignIp: false
protocol:
port: -1
name: dubbo
# 是否檢查服務(wù)提供者有效
consumer:
check: false
服務(wù)消費(fèi)者調(diào)用服務(wù)生產(chǎn)者
import com.zero.api.model.User;
import com.zero.api.provider.UserProvider;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserService {
@Reference
private UserProvider userProvider;
public List<User> listUser() {
return userProvider.listUser();
}
}
我們通過(guò)一個(gè)RESTfull接口,提供給前端調(diào)用。
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserService userService;
@GetMapping
public Object listUser() {
List<User> list = userService.listUser();
return list;
}
}
總結(jié)
各種具體協(xié)議、注冊(cè)中心、多注冊(cè)中心、超時(shí)等配置可以查看官方文檔 http://dubbo.apache.org/zh-cn/docs/user/quick-start.html
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 詳解SpringBoot開(kāi)發(fā)案例之整合Dubbo分布式服務(wù)
- Springboot-dubbo-fescar 阿里分布式事務(wù)的實(shí)現(xiàn)方法
- SpringBoot+Dubbo+Seata分布式事務(wù)實(shí)戰(zhàn)詳解
- 詳解SpringBoot基于Dubbo和Seata的分布式事務(wù)解決方案
- SpringBoot中dubbo+zookeeper實(shí)現(xiàn)分布式開(kāi)發(fā)的應(yīng)用詳解
- SpringBoot+Dubbo+Zookeeper實(shí)現(xiàn)簡(jiǎn)單分布式開(kāi)發(fā)的應(yīng)用詳解
- springboot分布式整合dubbo的方式
- springBoot+dubbo+zookeeper實(shí)現(xiàn)分布式開(kāi)發(fā)應(yīng)用的項(xiàng)目實(shí)踐
- Spring與Dubbo搭建一個(gè)簡(jiǎn)單的分布式詳情
相關(guān)文章
淺談Java分布式架構(gòu)下如何實(shí)現(xiàn)分布式鎖
這篇文章主要介紹了淺談Java分布式架構(gòu)下如何實(shí)現(xiàn)分布式鎖,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
eclipse項(xiàng)目在IDEA中打開(kāi)并運(yùn)行的詳細(xì)圖文教程
這篇文章主要給大家介紹了關(guān)于eclipse項(xiàng)目在IDEA中打開(kāi)并運(yùn)行的詳細(xì)圖文教程,至從使用IDEA開(kāi)發(fā)工具以來(lái),不少次有使用IDEA運(yùn)行Eclipse項(xiàng)目或非Maven項(xiàng)目,所以這里給大家總結(jié)下,需要的朋友可以參考下2023-09-09
SpringBoot自定義HttpMessageConverter操作
這篇文章主要介紹了SpringBoot自定義HttpMessageConverter的操作,具有很好的參考價(jià)值,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08

