Spring Boot Dubbo 构建分布式服务
程序员文章站
2022-04-14 18:49:53
概述: 节点角色说明 | 节点 | 角色说明 | | | | | Provider | 暴露服务的服务提供方 | | Consumer | 调用远程服务的服务消费方 | | Registry | 服务注册与发现的注册中心 | | Monitor | 统计服务的调用次数和调用时间的监控中心 | | C ......
概述:
节点角色说明
节点 | 角色说明 |
---|---|
provider | 暴露服务的服务提供方 |
consumer | 调用远程服务的服务消费方 |
registry | 服务注册与发现的注册中心 |
monitor | 统计服务的调用次数和调用时间的监控中心 |
container | 服务运行的容器 |
调用关系说明
- 服务容器 container 负责启动,加载,运行服务提供者。
- 服务提供者 provider 启动的时候,向注册中心 registry 注册自己提供的服务。
- 服务消费者 consumer 在启动的时候,向注册中心 registry 订阅自己所需要的服务。
- 注册中心 registry 返回服务提供者的地址列表给消费者,如果有变更注册中心将基于长连接推送变更数据给消费者。
- 服务消费者从提供者地址列表中,基于软负载均衡算法,选择一台提供者进行进行调用,如果调用失败再选择另外一台。
- 服务消费者与提供者在内存中统计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心 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 对象定义:
@data public class user implements serializable { private long id; private string username; }
- provider 接口定义:
public interface userprovider { list<user> listuser(); }
provider 服务提供者
- 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 服务连接端口 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 协议配置 protocol: # -1 表示使用随机未被占用的端口 port: -1 name: dubbo scan: # dubbo 服务提供者实现类所在包 base-packages: com.zero.provider.impl
-
实现 api 定义的接口
注意 @service 是 dubbo 的,不要导入了 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接口给前端调用。同时内部通过 dubbo 实现 rpc调用服务提供者。
<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 # 是否检查服务提供者有效 consumer: check: false
- 服务消费者调用服务生产者
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(); } }
- 我们通过一个restfull接口,提供给前端调用。
@restcontroller @requestmapping("/users") public class usercontroller { @autowired private userservice userservice; @getmapping public object listuser() { list<user> list = userservice.listuser(); return list; } }
总结
各种具体协议、注册中心、多注册中心、超时等配置可以查看官方文档
欢迎大家讨论纠正,邮箱:zero_develop@163.com 。点赞与关注微信公众号是我们前进的动力。
推荐阅读
-
spring Boot环境下dubbo+zookeeper的一个基础讲解与示例
-
Spring Boot Dubbo 构建分布式服务的方法
-
Spring Boot2 系列教程(一) | 如何使用 IDEA 构建 Spring Boot 工程
-
实战SpringCloud响应式微服务系列教程(第九章)使用Spring WebFlux构建响应式RESTful服务
-
Spring框架学习笔记(6)——阿里云服务器部署Spring Boot项目(jar包)
-
Spring boot项目部署到云服务器小白教程详解
-
Spring boot Mybatis整合构建Rest服务(超细版)
-
微服务架构盛行的时代,你需要了解点 Spring Boot
-
荐 微服务之Spring Boot2—降低开发复杂度之面向切面AOP
-
spring Boot+spring Cloud实现微服务详细教程第二篇