SpringBoot下采用Dubbo进行服务治理

Dubbo 是什么

Apache Dubbo™ (incubating)是一款高性能Java RPC框架
官网:
http://dubbo.apache.org/zh-cn/index.html
使用感受:
Dubbo将传统的服务调用关系分为了消费者和提供者。符合现在前后端分离的这种模式。

Dubbo架构如图
在这里插入图片描述
节点角色说明:

节点 角色说明
Provider 暴露服务的服务提供方
Consumer 调用远程服务的服务消费方
Registry 服务注册与发现的注册中心
Monitor 统计服务的调用次数和调用时间的监控中心
Container 服务运行容器

使用记录

主要记录dubbo的工作流程,加深理解,如果需要详细的配置及代码请移步度娘

1、服务注册中心

使用zookeeper作为服务注册中心,将其部署在docker上。
Zookeeper 是 Apacahe Hadoop 的子项目,是一个树型的目录服务,支持变更推送,适合作为 Dubbo 服务的注册中心,工业强度较高,可用于生产环境,并推荐使用。

部署+启动

#启动docker
service docker start
#拉取镜像
docker pull zookeeper:3.5
#创建容器
docker create --name zk -p 2181:2181 zookeeper:3.5
#启动容器
docker start zk

启动成功后,可查看容器运行情况

docker ps 

在这里插入图片描述
默认端口是2181。

2、SpringBoot下引入Dubbo进行服务治理

最明显的感受就是dubbo是非侵入性的,原先的service可以不发生改变,由dubbo调用该service并暴露一个dubbo服务接口给controller,简单的代码就可以实现服务治理。

2.1dubbo配置

在springboot的配置文件application.properties中

#Dubbo配置
# Service version
dubbo.service.version = 1.0.0

# 服务的扫描包
dubbo.scan.basePackages  = zhong.dubbo.server.api

# 应用名称
dubbo.application.name = dubbo-provider-house-resources

# 协议以及端口
dubbo.protocol.name = dubbo
dubbo.protocol.port = 20881

# zk注册中心
dubbo.registry.address = zookeeper://192.168.146.128:2181
dubbo.registry.client = zkclient

2.2dubbo使用

2.2.1定义dubbo服务接口

在这里插入图片描述
dubbo的服务要实现此接口,同时,该接口也是暴露给外层应用调用的,需要注意的是,要把接口和实现分开。

2.2.2实现dubbo服务接口

在这里插入图片描述
新增一个api包,在这里使用dubbo并暴露出dubbo服务的接口给表现层(我随便说的,感觉像类似)

/**
 * 这个是dubbo服务,不要和spring的服务搞混了
 */
@Service(version = "1.0.0")
public class HouseResourcesService implements ApiHouseResourcesService {

    /**
     * 注入的是spring的服务
     */
    @Autowired
    private zhong.dubbo.server.service.HouseResourcesService houseResourcesService;

    @Override
    public int saveHouseResources(HouseResources houseResources) {
        return this.houseResourcesService.saveHouseResources(houseResources);
    }
}

2.3查看dubbo服务

利用dubbo-admin即可查看注册的服务
如果没配置过dubbo-admin,可以看这篇
https://blog.csdn.net/weixin_41154636/article/details/96478016
在这里插入图片描述

扫描二维码关注公众号,回复: 13142663 查看本文章

2.3调用dubbo

在Controller中,因为在上一步中已经完成dubbo服务接口的定义及实现,并且把dubbo 服务的接口注入到spring容器中了。所以只需要在controller中调用duddo服务即可。
使用起来非常简单呢。

@RequestMapping("house/resources")
@Controller
public class HouseResourcesController {
    @Autowired
    private HouseResourcesService houseResourcesService;

    /**
     *
     * @param houseResources 接收json数据
     * @return
     */
    @PostMapping
    @ResponseBody
    public ResponseEntity<Void> save(@RequestBody HouseResources houseResources){
        try {
            boolean success = this.houseResourcesService.save(houseResources);
            if(success){
                return ResponseEntity.status(HttpStatus.CREATED).build();
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
    }


    @GetMapping
    @ResponseBody
    public ResponseEntity<String> get(){
        return ResponseEntity.ok("ok");
    }
}

可以从dubbo-admin中看到消费者列表
在这里插入图片描述
这个时候这里的消费者就是指某个controller,这里只是完成了服务的订阅,当某个请求过来的时候,才是真正的服务调用,dubbo会根据负载均衡的不同策略对已注册的服务选择调用。

Dubbo的工作流程总结

  1. 服务容器负责启动,加载,运行服务提供者。
  2. 服务提供者在启动时,向注册中心注册自己提供的服务。
  3. 服务消费者在启动时,向注册中心订阅自己所需的服务。
  4. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
  5. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另
    一台调用。
  6. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

猜你喜欢

转载自blog.csdn.net/weixin_41154636/article/details/96500129