干翻Dubbo系列第六篇:SpringBoot与Dubbo整合

文章说明

本文内容整理自《孙哥说Dubbo系列视频课程》,孙帅老师课程细致、全面、深入、性价比极高。B站搜孙帅suns可以找到对应的试听视频,或者直接添加老师微信号suns45与他直接联系

一:SpringBoot应用Dubbo开发应用的核心思路分析

深度封装,把公共的配置放置到application.yml中,把个性化得配置基于注解进行设置

1:Spring集成Dubbo的时候都有那些配置内容?

Spring使用Dubbo的时候,我们大致有四类非常核心的配置内容:应用名、应用通信协议和端口号、Service发布为Rpc服务、Service实例化的Bean对象或者是代理对象

公共配置:应用名、应用通信协议和端口号

个性化配置:Service发布为Rpc服务、Service实例化的Bean对象或者是代理对象

配置示例:

<dubbo:application name="dubbo-02-provider"/>
<dubbo:protocol name="dubbo" port="20880"/>
<bean id="userService" class="com.suns.service.UserServiceImpl"/>
<dubbo:service interface="com.suns.service.UserService" ref="userService"/>
<dubbo:application name="dubbo-03-consuemer"><dubbo:parameter key="qos.enable" value="false"/>
</dubbo:application><!--id指定的指定是消费者里边获取远端的服务的一个ID-->
<dubbo:reference interface="com.suns.service.UserService" id="userService"
url="dubbo://192.168.8.1:20880/com.suns.service.UserService"/>

2:这些配置在SpringBoot整合Dubbo之后如何体现呢?

首先想跟大家明确一个概念:Spring在整合一些技术的时候,会有大量的配置存在于XML配置当中。这些配置在使用SpringBoot整合之后,仿佛一下子简化了很多。配置不会凭空减少的,一部分原因是框架已经帮我们进行封装配置了,另一部分是基于注解等其他形式进行简化了,才让我们有了SpringBoot简化了技术资源整合的感觉

(一):provider的处理

1):公共配置抽取为YML
spring:application:name: aaadubbo:application:name: aaaprotocol:name: dubboport: -1

补充说明:

Dubbo与SpringBoot整合的时候给Dubbo服务起名字的话,是有两种方式的:1:基于yml配置当红当中的那种配置,这是最标准的配置方式。另外,还有一种更加SpringBoot的方式,就是上图中Spring开头的那个,这两个起到的作用是玩全一致的。优先去找dubbo开头的那个配置,如果那个没有找到,默认会去找spring开头的那个配置项。二者写哪个都行,写一个就完事了,在我们后续使用SpringCloud的里边,也需要设置应用名,spring开头是非常方便的,Dubbo服务和Spring服务名称保持了一致。

dubbo:application:name == spring:application:name作用一致,但是后者功能强大!

2):个性化配置基于注解解决
@DubboService
public class UserServiceImpl implements UserService {@Overridepublic boolean login(String name, String password) {System.out.println("UserServiceImpl.login name " + name + " password " + password);return false;}
}

个性化配置基于@DubboService注解即可,这样的一个注解就起到了两个作用:注册Spring容器实例的标签+将Service发布为一个Dubbo服务。

(二):consumer的处理

1):公共配置抽取为YML
spring:application:name: consumerdubbo:protocol:qos-enable: false
2):个性化配置基于注解解决
@DubboReference(url="dubbo://192.168.8.1:20880/com.suns.service.UserService")
public UserService  userService;

这种方式可以注入给

二:SpringBoot应用与Dubbo开发整合编码开发

1:构建多模块的SpringBoot应用

(一):引入依赖jar包

        <dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>3.2.0</version></dependency><dependency><groupId>com.suns</groupId><artifactId>dubbo-01-api</artifactId><version>1.0-SNAPSHOT</version></dependency>

dubbo的SpringBoot启动器,提供者和消费者都需要使用的启动器。

(二):构建provider模块

公共配置:

共有配置:application.yml
spring:application:name: DUBBO-04-BOOT-PROVIDER
dubbo:protocol:name: dubboport: -1

 个性化配置:@DubboService

@DubboService
public class UserServiceImpl implements UserService {@Overridepublic boolean login(String name, String password) {System.out.println("UserServiceImpl.login name " + name + " password " + password);return false;}
}

 启动类:@EnableDubbo

@SpringBootApplication
@EnableDubbo
public class Dubbo04BootProviderApplication {public static void main(String[] args) {SpringApplication.run(Dubbo04BootProviderApplication.class, args);}}
2023-08-02 21:32:18.707  INFO 12844 --- [           main] o.a.d.remoting.transport.AbstractServer  :  [DUBBO] Start NettyServer bind /0.0.0.0:20880, export /192.168.8.1:20880, dubbo version: 3.2.0, current host: 192.168.8.1
2023-08-02 21:32:18.710  INFO 12844 --- [           main] .c.m.ConfigurableMetadataServiceExporter :  [DUBBO] The MetadataService exports urls : [dubbo://192.168.8.1:20880/org.apache.dubbo.metadata.MetadataService?anyhost=true&application=DUBBO-04-BOOT-PROVIDER&background=false&bind.ip=192.168.8.1&bind.port=20880&delay=0&deprecated=false&dubbo=2.0.2&dynamic=true&executor-management-mode=isolation&file-cache=true&generic=false&getAndListenInstanceMetadata.1.callback=true&getAndListenInstanceMetadata.return=true&getAndListenInstanceMetadata.sent=true&group=DUBBO-04-BOOT-PROVIDER&interface=org.apache.dubbo.metadata.MetadataService&methods=exportInstanceMetadata,getAndListenInstanceMetadata,getExportedServiceURLs,getExportedURLs,getExportedURLs,getExportedURLs,getExportedURLs,getExportedURLs,getInstanceMetadataChangedListenerMap,getMetadataInfo,getMetadataInfos,getMetadataURL,getServiceDefinition,getServiceDefinition,getSubscribedURLs,isMetadataService,serviceName,toSortedStrings,toSortedStrings,version&pid=12844&prefer.serialization=fastjson2,hessian2&qos.enable=true&register=false&release=3.2.0&revision=3.2.0&side=provider&timestamp=1690983137775&version=1.0.0], dubbo version: 3.2.0, current host: 192.168.8.1
2023-08-02 21:32:18.712  INFO 12844 --- [           main] o.a.d.r.c.m.ServiceInstanceMetadataUtils :  [DUBBO] Start registering instance address to registry., dubbo version: 3.2.0, current host: 192.168.8.1
2023-08-02 21:32:18.719  INFO 12844 --- [           main] o.a.d.c.d.DefaultApplicationDeployer     :  [DUBBO] Dubbo Application[1.1](DUBBO-04-BOOT-PROVIDER) is ready., dubbo version: 3.2.0, current host: 192.168.8.1
2023-08-02 21:32:18.725  INFO 12844 --- [           main] com.suns.Dubbo04BootProviderApplication  : Started Dubbo04BootProviderApplication in 3.018 seconds (JVM running for 3.866)
2023-08-02 21:32:18.733  INFO 12844 --- [pool-1-thread-1] .b.c.e.AwaitingNonWebApplicationListener :  [Dubbo] Current Spring Boot Application is await...

(三):构建consumer模块

公共配置:application.yml

共有配置application.yml
spring:application:name: DUBBO-05-BOOT-CONSUMERdubbo:application:qos-enable: false

个性化配置:@DubboService

    @DubboReference(url = "dubbo://192.168.8.1:20880/com.suns.service.UserService")private UserService userService;

通过Junit的方式去测试:

        <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>
@SpringBootTest
class Dubbo05BootConsumerApplicationTests {//通过此注解进行注入@DubboReference(url = "dubbo://192.168.50.62:20880/com.suns.service.UserService")private UserService userService;@Testvoid contextLoads() {}@Testpublic void test1() {boolean ret = userService.login("xiaohei", "123456");System.out.println("ret = " + ret);}
}

test1方法执行结果:

2023-08-02 22:06:43.411  INFO 6584 --- [lientWorker-4-1] o.a.d.r.t.netty4.NettyClientHandler      :  [DUBBO] The connection of /192.168.8.1:29212 -> /192.168.8.1:20880 is established., dubbo version: 3.2.0, current host: 192.168.8.1
2023-08-02 22:06:43.419  INFO 6584 --- [           main] o.a.d.remoting.transport.AbstractClient  :  [DUBBO] Successfully connect to server /192.168.8.1:20880 from NettyClient 192.168.8.1 using dubbo version 3.2.0, channel is NettyChannel [channel=[id: 0xa68c5420, L:/192.168.8.1:29212 - R:/192.168.8.1:20880]], dubbo version: 3.2.0, current host: 192.168.8.1
2023-08-02 22:06:43.419  INFO 6584 --- [           main] o.a.d.remoting.transport.AbstractClient  :  [DUBBO] Start NettyClient /192.168.8.1 connect to the server /192.168.8.1:20880, dubbo version: 3.2.0, current host: 192.168.8.1
2023-08-02 22:06:43.467  INFO 6584 --- [           main] org.apache.dubbo.config.ReferenceConfig  :  [DUBBO] Referred dubbo service: [com.suns.service.UserService]. it's not GenericService reference, dubbo version: 3.2.0, current host: 192.168.8.1
2023-08-02 22:06:43.468  WARN 6584 --- [           main] o.a.d.r.client.metadata.MetadataUtils    :  [DUBBO] Remote Metadata Report Server is not provided or unavailable, will stop registering service definition to remote center!, dubbo version: 3.2.0, current host: 192.168.8.1, error code: 1-39. This may be caused by , go to https://dubbo.apache.org/faq/1/39 to find instructions. 
ret = false

 记录一次失败的原因:

消费者日志:

org.apache.dubbo.rpc.RpcException: Failed to invoke the method login in the service com.suns.service.UserService. Tried 3 times of the providers [192.168.8.1:20880] (1/1) from the registry 192.168.8.1:20880 on the consumer 192.168.8.1 using the dubbo version 3.2.0. Last error is: Failed to invoke remote method: login, provider: dubbo://192.168.8.1:20880/com.suns.service.UserService?application=DUBBO-05-BOOT-CONSUMER&background=false&executor-management-mode=isolation&file-cache=true&interface=com.suns.service.UserService&pid=13808&qos.enable=false&register.ip=192.168.8.1&side=consumer&sticky=false&unloadClusterRelated=false, cause: org.apache.dubbo.remoting.RemotingException: Fail to decode request due to: RpcInvocation [methodName=login, parameterTypes=null]at org.apache.dubbo.rpc.cluster.support.FailoverClusterInvoker.doInvoke(FailoverClusterInvoker.java:115)at org.apache.dubbo.rpc.cluster.support.AbstractClusterInvoker.invoke(AbstractClusterInvoker.java:341)at org.apache.dubbo.rpc.cluster.router.RouterSnapshotFilter.invoke(RouterSnapshotFilter.java:46)at org.apache.dubbo.rpc.cluster.filter.FilterChainBuilder$CopyOfFilterChainNode.invoke(FilterChainBuilder.java:331)at org.apache.dubbo.monitor.support.MonitorFilter.invoke(MonitorFilter.java:101)at org.apache.dubbo.rpc.cluster.filter.FilterChainBuilder$CopyOfFilterChainNode.invoke(FilterChainBuilder.java:331)at org.apache.dubbo.rpc.cluster.filter.support.MetricsClusterFilter.invoke(MetricsClusterFilter.java:51)at org.apache.dubbo.rpc.cluster.filter.FilterChainBuilder$CopyOfFilterChainNode.invoke(FilterChainBuilder.java:331)at org.apache.dubbo.rpc.protocol.dubbo.filter.FutureFilter.invoke(FutureFilter.java:52)at org.apache.dubbo.rpc.cluster.filter.FilterChainBuilder$CopyOfFilterChainNode.invoke(FilterChainBuilder.java:331)at org.apache.dubbo.spring.security.filter.ContextHolderParametersSelectedTransferFilter.invoke(ContextHolderParametersSelectedTransferFilter.java:41)at org.apache.dubbo.rpc.cluster.filter.FilterChainBuilder$CopyOfFilterChainNode.invoke(FilterChainBuilder.java:331)at org.apache.dubbo.rpc.cluster.filter.support.ConsumerClassLoaderFilter.invoke(ConsumerClassLoaderFilter.java:40)at org.apache.dubbo.rpc.cluster.filter.FilterChainBuilder$CopyOfFilterChainNode.invoke(FilterChainBuilder.java:331)at org.apache.dubbo.rpc.cluster.filter.support.ConsumerContextFilter.invoke(ConsumerContextFilter.java:118)at org.apache.dubbo.rpc.cluster.filter.FilterChainBuilder$CopyOfFilterChainNode.invoke(FilterChainBuilder.java:331)at org.apache.dubbo.rpc.cluster.filter.FilterChainBuilder$CallbackRegistrationInvoker.invoke(FilterChainBuilder.java:194)at org.apache.dubbo.rpc.cluster.support.wrapper.AbstractCluster$ClusterFilterInvoker.invoke(AbstractCluster.java:91)at org.apache.dubbo.rpc.cluster.support.wrapper.MockClusterInvoker.invoke(MockClusterInvoker.java:103)at org.apache.dubbo.rpc.cluster.support.wrapper.ScopeClusterInvoker.invoke(ScopeClusterInvoker.java:124)

提供者日志:

java.io.IOException: Service com.suns.service.UserService:0.0.0 not found, invocation rejected.at org.apache.dubbo.rpc.protocol.PermittedSerializationKeeper.checkSerializationPermitted(PermittedSerializationKeeper.java:55) ~[dubbo-3.2.0.jar:3.2.0]at org.apache.dubbo.rpc.protocol.dubbo.DecodeableRpcInvocation.decode(DecodeableRpcInvocation.java:148) ~[dubbo-3.2.0.jar:3.2.0]at org.apache.dubbo.rpc.protocol.dubbo.DecodeableRpcInvocation.decode(DecodeableRpcInvocation.java:102) ~[dubbo-3.2.0.jar:3.2.0]at org.apache.dubbo.rpc.protocol.dubbo.DubboCodec.decodeBody(DubboCodec.java:173) [dubbo-3.2.0.jar:3.2.0]

最终原因:

@SpringBootApplication
@EnableDubbo
//@DubboComponentScan(basePackages = {"org.suns.service"})
public class Dubbo04BootProviderApplication {public static void main(String[] args) {SpringApplication.run(Dubbo04BootProviderApplication.class, args);}}

服务没有被注册,也没有被暴露,调用的时候才会抛此异常!

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

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

相关文章

消息中间件应用场景介绍

提高系统性能首先考虑的是数据库的优化&#xff0c;但是数据库因为历史原因&#xff0c;横向扩展是一件非常复杂的工程&#xff0c;所有我们一般会尽量把流量都挡在数据库之前。 不管是无限的横向扩展服务器&#xff0c;还是纵向阻隔到达数据库的流量&#xff0c;都是这个思路。…

更安全,更省心丨DolphinDB 数据库权限管理系统使用指南

在数据库产品使用过程中&#xff0c;为保证数据不被窃取、不遭破坏&#xff0c;我们需要通过用户权限来限制用户对数据库、数据表、视图等功能的操作范围&#xff0c;以保证数据库安全性。为此&#xff0c;DolphinDB 提供了具备以下主要功能的权限管理系统&#xff1a; 提供用户…

anndata k折交叉

如何将anndata拆分为k份 import scanpy as sc import anndata as adclass KSplitAnndata:staticmethoddef _base_split(data: object, k: int) -> list:adata data.copy()num adata.n_obs // kadata_list []for i in range(k):if num < adata.n_obs:adata_list.appen…

STM32 DMA学习

DMA简称 DMA&#xff0c;Direct Memory Access&#xff0c;即直接存储器访问。DMA传输方式无需CPU直接控制传输&#xff0c;也没有中断处理方式那样保留现场和恢复现场的过程&#xff0c;通过硬件为RAM与I/O设备开辟一条直接传送数据的通路&#xff0c;能使CPU的效率大为提高。…

LabVIEW开发航天器动力学与控制仿真系统

LabVIEW开发航天器动力学与控制仿真系统 计算机仿真是工程设计和验证的非常有用的工具。它节省了大量的时间、金钱和精力。航天器动力学与控制仿真系统由LabVIEW程序开发&#xff0c;它是模拟航天器等动态系统的有用工具。还可轻松与硬件连接并输出真实信号。 项目采用系统工…

偷懒神器-->花样的代码生成工具

1、CRUD代码生成&#xff1a; 根据MyBatisPlus逆向工程改造而来&#xff0c;添加了showDoc文档生成&#xff0c;数据库脚本生成&#xff0c;增删改查文件生成&#xff0c;Po、Vo、Request对象生成等。普通的增删改查一般搞定。并预调了部份判断逻辑。 效果示例&#xff1a; p…

“用户登录”测试用例总结

前言&#xff1a;作为测试工程师&#xff0c;你的目标是要保证系统在各种应用场景下的功能是符合设计要求的&#xff0c;所以你需要考虑的测试用例就需要更多、更全面。鉴于面试中经常会问“”如何测试用户登录“”&#xff0c;我们利用等价类划分、边界值分析等设计一些测试用…

git的clone,上传,mirror与upstream同步

文章目录 clone日志信息的同步子树合并同步 clone clone他人项目&#xff0c;git到自己的项目 rm -rf .git .git存放原始项目的日志信息&#xff0c;这里需要添加自己的日志信息&#xff0c;需要删除重写。也可手动删除 git init 初始化文件&#xff0c;依据本地日志信息生产.…

Gradle和Maven的区别

Gradle和Maven 当涉及到构建和管理项目时&#xff0c;Gradle和Maven是两个非常流行的选项。本文将讨论Gradle和Maven之间的区别以及它们的配置信息差异。 1. Gradle和Maven的区别 1.1 构建脚本语言 Maven使用XML作为构建脚本语言&#xff0c;而Gradle使用基于Groovy的DSL&…

c 语言解析 时间字符串

#include <iostream> #include <ctime>int main(int argc, char *argv[]) {struct tm timeinfo;char cur_time[] "current time: 2021-09-06 23:50:13";// 解析时间到timeinfo中strptime(cur_time, "current time: %Y-%m-%d %H:%M:%S", &…

查看内存类型和频率 - Win系统

查看内存类型和频率 - Win系统 问题方法1&#xff08;推荐&#xff09;&#xff1a;使用命令行方法2&#xff1a;使用CPU-Z方法3&#xff1a;使用AIDA64 问题 我们在为电脑扩充内存时需要提前了解电脑内存的类型和频率&#xff0c;防止内存不兼容&#xff0c;但在设备管理器和…

java+springboot+mysql疫情物资管理系统

项目介绍&#xff1a; 使用javaspringbootmysql开发的疫情物资管理系统&#xff0c;系统包含超级管理员&#xff0c;系统管理员、员工角色&#xff0c;功能如下&#xff1a; 超级管理员&#xff1a;管理员管理&#xff1b;部门管理&#xff1b;职位管理&#xff1b;员工管理&…

基于STM32设计的数显热水器

一、项目介绍 当前介绍的项目是基于 STM32F103ZET6 系列 MCU 设计的数显热水器&#xff0c;通过显示屏来显示热水器的温度及其工作状态&#xff0c;通过 PT100 传感器来检测热水器的温度变化&#xff0c;并通过电加热片实现加热过程&#xff0c;以达到控制热水器温度的目的。 …

结构思考力-有效提升你的工作效率20倍以上

结构思考力是一种帮助人们察觉并改善自身思考结构的思考艺术&#xff0c;它将人们的思维表达以一种逻辑结构的形式来表示&#xff0c;从而简化人与人之间的沟通成本&#xff0c;提高工作效率。每个人思考问题的方式不同&#xff0c;不同的思考结构使人们的注意力的方向也不同&a…

机房环境、动力、网络、安防,帮您提高运维效率,确保机房安全

机房作为单位的核心部门&#xff0c;由计算机、服务器、网络设备、存储设备等关键设备组成&#xff0c;智能化计算机机房这个概念在各个领域中&#xff0c;已经占据了很重要的地位&#xff0c;伴随着国家大力倡导的&#xff0c;东数西算&#xff0c;数字经济、云计算、5G大数据…

IPC进程间通信探索——管道的原理与特点

&#x1f923; 爆笑教程 &#x1f449; 《看表情包学Linux》 &#x1f525; CSDN 累计订阅量破千的火爆 C/C 教程的 2023 重制版&#xff0c;C 语言入门到实践的精品级趣味教程。了解更多&#xff1a; &#x1f449; "不太正经" 的专栏介绍 ← 试读第一章订阅链接&am…

JVM基础篇-线程运行诊断

JVM基础篇-线程运行诊断 CPU占用过多定位 用top定位哪个进程对cpu的占用过高ps H -eo pid,tid,%cpu | grep 进程id &#xff08;用ps命令进一步定位是哪个线程引起的cpu占用过高&#xff09;jstack 进程id 可以根据线程id 找到有问题的线程&#xff0c;进一步定位到问题代码的…

SpringBoot整合SSMP小demo

创建项目 spring web&#xff0c;mybatis&#xff0c;mysql勾选 加入mp和druid&#xff0c;依赖见SpringBoot基础认识_阳光明媚UPUP的博客-CSDN博客 yml数据源 server:port: 81 spring:datasource:druid: #整合方式配置driver-class-name: com.mysql.jdbc.Driverurl: jdbc:m…

深度学习之tensorboard可视化工具

(1)什么是tensorboard tensorboard是TensorFlow 的一个可视化工具包&#xff0c;提供机器学习实验所需的可视化和工具&#xff0c;该工具的功能如下&#xff1a; 跟踪和可视化指标&#xff0c;例如损失和精度可视化模型图&#xff08;操作和层&#xff09;查看权重、偏差或其…

【动态规划】子序列系列

文章目录 动态规划&#xff08;子序列系列&#xff09;1. 最长递增子序列2. 摆动序列3. 最长递增子序列的个数4. 最长数对链5. 最长定差子序列6. 最长的斐波那契子序列的长度7. 最长等差数列8. 等差数列划分 || - 子序列 动态规划&#xff08;子序列系列&#xff09; 1. 最长递…