dubbo——dubbo中的常用标签服务化最佳实践(代码片段)

张起灵-小哥 张起灵-小哥     2022-12-26     264

关键词:

文章目录:

1.Dubbo中的常用标签

2.Dubbo中的服务化最佳实践

2.1 分包

2.2 粒度

2.3 版本

 2.4 案例分析

2.4.4 启动测试


1.Dubbo中的常用标签

Dubbo 中常用标签。分为三个类别:公用标签,服务提供者标签,服务消费者标签。

  • 公用标签:配置应用信息 <dubbo:application/> 和  配置注册中心 <dubbo:registry/>
  • 服务提供者标签:配置暴露的服务 <dubbo:service interface=”服务接口名” ref=”服务实现对象 bean”>
  • 服务消费者标签:引用远程服务 <dubbo:reference id=”服务引用 bean 的 id” interface=”服务接口名”/>

2.Dubbo中的服务化最佳实践

2.1 分包

建议将服务接口、服务模型、服务异常等均放在公共包中。

2.2 粒度

服务接口尽可能大粒度,每个服务方法应代表一个功能,而不是某功能的一个步骤,

否则将面临分布式事务问题,Dubbo 暂未提供分布式事务支持。

服务接口建议以业务场景为单位划分,并对相近业务做抽象,防止接口数量爆炸。

不建议使用过于抽象的通用接口,如:Map query(Map),这样的接口没有明确语义,会给后期维护带来不便。

2.3 版本

每个接口都应定义版本号,为后续不兼容升级提供可能,如: <dubbo:service interface="com.xxx.XxxService" version="1.0" />。

建议使用两位版本号,要变更服务版本。先升级一半提供者为新版本,再将消费者全部升为新版本,然后将剩下的一半提供者升为新版本。

 2.4 案例分析

在这个案例分析中,一共需要3个maven工程 。

第一个是maven java工程,它里面存放的是服务模型和服务接口。代码如下:👇👇👇

package com.szh.dubbo.model;

import java.io.Serializable;

/**
 *
 */
public class User implements Serializable 

    private Integer id;
    private String username;

    //getter and setter

package com.szh.dubbo.service;

import com.szh.dubbo.model.User;

/**
 *
 */
public interface UserService 

    User queryUserById(Integer id);

    Integer queryAllUserCount();

第二个是maven web工程,它里面存放的是服务提供者的相关信息。其中包括对服务接口的实现、服务提供者的dubbo配置文件信息、web.xml配置文件信息。代码如下:👇👇👇

package com.szh.dubbo.service.impl;

import com.szh.dubbo.model.User;
import com.szh.dubbo.service.UserService;

/**
 *
 */
public class UserServiceImpl implements UserService 
    @Override
    public User queryUserById(Integer id) 
        User user=new User();
        user.setId(id);
        user.setUsername("张起灵");
        return user;
    

    @Override
    public Integer queryAllUserCount() 
        return 21;
    

<?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:dubbo="http://dubbo.apache.org/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">

    <!-- 声明dubbo服务提供者的名称:保证唯一性 -->
    <dubbo:application name="004-link-userservice-provider"/>

    <!-- 设置dubbo使用的协议和端口号 -->
    <dubbo:protocol name="dubbo" port="20880"/>

    <!-- 暴露服务接口 -->
    <dubbo:service interface="com.szh.dubbo.service.UserService"
                   ref="userService"
                   registry="N/A"/>

    <!-- 将业务接口的实现类加载到Spring容器中 -->
    <bean id="userService" class="com.szh.dubbo.service.impl.UserServiceImpl"/>

</beans>
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <!-- 读取dubbo配置文件信息 -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:dubbo-userservice-provider.xml</param-value>
    </context-param>
    <!-- 配置Spring的监听器 -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

</web-app>

第三个是maven web工程,它里面存放的是服务消费者的相关信息。其中包括对控制层的实现、服务消费者的dubbo配置文件信息、Spring配置文件信息、web.xml配置文件信息以及控制层响应的jsp页面。代码如下:👇👇👇

package com.szh.dubbo.controller;

import com.szh.dubbo.model.User;
import com.szh.dubbo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 *
 */
@Controller
public class UserController 

    @Autowired
    private UserService userService;

    @RequestMapping(value = "/userDetail")
    public String userDetail(Integer id, Model model) 
        User user=userService.queryUserById(id);

        Integer allUserCount=userService.queryAllUserCount();

        model.addAttribute("user",user);
        model.addAttribute("allUserCount",allUserCount);

        return "userDetail";
    

<?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:dubbo="http://dubbo.apache.org/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">

    <!-- 声明服务消费者名称:保证唯一性 -->
    <dubbo:application name="005-link-consumer"/>

    <!-- 引用远程接口服务 -->
    <dubbo:reference interface="com.szh.dubbo.service.UserService"
                     id="userService"
                     url="dubbo://localhost:20880"
                     registry="N/A"/>

</beans>
<?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: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/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!-- 组件扫描器,扫描controller包下的注解 -->
    <context:component-scan base-package="com.szh.dubbo.controller"/>

    <!-- 开启SpringMVC注解驱动 -->
    <mvc:annotation-driven/>

    <!-- 配置视图解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

</beans>
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <!-- 配置SpringMVC的中央调度器,读取Spring、Dubbo配置文件信息 -->
    <servlet>
        <servlet-name>DispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:applicationContext.xml,classpath:dubbo-consumer.xml</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>DispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app>
<%@ page contentType="text/html;charset=utf-8" language="java" %>
<html>
<head>
    <title>$</title>
</head>
<body>
    <h3>用户详情</h3>
    <div>用户编号:$user.id</div>
    <div>用户姓名:$user.username</div>
    <div>用户总人数:$allUserCount</div>
</body>
</html>

2.4.4 启动测试

为后两个maven web工程配置各自的Tomcat服务器,之后启动测试。

配置步骤可以参考这篇博客的结尾部分:https://blog.csdn.net/weixin_43823808/article/details/117335107

下面是测试结果,可以看到jsp页面中成功获取到了后端传来的数据。这就是Dubbo的服务化最佳实践。

 

springboot整合dubbo-服务化最佳实践

分包:公共的模型、接口、异常都放在此处(springboot-interface-api)将springboot-meeting-service、springboot-user-service系统pojo和service提取到springboot-interface-api1.分包——新建普通maven项目      springboot 查看详情

dubbo源码实践-protocol层例子

...服务提供者和服务消费者的概念了。参考上一篇dubbo源码实践-protocol层-invoker理解,本文理解起来应该不难。2例子2.1项目截图ProtocolClientTest服务消费者(即客户端)、ProtocolServerTest服务提供者(即提供者)。业务服务IAlfService是接... 查看详情

在dubbo3.0上服务治理的实践

...11年开源以来,经过多年一众大规模互联网、IT公司的实践积累了大量经验,Dubbo凭着对Java用户友好、功能丰富、治理能力 查看详情

dubbo源码实践-config层例子

1概述本文主要参考官方例子:https://cn.dubbo.apache.org/zh/docsv2.7/user/configuration/api/今天例子我们总要使用Config层的API来搭建dubbo调用的例子。通过图可以看到,主要是两个类:ReferenceConfig类(客户端使用该类)、Se... 查看详情

dubborpc框架-服务发现&常用特性

零、本文纲要一、服务发现二、Dubbo快速入门(Spring+SpringMVC)①dubbo-interface模块②dubbo-service模块③dubbo-web模块三、其他特性①序列化implementsSerializable②超时timeout③重试retries④版本控制version⑤负载均衡loadbalance⑥集群容错cluster⑦... 查看详情

dubbo源码实践-protocol层例子(代码片段)

...服务提供者和服务消费者的概念了。参考上一篇dubbo源码实践-protocol层-invoker理解,本文理解起来应该不难。2例子2.1项目 查看详情

dubbo3高级特性「框架与服务」服务并发控制及集群负载均衡的实践指南(含扩展spi)(代码片段)

Dubbo3中的并发控制XML方式配置限制类的线程隔离控制(服务端)限制com.xxx.ApiService的每个方法,服务器端并发执行(或占用线程池线程数)不能超过10个:<dubbo:serviceinterface="com.xxx.ApiService"executes... 查看详情

dubbo-发布服务执行的流程

...ng容器触发了ContextRefreshedEvent事件时,就会调用ServiceConfig中的export()方法发布申明的dubbo服务,ServiceConfig中的export()方法部分源码如下,如果申明了delay(延迟多少),那么延迟调用doExport()发布这个服务,如果没有设置则直接调... 查看详情

dubbo概述及基本使用(代码片段)

...面的升级,以下是新增的一些核心特性相比于2.x版本中的基于接口粒度的服务发现机制,3.x引入了全新的基于应用粒度的服务发现机制,新模型带来两方面的巨大优势:进一步提升了Dubbo3在大规模集群实践中的性... 查看详情

dubbo3高级特性「框架与服务」框架与服务的异步调用实践以及开发模式

异步调用在Dubbo中发起异步调用机制,从而提高对应的服务的调用的吞吐能力和调用机制特性说明技术背景从2.7.0开始,Dubbo的所有异步编程接口开始以CompletableFuture为基础,基于NIO的非阻塞实现并行调用,客户端不需要启动多线... 查看详情

dubbo和hsf在阿里巴巴的实践:携手走向下一代云原生微服务

简介:HSF和Dubbo的融合是大势所趋。为了能更好的服务内外用户,也为了两个框架更好发展,Dubbo3.0和以Dubbo3.0为内核适配集团内基础架构生态的HSF3应运而生。作者|郭浩Dubbo和HSF都是阿里巴巴目前在使用的微服务RPC框... 查看详情

dubbo和hsf在阿里巴巴的实践:携手走向下一代云原生微服务

简介:HSF和Dubbo的融合是大势所趋。为了能更好的服务内外用户,也为了两个框架更好发展,Dubbo3.0和以Dubbo3.0为内核适配集团内基础架构生态的HSF3应运而生。作者|郭浩Dubbo和HSF都是阿里巴巴目前在使用的微服务RPC框... 查看详情

dubbo和hsf在阿里巴巴的实践:携手走向下一代云原生微服务

简介: HSF和Dubbo的融合是大势所趋。为了能更好的服务内外用户,也为了两个框架更好发展,Dubbo3.0和以Dubbo3.0为内核适配集团内基础架构生态的HSF3应运而生。作者|郭浩Dubbo和HSF都是阿里巴巴目前在使用的微服务RPC框... 查看详情

dubbo专题(基础篇):dubbo介绍环境搭建与实践(代码片段)

...,Dubbo基本工作原理,Dubbo环境搭建,DubboDemo实践,一起来学习下吧。Dubbo概念Dubbo是一款高性能、轻量级的开源JavaRPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,... 查看详情

dubbo专题(基础篇):dubbo介绍环境搭建与实践(代码片段)

...,Dubbo基本工作原理,Dubbo环境搭建,DubboDemo实践,一起来学习下吧。Dubbo概念Dubbo是一款高性能、轻量级的开源JavaRPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,... 查看详情

dubbo专题(基础篇):dubbo介绍环境搭建与实践(代码片段)

...,Dubbo基本工作原理,Dubbo环境搭建,DubboDemo实践,一起来学习下吧。Dubbo概念Dubbo是一款高性能、轻量级的开源JavaRPC框架& 查看详情

dubbo源码实践-总结

...间,断断续续的看了一遍dubbo源码,之前的文章从实践出发搭建了dubbo各层的例子!Dubbo源码的学习也暂时告一段落。这篇就谈谈自己对dubbo源码学习个人感受!1dubbo是什么?dubbo是一个RPC框架,用来实现程... 查看详情

dubbo源码实践-总结

...间,断断续续的看了一遍dubbo源码,之前的文章从实践出发搭建了dubbo各层的例子!Dubbo源码的学习也暂时告一段落。这篇就谈谈自己对dubbo源码学习个人感受!1dubbo是什么?dubbo是一个RPC框架,用来实现程... 查看详情