Spring Boot Dubbo 構(gòu)建分布式服務(wù)的方法
概述:
節(jié)點(diǎn)角色說明
節(jié)點(diǎn) | 角色說明 |
---|---|
Provider | 暴露服務(wù)的服務(wù)提供方 |
Consumer | 調(diào)用遠(yuǎn)程服務(wù)的服務(wù)消費(fèi)方 |
Registry | 服務(wù)注冊與發(fā)現(xiàn)的注冊中心 |
Monitor | 統(tǒng)計(jì)服務(wù)的調(diào)用次數(shù)和調(diào)用時(shí)間的監(jiān)控中心 |
Container | 服務(wù)運(yùn)行的容器 |
調(diào)用關(guān)系說明
- 服務(wù)容器 Container 負(fù)責(zé)啟動,加載,運(yùn)行服務(wù)提供者。
- 服務(wù)提供者 Provider 啟動的時(shí)候,向注冊中心 Registry 注冊自己提供的服務(wù)。
- 服務(wù)消費(fèi)者 Consumer 在啟動的時(shí)候,向注冊中心 Registry 訂閱自己所需要的服務(wù)。注冊中心 Registry 返回服務(wù)提供者的地址列表給消費(fèi)者,如果有變更注冊中心將基于長連接推送變更數(shù)據(jù)給消費(fèi)者。
- 服務(wù)消費(fèi)者從提供者地址列表中,基于軟負(fù)載均衡算法,選擇一臺提供者進(jìn)行進(jìn)行調(diào)用,如果調(diào)用失敗再選擇另外一臺。
- 服務(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)建
開發(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)者依賴,服務(wù)者實(shí)現(xiàn)接口。該工程只有接口定義以及 model 對象。@Data 屬于lombok 開源庫提供的特性,方便開發(fā)。
model 對象定義:
@Data public class User implements Serializable { private Long id; private String username; }
provider 接口定義:
public interface UserProvider { List<User> listUser(); }
Provider 服務(wù)提供者
pom依賴:
引入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: # 注冊中心配置 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)類所在包 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 定義:
我們要依賴 spring-boot-starter-web 提供http rest接口給前端調(diào)用。同時(shí)內(nèi)部通過 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(); } }
我們通過一個(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é)議、注冊中心、多注冊中心、超時(shí)等配置可以查看官方文檔 http://dubbo.apache.org/zh-cn/docs/user/quick-start.html
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 詳解SpringBoot開發(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)分布式開發(fā)的應(yīng)用詳解
- SpringBoot+Dubbo+Zookeeper實(shí)現(xiàn)簡單分布式開發(fā)的應(yīng)用詳解
- springboot分布式整合dubbo的方式
- springBoot+dubbo+zookeeper實(shí)現(xiàn)分布式開發(fā)應(yīng)用的項(xiàng)目實(shí)踐
- Spring與Dubbo搭建一個(gè)簡單的分布式詳情
相關(guān)文章
淺談Java分布式架構(gòu)下如何實(shí)現(xiàn)分布式鎖
這篇文章主要介紹了淺談Java分布式架構(gòu)下如何實(shí)現(xiàn)分布式鎖,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07eclipse項(xiàng)目在IDEA中打開并運(yùn)行的詳細(xì)圖文教程
這篇文章主要給大家介紹了關(guān)于eclipse項(xiàng)目在IDEA中打開并運(yùn)行的詳細(xì)圖文教程,至從使用IDEA開發(fā)工具以來,不少次有使用IDEA運(yùn)行Eclipse項(xiàng)目或非Maven項(xiàng)目,所以這里給大家總結(jié)下,需要的朋友可以參考下2023-09-09SpringBoot自定義HttpMessageConverter操作
這篇文章主要介紹了SpringBoot自定義HttpMessageConverter的操作,具有很好的參考價(jià)值,如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08