查看原文
其他

Spring Boot Dubbo 构建分布式服务

MageByte技术团队 码哥字节 2022-10-28

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. }

Consumer

  • 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. }

总结

各种具体协议、注册中心、多注册中心、超时等配置可以查看官方文档http://dubbo.apache.org/zh-cn/docs/user/quick-start.html

欢迎大家讨论纠正,邮箱:zero_develop@163.com 。点赞与关注是我们前进的动力


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存