Dubbo快速入门

1、Dubbo是什么

1、RPC是什么

Remote Procedure Call,远程过程调用(服务器间调用),是一种进程间的通信方式,是一种技术的思想而不是规范。允许程序调用另一个地址空间的函数或过程。实质上是利用http协议,完成参数、方法名的传递并获得返回值,以此达到远程调用的目的。

原理说明:

具体的执行过程:

2、Dubbo

Dubbo是一款高性能java RPC 框架,可以做:面向接口的高性能RPC调用、智能负载均衡(当多个服务器都有相同业务时进行选择)、支持注册中心服务、高可扩、运行器流量调度、灰度发布、可视化的运维和治理

Dubbo的设计架构:

3、ZooKeeper

充当注册中心的角色,provider在ZooKeeper中注册,consumer去注册中心订阅

ZooKeeper安装

官网下载压缩包解压;

在bin目录下执行zkServer.cmd;如执行失败,在conf目录下拷贝一份zoo_sample.cfg并重命名为zoo.cfg(在zoo.cfg中配置ZooKeeper数据存放位置);

再次执行zkServer.cmd成功后在另一个窗口中执行zkCli.cmd,运行成功后可执行指令

注:两个cmd窗口同时存在

4、需要的安装包

链接:https://pan.baidu.com/s/1Gv2zw4BUNZbFBaPDfJD3HQ
提取码:0707

monitor页面安装

zookeeper按上述步骤解压安装即可,dubbo的monitor安装给的是jar包直接通过java -jar dubbo-admin-0.0.1SNAPSHOT.jar运行,访问localhost:7001即可进入monitor页面

2、Dubbo整合SpringBoot

示例:创建两个SpringBoot项目(provider、consumer)、一个maven项目(common-component抽取出公共类和接口,具体见这篇文章https://www.cnblogs.com/Gw-CodingWorld/p/16615443.html,通过dependency引入两个项目中),每个项目中内嵌tomcat服务器,在这两个项目间进行服务的调用,即两个服务器间的服务调用

1、引入starter

<!-- https://mvnrepository.com/artifact/com.alibaba.boot/dubbo-spring-boot-starter -->
<dependency>
    <groupId>com.alibaba.boot</groupId>
    <artifactId>dubbo-spring-boot-starter</artifactId>
    <version>0.2.1.RELEASE</version>
</dependency>

<dependency>
    <groupId>org.apache.curator</groupId>
    <artifactId>curator-framework</artifactId>
    <version>2.12.0</version>
</dependency>

2、进行配置

dubbo:
  application:
    name: dubbo-service-provider
  registry:
    protocol: zookeeper
    address: 127.0.0.1:2181
  protocol:
    name: dubbo
    port: 20880
  monitor:
    protocol: registry
    
server:
	port: 8080  #注意两个项目端口号不一样,否则在电脑上不能同时运行

3、项目结构说明

common-component

特别说明:抽取的公共类中的实体类需要序列化,即对下例中的User实现Serializable接口

抽取的公共类,加入至本地maven仓库的方法见https://www.cnblogs.com/Gw-CodingWorld/p/16615443.html

<!--抽取出来的公共类在两个SpringBoot项目中依赖引用-->
<dependency>
    <groupId>com.common</groupId>
    <artifactId>common-component</artifactId>
    <version>0.0.1</version>
</dependency>

SpingBoot启动类

两个项目都要开启@EnableDubbo

package com.gw;

import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@EnableDubbo
@SpringBootApplication
public class DubboProviderApplication {

    public static void main(String[] args) {
        SpringApplication.run(DubboProviderApplication.class, args);
    }

}

provider

在provider项目中实现公用的UserService接口,注意@Service为Dubbo包中的注解,使服务暴露在Dubbo中,即在注册中心进行注册,其他服务器可以使用@Reference来引用该类

package com.gw.service;

import com.alibaba.dubbo.config.annotation.Service;
import org.springframework.stereotype.Component;
import pojo.User;
import service.UserService;

import java.util.List;

@Service
@Component
public class UserServiceImpl implements UserService {
    @Override
    public List<User> queryUser() {
        List<User> list= null;
        list.add(new User("zhangsan","123456","1"));
        list.add(new User("zhangsan","123456","1"));
        list.add(new User("zhangsan","123456","1"));
        list.add(new User("zhangsan","123456","1"));
        return list;
    }
}

consumer

1661225294005

在consumer项目中调用provider服务器中实现的UserService

package com.gw.controller;

import com.alibaba.dubbo.config.annotation.Reference;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.ResponseBody;
import pojo.User;
import service.UserService;

import java.util.List;

@Controller
public class test {

    @Reference    //引用暴露出来的服务
    UserService userService;

    @RequestMapping("/hello")
    @ResponseBody
    List<User> testDubbo(){

        List<User> list = userService.queryUser();

        return list;
    }

}

3、可能出现的问题

  1. Invalid File Path ---> 将data目录中的记录删除或者在zoo.cfg文件中重新设置一个dataDir,重新启动zookeeper
  2. 注意,项目必须要先启动provider后启动consumer
  3. 小技巧,启动zookeeper后先启动dubbo的monitor(localhost:7001)页面,通过该页面来判断是否注册到zookeeper中,如已注册则说明java程序有问题
  4. java程序有问题了先检查pojo实体类是否序列化,再检查dao、service、controller
  5. 依赖要引入starter和curator
  6. java.io.IOException: Can not lock the registry cache file D:\home.dubbu\runtime.cache, ignore and retry later, maybe multi java process use the file, please config: dubbo.registry.file=xxx.properties ---> 在provider中设置registry.file= ${catalina.home}/dubbo-registry/dubbo-registry.properties
posted @ 2022-08-24 11:26  CDUT的一只小菜鸡  阅读(118)  评论(0编辑  收藏  举报