Spring Boot Dubbo 构建分布式服务的方法

网友投稿 267 2023-01-06


Spring Boot Dubbo 构建分布式服务的方法

概述:

节点角色说明

节点

角色说明

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 listUser();

}

Provider 服务提供者

pom依赖:

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

org.springframework.boot

spring-boot-starter

spring-boot-starter-logging

org.springframework.boot

zero.springboot.study

dubbo-api

1.0.0-SNAPSHOT

org.apache.dubbo

dubbo-spring-boot-starter

2.7.1

org.apache.dubbo

dubbo

2.7.1

org.apache.dubbo

dubbo-dependencies-zookeeper

2.7.1

pom

log4j

log4j

slf4j-log4j12

org.slf4j

com.alibaba

fastjson

1.2.57

配置文件 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 listUser() {

User user = new User();

user.setId(1L);

user.setUsername("青龙");

return Lists.newArrayList(user);

}

}

Consumer

Pom 定义:

我们要依赖 spring-boot-starter-web 提供http rest接口给前端调用。同时内部通过 Dubbo 实现 RPC调用服务提供者。

org.springframework.boot

spring-boot-starter-web

org.springframework.boot

spring-boot-starter-logging

zero.springboot.study

dubbo-api

1.0.0-SNAPSHOT

org.apache.dubbo

dubbo-spring-boot-starter

2.7.1

org.apache.dubbo

dubbo

2.7.1

org.apache.dubbo

dubbo-dependencies-zookeeper

2.7.1

pom

log4j

log4j

slf4j-log4j12

org.slf4j

org.projectlombok

lombok

true

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 listUser() {

return userProvider.listUser();

}

}

我们通过一个RESTfull接口,提供给前端调用。

@RestController

@RequestMapping("/users")

public class UserController {

@Autowired

private UserService userService;

@GetMapping

public Object listUser() {

List list = userService.listUser();

return list;

}

}

总结

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


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:go接口自动化框架(go 接口实现)
下一篇:怎么用类实现接口(接口的实现类是什么)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~