天天看點

Spring Boot Dubbo 建構分布式服務

Spring Boot Dubbo 建構分布式服務

概述:

Spring Boot Dubbo 建構分布式服務

節點角色說明

節點 角色說明
Provider 暴露服務的服務提供方
Consumer 調用遠端服務的服務消費方
Registry 服務注冊與發現的注冊中心
Monitor 統計服務的調用次數和調用時間的監控中心
Container 服務運作的容器

調用關系說明

  1. 服務容器 Container 負責啟動,加載,運作服務提供者。
  2. 服務提供者 Provider 啟動的時候,向注冊中心 Registry 注冊自己提供的服務。
  3. 服務消費者 Consumer 在啟動的時候,向注冊中心 Registry 訂閱自己所需要的服務。
  4. 注冊中心 Registry 傳回服務提供者的位址清單給消費者,如果有變更注冊中心将基于長連接配接推送變更資料給消費者。
  5. 服務消費者從提供者位址清單中,基于軟負載均衡算法,選擇一台提供者進行進行調用,如果調用失敗再選擇另外一台。
  6. 服務消費者與提供者在記憶體中統計調用次數和調用時間,定時每分鐘發送一次統計資料到監控中心 Monitor 。

項目建構

開發環境主要涉及以下方面:

  • Spring Boot
  • JDK 8
  • Dubbo 2.7.1
  • Zookeeper

具體代碼可以檢視 github 的 dubbo 子產品:https://github.com/UniqueDong/springboot-study

Dubbo API

定義服務接口,打成 jar 包讓消費者依賴,服務者實作接口。該工程隻有接口定義以及 model 對象。@Data 屬于lombok 開源庫提供的特性,友善開發。

  • model 對象定義:
  1. @Data

  2. public class User implements Serializable {

  3. private Long id;

  4. private String username;

  5. }

  • provider 接口定義:
  1. public interface UserProvider {

  2. List<User> listUser();

  3. }

Provider 服務提供者

  • pom依賴:

引入spring-boot-starter,dubbo-api 接口就是我們上面提到的 接口定義 jar ,dubbo-spring-boot-starter ,dubbo-dependencies-zookeeper。

  1. <dependencies>

  2. <dependency>

  3. <groupId>org.springframework.boot</groupId>

  4. <artifactId>spring-boot-starter</artifactId>

  5. <exclusions>

  6. <exclusion>

  7. <artifactId>spring-boot-starter-logging</artifactId>

  8. <groupId>org.springframework.boot</groupId>

  9. </exclusion>

  10. </exclusions>

  11. </dependency>

  12. <dependency>

  13. <groupId>zero.springboot.study</groupId>

  14. <artifactId>dubbo-api</artifactId>

  15. <version>1.0.0-SNAPSHOT</version>

  16. </dependency>

  17. <!--dubbo start-->

  18. <dependency>

  19. <groupId>org.apache.dubbo</groupId>

  20. <artifactId>dubbo-spring-boot-starter</artifactId>

  21. <version>2.7.1</version>

  22. </dependency>

  23. <dependency>

  24. <groupId>org.apache.dubbo</groupId>

  25. <artifactId>dubbo</artifactId>

  26. <version>2.7.1</version>

  27. </dependency>

  28. <!-- Zookeeper dependencies -->

  29. <dependency>

  30. <groupId>org.apache.dubbo</groupId>

  31. <artifactId>dubbo-dependencies-zookeeper</artifactId>

  32. <version>2.7.1</version>

  33. <type>pom</type>

  34. <exclusions>

  35. <exclusion>

  36. <artifactId>log4j</artifactId>

  37. <groupId>log4j</groupId>

  38. </exclusion>

  39. <exclusion>

  40. <artifactId>slf4j-log4j12</artifactId>

  41. <groupId>org.slf4j</groupId>

  42. </exclusion>

  43. </exclusions>

  44. </dependency>

  45. <!--dubbo end-->

  46. <dependency>

  47. <groupId>com.alibaba</groupId>

  48. <artifactId>fastjson</artifactId>

  49. <version>1.2.57</version>

  50. </dependency>

  51. </dependencies>

  • 配置檔案 yaml 定義:
  1. spring:

  2. application:

  3. name: dubbo-provider

  4. #自定義配置

  5. embedded:

  6. zookeeper:

  7. # zookeeper 服務連接配接端口

  8. port: 2181

  9. # dubbo 配置

  10. dubbo:

  11. # 注冊中心配置

  12. registry:

  13. id: dubbo-provider

  14. address: zookeeper://127.0.0.1:${embedded.zookeeper.port}

  15. group: local

  16. application:

  17. name: dubbo-provider

  18. id: dubbo-provider

  19. logger: slf4j

  20. qosEnable: true

  21. qosPort: 22224

  22. qosAcceptForeignIp: false

  23. # dubbo 協定配置

  24. protocol:

  25. # -1 表示使用随機未被占用的端口

  26. port: -1

  27. name: dubbo

  28. scan:

  29. # dubbo 服務提供者實作類所在包

  30. base-packages: com.zero.provider.impl

  • 實作 api 定義的接口

    注意 @Service 是 Dubbo 的,不要導入了 Spring 的。

  1. import com.google.common.collect.Lists;

  2. import com.zero.api.model.User;

  3. import com.zero.api.provider.UserProvider;

  4. import org.apache.dubbo.config.annotation.Service;

  5. import java.util.List;

  6. @Service(interfaceClass = UserProvider.class)

  7. public class UserProviderImpl implements UserProvider {

  8. @Override

  9. public List<User> listUser() {

  10. User user = new User();

  11. user.setId(1L);

  12. user.setUsername("青龍");

  13. return Lists.newArrayList(user);

  14. }

  15. }

  • Pom 定義:

我們要依賴 spring-boot-starter-web 提供http rest接口給前端調用。同時内部通過 Dubbo 實作 RPC調用服務提供者。

  1. <dependencies>

  2. <dependency>

  3. <groupId>org.springframework.boot</groupId>

  4. <artifactId>spring-boot-starter-web</artifactId>

  5. <exclusions>

  6. <exclusion>

  7. <groupId>org.springframework.boot</groupId>

  8. <artifactId>spring-boot-starter-logging</artifactId>

  9. </exclusion>

  10. </exclusions>

  11. </dependency>

  12. <dependency>

  13. <groupId>zero.springboot.study</groupId>

  14. <artifactId>dubbo-api</artifactId>

  15. <version>1.0.0-SNAPSHOT</version>

  16. </dependency>

  17. <!--dubbo start-->

  18. <dependency>

  19. <groupId>org.apache.dubbo</groupId>

  20. <artifactId>dubbo-spring-boot-starter</artifactId>

  21. <version>2.7.1</version>

  22. </dependency>

  23. <dependency>

  24. <groupId>org.apache.dubbo</groupId>

  25. <artifactId>dubbo</artifactId>

  26. <version>2.7.1</version>

  27. </dependency>

  28. <!-- Zookeeper dependencies -->

  29. <dependency>

  30. <groupId>org.apache.dubbo</groupId>

  31. <artifactId>dubbo-dependencies-zookeeper</artifactId>

  32. <version>2.7.1</version>

  33. <type>pom</type>

  34. <exclusions>

  35. <exclusion>

  36. <artifactId>log4j</artifactId>

  37. <groupId>log4j</groupId>

  38. </exclusion>

  39. <exclusion>

  40. <artifactId>slf4j-log4j12</artifactId>

  41. <groupId>org.slf4j</groupId>

  42. </exclusion>

  43. </exclusions>

  44. </dependency>

  45. <!--dubbo end-->

  46. <dependency>

  47. <groupId>org.projectlombok</groupId>

  48. <artifactId>lombok</artifactId>

  49. <optional>true</optional>

  50. </dependency>

  51. </dependencies>

  • yaml 定義:
  1. server:

  2. # web 日更年期端口

  3. port: 9005

  4. spring:

  5. application:

  6. name: dubbo-comsumer

  7. #自定義配置

  8. embedded:

  9. zookeeper:

  10. port: 2181

  11. # dubbo 配置

  12. dubbo:

  13. registry:

  14. id: dubbo-comsumer

  15. address: zookeeper://127.0.0.1:${embedded.zookeeper.port}

  16. group: local

  17. application:

  18. name: dubbo-comsumer

  19. id: dubbo-comsumer

  20. logger: slf4j

  21. qosEnable: false

  22. qosPort: 22223

  23. qosAcceptForeignIp: false

  24. protocol:

  25. port: -1

  26. name: dubbo

  27. # 是否檢查服務提供者有效

  28. consumer:

  29. check: false

  • 服務消費者調用服務生産者
  1. import com.zero.api.model.User;

  2. import com.zero.api.provider.UserProvider;

  3. import org.apache.dubbo.config.annotation.Reference;

  4. import org.springframework.stereotype.Service;

  5. import java.util.List;

  6. @Service

  7. public class UserService {

  8. @Reference

  9. private UserProvider userProvider;

  10. public List<User> listUser() {

  11. return userProvider.listUser();

  12. }

  13. }

  • 我們通過一個RESTfull接口,提供給前端調用。
  1. @RestController

  2. @RequestMapping("/users")

  3. public class UserController {

  4. @Autowired

  5. private UserService userService;

  6. @GetMapping

  7. public Object listUser() {

  8. List<User> list = userService.listUser();

  9. return list;

  10. }

  11. }

總結

繼續閱讀