Doubbo

news2025/1/16 18:55:11

目录

1.简介

2.架构

3.配置监控中心

4.模拟服务提供者

5.模拟服务消费者

6.消费者的其他配置

6.1协议

6.2启动时检查

6.3超时和重试

6.4负载均衡

7.补充


1.简介

        Apache Dubbo是一款高性能的Java RPC框架。其前身是阿里巴巴公司开源的一个高性能、轻量级的开源Java RPC框架,可以和Spring框架无缝集成。

RPC

        RPC全称为remote procedure call,即远程过程调用。比如两台服务器A和B,A服务器上部署一个应用,B服务器上部署一个应用,A服务器上的应用想调用B服务器上的应用提供的方法,由于两个应用不在一个内存空间,不能直接调用,所以需要通过网络来表达调用的语义和传达调用的数据。

        RPC是一个泛化的概念,RPC并不是一个具体的技术,而是指整个网络远程调用过程。严格来说一切远程过程调用手段都属于RPC范畴。各种开发语言都有自己的RPC框架。Java中的RPC框架比较多,广泛使用的有RMI、Hessian、Dubbo等。

2.架构

Dubbo架构图(Dubbo官方提供)如下:

0.tomcat容器启动。

1.将提供者服务注册到注册中心当中,dubbo提供的注册中心就是zookeeper。

2.消费者想要调用提供者提供的方法时,从注册中心拉去提供者的服务地址。

3.若提供者的服务地址发生了改变,注册中心则会马上通知消费者。

4.消费者根据服务中心提供的服务地址就可以直接调用提供者了,并且在调用提供者服务之后,就会将提供者的地址主动缓存下来。

5.监控消费者调用提供者的次数。

        消费者调用后会将提供者提供的路径缓存下来,这样即使注册中心宕机,消费者也还是可以通过缓存的地址调用提供者。

        zookeeper使用的连接方式是长链接。

3.配置监控中心

        在开发时,需要知道Zookeeper注册中心都注册了哪些服务,有哪些消费者来消费这些服务。我们可以通过部署一个管理中心来实现。其实管理中心就是一个web应用,部署到tomcat即可。

步骤:

1.GitHub上下一个dubbo-admin的war包。

2.准备一个tomcat容器,将war包放在tomcat的webapps下,并修改tomcat端口号,避免端口冲突。

3.启动tomcat,在启动完成后会将dubbo-admin.war解压,此时进入到WEB-INF中修改dubbo.properties,将其中连接zookeeper的配置进行修改。

4.重启tomcat。

5.浏览器访问http://localhost:自己定义的端口号/dubbo-admin/即可。​​​​​

访问时输入用户名密码,都是root。即可出现如下页面。

由于目前没有启动任何的服务提供者、消费者的项目,所以没有什么看的。

4.模拟服务提供者

创建服务提供者接口

public interface HelloService {
    public String sayHello(String name);
}

创建服务提供者实现类

@Service  //把此服务注册到zookeeper dubbo的注解
public class HelloServiceImpl implements HelloService {

        public String sayHello(String name) {
            return "hello " + name;
        }

}

创建配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"

       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans.xsd
         http://www.springframework.org/schema/mvc
         http://www.springframework.org/schema/mvc/spring-mvc.xsd
         http://code.alibabatech.com/schema/dubbo
         http://code.alibabatech.com/schema/dubbo/dubbo.xsd
         http://www.springframework.org/schema/context
         http://www.springframework.org/schema/context/spring-context.xsd">
    <!-- 当前应用名称,用于注册中心计算应用间依赖关系,注意:消费者和提供者应用名不要一样 -->
    <dubbo:application name="dubbodemo_provider" />
    <!-- 连接服务注册中心zookeeper ip为zookeeper所在服务器的ip地址-->
    <dubbo:registry address="zookeeper://127.0.0.1:2181"/>
    <!-- 注册 消费者调用当前项目时提供的协议名称和端口号 协议名称使用dubbo的协议 端口默认是20880 -->
    <dubbo:protocol name="dubbo" port="20881"></dubbo:protocol>
    <!-- 扫描指定包,加入@Service注解的类会被发布为服务  -->
    <dubbo:annotation package="com.study.service.impl" />

</beans>

创建main方法加载配置文件

    public static void main(String[] args) {
        ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("classpath:applicationContext-provider.xml");
        app.start();
        while (true){

        }

    }

效果:

在监控中心中看到了已经启动的服务提供者。

还有此服务提供的方法。

或者使用tomcat启动,web.xml中配置监听器加载配置文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		 xmlns="http://java.sun.com/xml/ns/javaee"
		 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
		 version="2.5">

	<!-- 监听器监听其他的spring配置文件 -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:applicationContext-provider.xml</param-value>
	</context-param>
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

</web-app>

5.模拟服务消费者

创建controller

@Controller
@RequestMapping("/demo")
public class HelloController {
    @Reference //dubbo的远程注入方式
    private HelloService helloService;

    @RequestMapping("/hello")
    @ResponseBody
    public String getName(String name){
        //远程调用
        String result = helloService.sayHello(name);
        System.out.println(result);
        return result;
    }

}

创建service

//包名要和提供者的包名保持一致
public interface HelloService {
    public String sayHello(String name);
}

创建springmvc的配置文件

用于配置包扫描以及dubbo的配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
        http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">


    <context:component-scan base-package="com.study"/>

    <!--告诉zookeeper 当前项目是哪个-->
    <dubbo:application name="dubbodemo_consumer"/>
    <!--链接注册中心-->
    <dubbo:registry address="zookeeper://127.0.0.1:2181"/>
    <!--注解扫描 扫描的是dubbo的 @Reference注解-->
    <dubbo:annotation package="com.itheima"/>

    <!--    timeout:每次请求都会等待3秒  retries失败后重试次数-->
    <dubbo:consumer timeout="3000" retries="0"/>


</beans>

创建web.xml配置文件

用于加载springmvc的配置文件,以及前端控制器

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		 xmlns="http://java.sun.com/xml/ns/javaee"
		 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
		 version="2.5">

	<servlet>
		<servlet-name>springmvc</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<!-- 指定加载的配置文件 ,通过参数contextConfigLocation加载-->
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath:spring/spring-mvc.xml</param-value>
		</init-param>
	</servlet>

	<servlet-mapping>
		<servlet-name>springmvc</servlet-name>
		<url-pattern>*.do</url-pattern>
	</servlet-mapping>

</web-app>

配置tomcat后启动

启动消费者后发现监控中心中还是没有消费者服务.

我们调用一次消费者的方法:

发现有所响应.并且在监控中心出现了消费者的服务.

 

此时我们把提供者服务关闭,就只剩下了消费者服务

并且告诉我们此服务没有提供者.

6.消费者的其他配置

6.1协议

<dubbo:protocol name="dubbo" port="20880"/>

        一般在服务提供者一方配置,可以指定使用的协议名称和端口号。 其中Dubbo支持的协议有:dubbo、rmi、hessian、http、webservice、rest、redis等。 推荐使用的是dubbo协议。 dubbo 协议采用单一长连接和 NIO 异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况。不适合传送大数据量的服务,比如传文件,传视频等,除非请求量很低。 也可以在同一个工程中配置多个协议,不同服务可以使用不同的协议,例如:

<!-- 多协议配置 -->

<dubbo:protocol name="dubbo" port="20880" />
<dubbo:protocol name="rmi" port="1099" />
<!-- 使用dubbo协议暴露服务 -->
<dubbo:service interface="com.study.api.HelloService" ref="helloService" protocol="dubbo" />

<!-- 使用rmi协议暴露服务 -->
<dubbo:service interface="com.study.api.DemoService" ref="demoService" protocol="rmi" />

6.2启动时检查

<dubbo:consumer check="true"/>

        上面这个配置需要配置在服务消费者一方,如果不配置默认check值为true。Dubbo 缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止 Spring 初始化完成,以便上线时,能及早发现问题。可以通过将check值改为false来关闭检查。 ​ 建议在开发阶段将check值设置为false,在生产环境下改为true。

6.3超时和重试

<!--设置超时时间以及重试次数-->
<dubbo:consumer timeout="3000"  retries="0"/>

        如果不做如上配置,默认提供者1秒之内没有响应结果就重试,总共会重试3次

6.4负载均衡

        负载均衡(Load Balance):其实就是将请求分摊到多个操作单元上进行执行,从而共同完成工作任务。在集群负载均衡时,Dubbo 提供了多种均衡策略(包括随机(random)、轮询(roundRobin)、最少活跃调用数(leastActive)、一致性Hash(consistentHash)),默认为random随机调用。配置负载均衡策略,既可以在服务提供者一方配置,也可以在服务消费者一方配置,如下:

@Controller
@RequestMapping("/demo")
public class HelloController {
   //在服务消费者一方配置负载均衡策略
   @Reference(check = false,loadbalance = "random")
   private HelloService helloService;

   @RequestMapping("/hello")
   @ResponseBody
   public String getName(String name){
      //远程调用
      String result = helloService.sayHello(name);
      System.out.println(result);
      return result;
   }
}
//在服务提供者一方配置负载均衡
@Service(interfaceClass = HelloService.class,loadbalance = "random")
public class HelloServiceImpl implements HelloService {
   public String sayHello(String name) {
      return "hello " + name;
   }
}

7.补充

1.以上代码的服务者和消费者的service是固定写在包里,那也就意味着如果有所修改就需要在服务端和消费端都进行修改,产生了代码的冗余。我们如果是maven项目可以将service的代码抽取到一个maven工程,需要依赖此接口的工程只需要在自己工程的pom.xml文件中引入maven坐标即可。 

2.Dubbo底层是基于代理技术为HelloService接口创建代理对象,远程调用是通过此代理对象完成的。可以通过开发工具的debug功能查看此代理对象的内部结构。另外,Dubbo实现网络传输底层是基于Netty框架完成的。

3.在远程调用的过程中,如果涉及到了java对象,需要进行序列化,因此java对象需要实现序列化接口。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/415575.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Vue-Spring跨域Bug已解决】has been blocked by CORS policy: The value of the······

文章目录一.问题发现二.问题解决过程2.1 询问AI结果2.2 问题解决三.知识点一.问题发现 报错内容&#xff1a; p://localhost:8001/user/login’ from origin ‘http://localhost:3001’ has been blocked by CORS policy: The value of the ‘Access-Control-Allow-Credentia…

我决定给 ChatGPT 做个缓存层 Hello GPTCache

&#x1f31f; 写在前面黄老板的一句【AI 的 iPhone 时刻已至】震撼了半个科技圈。或许&#xff0c;应该把这句话再扩展一下&#xff1a;AI 的 iPhone 时刻早已势不可挡&#xff0c;它不是平静随和地跟大家 say hi&#xff0c;而是作为一个强悍的巨人携着一把名为 ChatGPT 的斧…

leetcode每日一题:数组专练篇第二期(2/2)

&#x1f61a;一个不甘平凡的普通人&#xff0c;日更算法学习和打卡&#xff0c;期待您的关注和认可&#xff0c;陪您一起学习打卡&#xff01;&#xff01;&#xff01;&#x1f618;&#x1f618;&#x1f618; &#x1f917;专栏&#xff1a;每日算法学习 &#x1f4ac;个人…

【LeetCode: 剑指 Offer II 089. 房屋偷盗(打家窃舍) | 暴力递归=>记忆化搜索=>动态规划】

&#x1f34e;作者简介&#xff1a;硕风和炜&#xff0c;CSDN-Java领域新星创作者&#x1f3c6;&#xff0c;保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享&#x1f48e;&#x1f48e;&#x1f48e; &#x1f34e;座右…

Adept AI,颠覆“产品学“的产品

1.三体降临&#xff0c;产品学不存在了&#xff1f; 兄弟们&#xff0c;你们敢想象以后我们都会有用自己的贾维斯吗&#xff1f;我们不需要在安装一大堆APP&#xff0c;不需要适应各种APP交互&#xff0c;只需一句话你能快速达到你想要的目的吗&#xff1f;你能想象那种科幻大…

Nacos 客户端服务注册源码分析-篇二

Nacos 客户端服务注册源码分析-篇二 继续接上回&#xff0c;上回分析到 NacosNamingService 的整个注册的流程&#xff0c;其实是通过 NacosFactory.createNamingService 方法&#xff0c;反射获取 NacosNamingService 接口的实现类 NacosNamingService &#xff0c;而 NacosN…

基于粒子群算法的含风光燃储微网优化调度

说明书 MATLAB代码&#xff1a;基于粒子群算法的含风光燃储微网优化调度 关键词&#xff1a;微网优化调度 粒子群算法 风光燃储 参考文档&#xff1a;《基于多目标粒子群算法的微电网优化调度_王金全》仅参考部分模型&#xff0c;非完全复现 优势&#xff1a;代码注释详实&…

【通过Cpython3.9源码看看python中的大小整数】

小整数 /* interpreter state */#define _PY_NSMALLPOSINTS 257 #define _PY_NSMALLNEGINTS 5这是CPython中定义的两个常量&#xff0c;它们用于控制解释器状态中的小整数对象池。在CPython中&#xff0c;小整数对象池是一种优化机制&#xff0c;用于减少…

轨迹相似度整理

1 基于点之间的距离 1.1 欧几里得距离 优点&#xff1a;线性计算时间缺点&#xff1a;轨迹长度必须一样 1.2 DTW DTW 笔记&#xff1a; Dynamic Time Warping 动态时间规整 &#xff08;&DTW的python实现&#xff09; 【DDTW&#xff0c;WDTW】_UQI-LIUWJ的博客-CSDN博客 …

Golang流媒体实战之六:lal拉流服务源码阅读

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码)&#xff1a;https://github.com/zq2599/blog_demos 《Golang流媒体实战》系列的链接 体验开源项目lal回源转推和录制lalserver的启动源码阅读Golang流媒体实战之五&#xff1a;lal推流服务源码阅读Golang流媒体…

大数据3 -Hadoop HDFS-分布式文件系统

目录 1.为什么需要分布式存储&#xff1f; 2. HDFS的基础架构 3. HDFS存储原理 4. NameNode是如何管理Block块的 5. HDFS数据的读写流程 1.为什么需要分布式存储&#xff1f; •数据量太大&#xff0c;单机存储能力有上限&#xff0c;需要靠数量来解决问题•数量的提升带…

【区块链】走进web3的世界-合约交互中的异常/边界处理

在以太坊智能合约中&#xff0c;异常处理是一个非常重要的问题&#xff0c;因为任何一个函数调用都有可能导致异常。常见的异常包括函数调用失败、无效参数、内部错误等。 在 Solidity 中&#xff0c;可以使用 require、assert 和 revert 等关键字来处理异常。这些关键字可以用…

第一章 序言:Pytorch在自然语言处理中的应用

01 序言&#xff1a;Pytorch在自然语言处理中的应用 目录01 序言&#xff1a;Pytorch在自然语言处理中的应用1. PyTorch简介2. 自然语言处理3. PyTorch在自然语言处理中的应用3.1 文本分类3.2 情感分析3.3 机器翻译4. 结论1. PyTorch简介 首先&#xff0c;我们需要介绍一下PyT…

WINDOWS消息

WINDOWS消息 Unit01消息队列 01消息队列概念 消息队列是用于存放消息的队列消息在队列中先进先出所有窗口程序都有消息队列程序&#xff08;GetMessage&#xff09;可以从队列中获消息 02消息队列分类 系统消息队列&#xff1a;由系统维护的消息队列&#xff08;这个队列非…

Qt的内存管理机制

QObject的parent设置为null 1.如果构造时直接指定了null&#xff0c;当前实例不会有父对象存在&#xff0c;Qt也不能自动析构该实例&#xff0c;除非实例超出作用域导致析构函数被调用&#xff0c;使用deletelater()函数&#xff0c;不建议使用delete 2.如果指定了parent&#…

关于电商商品数据API接口列表,你想知道的(详情页、Sku信息、商品描述、评论问答列表)

目录 一、商品数据API接口列表 二、商品详情数据API调用代码item_get 三、获取sku详细信息item_sku 四、获得淘宝商品评论item_review 五、数据说明文档 进入 一、商品数据API接口列表 二、商品详情数据API调用代码item_get <?php// 请求示例 url 默认请求参数已经URL…

数据结构-插入排序

一.概要 插入排序是一种基于比较的排序算法&#xff0c;其基本思想是将待排序的元素插入到已排序的序列中&#xff0c;形成新的有序序列。 插入排序算法的过程如下&#xff1a; 将待排序序列分为两部分&#xff1a;已排序部分和未排序部分&#xff1b; 初始时&#xff0c;已…

C++string类的详细使用方法

String类的详细使用 文章目录String类的详细使用初始化扩容空间resize与reserve扩容长度获取插入与删除函数运算符插入append插入assign字符串截取push_back尾插erase删除replase替换swap交换pop_back尾删substr截断字符串功能copy拷贝find查找rfind反向查找find_first_of匹配查…

三路快排(基于三指针单趟排序的快速排序)+快排时间复杂度再分析

目录 一.前言 二. 三路快排 &#x1f60d;算法思想: &#x1f60d;算法实现步骤: &#x1f60d;三指针单趟排序的实现:​ &#x1f60d;非递归快排完全体: &#x1f914;与C标准库里的快排进行对比测试: 三.快排时间复杂度再分析 一.前言 http://t.csdn.cn/mz8dghttp://…

SolidWorks2020安装教程

破解文件及步骤 和 安装包 hf&#xff1a;SolidWorks2020 即可 &#xff08;我的推广 共中号&#xff09; Before installation, block the outgoing Internet access by means of Windows Firewall or cord plug. Check .NET Framework 3.5 and 4.0 are installed. If .NET …