• dubbo分布式服务框架入门


    目录

    1.dubbo简介

    2.dubbo架构

    3.dubbo搭建

    3.1本地本地搭建service和web模块

    3.2dubbo搭建

    3.3优化dubbo搭建


    本文参考b站黑马程序员dubbo入门课程

    视频连接:https://www.bilibili.com/video/BV1VE411q7dX?p=1


    1.dubbo简介

    Dubbo是阿里巴巴公司开源的一个高性能、轻量级的JavaRPC框架,致力于提供高性能和透明化

    RPC远程服务调用方案,以及SOA服务治理方案

    dubbo官网:

    Apache Dubbo

    2.dubbo架构

    官方文档提供的dubbo架构

    Provider 服务的提供方

    Container 容器

    Consumer 服务消费方

    Registry 注册中心

    Monitor 监控者

    init 初始化创建

    async 异步

    sync 同步

    流程:

    1. Provider在一个容器中(比如:tomcat)由容器进行Provider的创建(步骤0)

    2. Provider将自己的ip地址、端口号、发布的url地址等一些信息放在注册中心进行注册(步骤1)

    3. Consumer想要Provider提供的服务,向注册中心发送请求发现服务(步骤2)

    4. 注册中心将Providerr的ip地址、端口号、发布的url地址等一些信息发生给Consumer(步骤3)

    5. Consumer进行调用Provider(步骤4)

    6. 步骤5是进行服务调用的监控

    3.dubbo搭建

    3.1本地本地搭建service和web模块

    1. 创建两个maven模块

    2. 导入依赖和版本坐标

    ? 
    ? ? ? ? ?5.1.9.RELEASE
    ? ? ? ? ?2.7.4.1
    ? ? ? ? ?4.0.0
    ? ? ?
    ??
    ? ? ?
    ? ? ? ? ?
    ? ? ? ? ?
    ? ? ? ? ? ? ?javax.servlet
    ? ? ? ? ? ? ?javax.servlet-api
    ? ? ? ? ? ? ?3.1.0
    ? ? ? ? ? ? ?provided
    ? ? ? ? ?
    ? ? ? ? ?
    ? ? ? ? ?
    ? ? ? ? ? ? ?org.springframework
    ? ? ? ? ? ? ?spring-context
    ? ? ? ? ? ? ?${spring.version}
    ? ? ? ? ?
    ? ? ? ? ?
    ? ? ? ? ? ? ?org.springframework
    ? ? ? ? ? ? ?spring-webmvc
    ? ? ? ? ? ? ?${spring.version}
    ? ? ? ? ?
    ? ? ? ? ?
    ? ? ? ? ?
    ? ? ? ? ? ? ?org.slf4j
    ? ? ? ? ? ? ?slf4j-api
    ? ? ? ? ? ? ?1.7.21
    ? ? ? ? ?
    ? ? ? ? ?
    ? ? ? ? ? ? ?org.slf4j
    ? ? ? ? ? ? ?slf4j-log4j12
    ? ? ? ? ? ? ?1.7.21
    ? ? ? ? ?
    ??
    ? ? ? ? ?
    ? ? ? ? ?
    ? ? ? ? ? ? ?org.apache.dubbo
    ? ? ? ? ? ? ?dubbo
    ? ? ? ? ? ? ?${dubbo.version}
    ? ? ? ? ?
    ? ? ? ? ?
    ? ? ? ? ?
    ? ? ? ? ? ? ?org.apache.curator
    ? ? ? ? ? ? ?curator-framework
    ? ? ? ? ? ? ?${zookeeper.version}
    ? ? ? ? ?
    ? ? ? ? ?
    ? ? ? ? ?
    ? ? ? ? ? ? ?org.apache.curator
    ? ? ? ? ? ? ?curator-recipes
    ? ? ? ? ? ? ?${zookeeper.version}
    ? ? ? ? ?
    ??
    ? ? ?
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57

    dubbo-web的pom.xml除了上述依赖包外还需要导入tomcat编译插件和打包方式war包

    ?war
    ?
    ? ? ?
    ? ? ? ? ?
    ? ? ? ? ? ? ?org.apache.tomcat.maven
    ? ? ? ? ? ? ?tomcat7-maven-plugin
    ? ? ? ? ? ? ?2.2
    ? ? ? ? ? ? ?
    ? ? ? ? 
    ? ? ? ? ? ? ? ? ?8000
    ? ? ?
    ? ? ? ? ? ? ? ? ?/
    ? ? ? ? ? ? ?
    ? ? ? ? ?
    ? ? ?
    ?
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    dubbo-web模块下

    controller层

    ?@RestController
    ?@RequestMapping("/user")
    ?public class UserController {
    ? ? ?@Autowired
    ? ? private UserService userService;
    ??
    ? ? ?@RequestMapping("/demo")
    ? ? ?public String demo(){
    ? ? ? ? ?return userService.demo();
    ? ?  }
    ?}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    springmvc.xml配置

    ? 
    ?
    ?
    ? ? ?
    
    • 1
    • 2
    • 3
    • 4

    web.xml配置

    ?
    ? ? 
    ? ? ? ? contextConfigLocation
    ? ? ? ? classpath*:spring/applicationContext*.xml
    ? ? 
    ? ? 
    ? ? ? ? org.springframework.web.context.ContextLoaderListener
    ? ? 
    ? ? ?
    ? ?
    ? ? 
    ? ? ? ? springmvc
    ? ? ? ? org.springframework.web.servlet.DispatcherServlet
    ? ? ? ? 
    ? ? ? ? 
    ? ? ? ? ? ? contextConfigLocation
    ? ? ? ? ? ? classpath:spring/springmvc.xml
    ? ? ? ? 
    ? ? 
    ??
    ? ? 
    ? ? ? ? springmvc
    ? ? ? ? *.do
    ? ? 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    dubbo-service模块下

    UserServiceImpl类

    ?@Service
    ?public class UserServiceImpl implements UserService {
    ? ? ?@Override
    ? ? ?public String demo() {
    ? ? ? ? ?return "hello,Dubbo";
    ? ?  }
    ?}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    UserService接口

    ?public interface UserService {
    ? ? ?/**
    ? ? ? * 测试方法
    ? ? ? * @return
    ? ? ? */
    ? ? ?public String demo();
    ?}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    配置applicationContext

    ?
    ?
    
    • 1
    • 2

    最后关联一下dubbo-service到dubbo-web中,在dubbo-web的pom.xml导入dubbo-service依赖

    ?
    ? ? ?com.xue
    ? ? ?dubbo-service
    ? ? ?1.0-SNAPSHOT
    ?
    
    • 1
    • 2
    • 3
    • 4
    • 5

    maven管理中install一下dubbo-service模块,然后在dubbo-web的maven管理中选择tomcat7:run插件进行启动

    在浏览器访问 localhost:8000/user/demo

    出现 hello,Dubbo

    以上这只是本地启动,而不是远程,也就是说还没有用到dubbo

    3.2dubbo搭建

    改造服务提供者

    1.修改UserServiceImpl中的service注解

    ?import org.apache.dubbo.config.annotation.Service;
    ?//@Service  //将该类的对象创建出来,放到spring的IOC容器中 bean定义
    ?@Service ? ? ?//dubbo中的service注解 将该类提供的方法(服务)对外发布,将访问的地址、ip、端口、路径注册到注册中心
    
    • 1
    • 2
    • 3

    2.在applicationContext.xml配置文件中新增

    ?
    ?
    ?
    ?
    ?
    ?
    ?
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    3.将dubbo-web中的webapp放到dubbo-service中,需要在文件结构project structure中faces中给dubbo-service添加web服务,并修改路径到 包结构+dubb-websrcmainwebappWEB-INFweb.xml

    4.把tomcat7插件导入pom文件中,注意端口号不要和web中的冲突,并配置打包方式为war包

    在IDEA右侧maven管理中对dubbo-service模块进行package然后选择tomcat7:run插件进行启动

    改造服务消费者dubbo-web

    1. 删掉pom文件中对dubbo-service的依赖,因为我们要模拟远程交互,但是两个模块在同一台主

    机上,所以要删除依赖,让两个模块进行远程交互

    2. 这个时候UserController类肯定就报错了,因为我们之前是直接进行关联,web模块可以与service模块进行交互,但是删掉依赖之后就无法进行本地交互了。我们可以在web模块创建一个UserService接口,先让它不报错,但是@Autowired还是报错,因为本地没有这个bean无法进行spring注入,因此我们需要进行远程注入

    ? //@Autowired //本地注入
    ? /**
    ? ?* 1.从zookeeper注册中心获取userService的访问url
    ? ?* 2.进行远程调用RPC
    ? ?* 3.将结果封装成一个代理对象,给变量赋值
    ? ?*/
    ? @Reference //远程注入
    ?private UserService userService;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    3.配置springmvc配置文件与service的dubbo配置相同,只是修改下dubbo包扫描

    ?
    ?
    ? ?
    ?
    ?
    ?
    ?
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    4.删除web.xml中spring的配置原理与第二步相同

    ? ? ?
    ?
    ?
    ?
    ?
    ?
    ?
    ?
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    5.tomcat7:run插件进行启动

    然后完美访问:

    虽然能正常访问,但是控制台日志信息,有一个异常

    ?RROR 2022-03-09 10:46:59,104 org.apache.dubbo.qos.server.Server:  
    [DUBBO] qos-server can not bind localhost:22222, dubbo version: 2.7.4.1, current host: 主机IP
    ? ? ?
    ?java.net.BindException: Address already in use: bind
    
    • 1
    • 2
    • 3
    • 4

    这个异常很常见,是端口冲突qos服务的端口22222被占用了。qos是dubbo自带的用于监控的组件,我们在同一台主机上模拟远程交互,启动了消费者和提供者两方,因此就造成了端口冲突,在实际多台主机交互中不会出现此问题

    如果在一台主机上解决此问题需要在任一方修改下配置 (比如dubbo-web模块),配置下此模块qos的端口为另一个就欧克了!

    ?
    ?
    ? ? ?
    ?
    
    • 1
    • 2
    • 3
    • 4

    dubbo小案例就完成了!!!

    3.3优化dubbo搭建

    web和service远程交互为了能使用spring注入UserService接口,我们之前解决方案是在web中也创

    建一个UserService接口。如果有大量的接口我们都需要重新创建,而且要保证与service中的接口

    完全相同。我们自己本地测试可以直接复制过来,但是我们是在模拟远程交互,因此service和web

    模块是不同的人不同的主机负责的,我们怎么能很好的保证接口相同呢?

    一个解决办法就是将接口抽取成新的公共模块,此模块包含所有接口,在使用时导入关联依赖。

    其他模块都有一份此模块,保证了相同,实现了service开发和web开发的分离(不需要进行接口

    的****协商)

    1.新建一个模块dubbo-interface,将UserService接口放在此模块中。web和service都要导入dubbo-interface的依赖

    ?
    ?
    ? ? ?com.xue
    ? ? ?dubbo-interface
    ? ? ?1.0-SNAPSHOT
    ?
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2.删掉web和service中的UserService接口

    3.maven管理中lifecycle->install一下dubbo-interface,然后tomcat7:run插件分别启动dubbo-

    service和dubbo-web

    成功!!!


    如果在配置dubbo上有什么疑问可以私信我,需要源码的伙伴也可以私信我!

  • 相关阅读:
    python KNN分类算法实战(使用鸢尾花数据集)
    EMQX +计算巢:构建云上物联网平台,轻松实现百万级设备连接
    GStreamer应用开发手册学习笔记之二
    个人做量化交易一定不靠谱?
    Docker 第十三章 : Docker 三剑客之 Swarm(服务管理命令)
    Axure绘制数字加减器
    Redis的常用数据结构之字符串类型
    内容爆炸时代,如何打造品牌经营的“弹药库”?
    保证金监控中心查询期货开户密码
    Spring Cloud Zookeeper 升级为Spring Cloud Kubernetes
  • 原文地址:https://blog.csdn.net/m0_67401055/article/details/126327998