• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

项目SpringBoot工程整合Dubbo框架,实现RPC远程调用

武飞扬头像
本本本添哥
帮助1

一、业务需求描述

1.1 开发白名单功能

管理员在后台Web管理端更新白名单,车机通过调用后端接口获取最新白名单

1.2 架构描述

项目中有一个微服务AEP,一个Common包子POM服务。另一个CommonProvider,其中AEP提供接口供车机接入,Common包是AEP和CommonProvider的公共依赖,如图所示
学新通
CommonProvider提供接口给Web接入
学新通

1.3 为什么需要Dubbo来远程调用 ?

因为AEP中没有ORM层,因此,需要调用到CommonProvider中的服务实现方法,实现获取白名单功能。

二、业务功能实现

使用dubbo组件,微服务之间的调用是通过RPC实现的,只需要把provider端的服务接口提供出来,consumer端即可以通过RPC的方式直接调用服务,从而实现不同微服务之间服务的调用。
具体使用示例如下:(使用的示例是在使用SpringBoot搭建工程的基础上实现的)
定义provider和consumer模块都需要使用的服务接口

(1)在Common中,引入Dubbo 的POM文件

<dependency>
        <groupId>org.apache.dubbo</groupId>
        <artifactId>dubbo-spring-boot-starter</artifactId>
        <version>2.7.7</version>
    </dependency>

(2)在CommonProvider 和AEP 中,分别引入Dubbo相关的配置

2.1 AEP的Dubbo 配置

# Dubbo Config properties
dubbo.application.name=ids-aep-consumer
dubbo.scan.base-packages=包的根路径
# RegistryConfig Bean
dubbo.registry.id=ids-aep-consumer
dubbo.registry.protocol=${DUBBO_RG_PROTOCOL:zookeeper}
dubbo.registry.address=${DUBBO_REGISTRY_ADDRESS:zookeeper://IP地址:端口号?backup=IP地址:端口号,IP地址:端口号}
dubbo.registry.group=ids
dubbo.consumer.retries=-1
dubbo.consumer.check=false
dubbo.consumer.timeout=180000
dubbo.application.qosEnable=false
# 暴露服务方式
dubbo.protocol.name=dubbo
# 暴露服务端口
dubbo.protocol.port=${DUBBO_PORT:20880}

2.2 CommonProvider 的Dubbo 配置

# Dubbo Config properties
dubbo.application.name=ids-common-provider
dubbo.scan.base-packages=包的根路径
# RegistryConfig Bean
dubbo.registry.id=ids-common-provider
dubbo.registry.protocol=${DUBBO_RG_PROTOCOL:zookeeper}
dubbo.registry.address=${DUBBO_REGISTRY_ADDRESS:zookeeper://IP地址:端口号?backup=IP地址:端口号,IP地址:端口号}
dubbo.registry.group=ids
dubbo.consumer.retries=-1
dubbo.consumer.check=false
dubbo.consumer.timeout=180000
dubbo.application.qosEnable=false
# 暴露服务方式
dubbo.protocol.name=dubbo
# 暴露服务端口
dubbo.protocol.port=${DUBBO_PORT:20880}

(3)定义DubboVersionConf,dubbo服务注册版本设置

/**
 * dubbo服务注册版本设置
 **/
public class DubboVersionConf {
    public static final String DUBBO_REGISTRY_SERVICE_VERSION = "1.0.0";
}

(4)在AEP的入口Controller中,引入@DubboReference 的注解
因为AEP是Dubbo微服务中的消费者,因此要用DubboReference
在consumer端通过RPC的方式调用服务

public class IdsController {
    @DubboReference(version = DubboVersionConf.DUBBO_REGISTRY_SERVICE_VERSION)
    private WhiteListService whiteListService;
     //省略其他代码
}
注意:private 后面不能跟final 。不能使用Lombok的@AllArgsConstructor注解

以下是错误使用

@AllArgsConstructor
public class IdsController {
    @DubboReference(version = DubboVersionConf.DUBBO_REGISTRY_SERVICE_VERSION)
    private final WhiteListService whiteListService;
    //省略其他代码
}

(6)同理,在CommonProvider 的入口Controller中,引入@DubboReference 的注解
因为CommonProvider 也是Dubbo微服务中的消费者,因此要用DubboReference

在provider端实现服务接口的逻辑

public class WhiteListController {
    @DubboReference(version = DubboVersionConf.DUBBO_REGISTRY_SERVICE_VERSION)
    private WhiteListService whiteListService;
}

(7)最后是实现类 WhiteListServiceImpl

@DubboService(version = "1.0.0")
public class WhiteListServiceImpl extends ServiceImpl<WhiteListDao, WhiteList> implements WhiteListService {
    //省略业务逻辑
}

注意,这里用的是@DubboService

三、可能出现的报错

3.1 No registry config found

Caused by: java.lang.IllegalStateException: No registry config found or it's not a valid config! The registry config is: <dubbo:registry />

出现这个错误的原因是
没有引入Dubbo相关的配置,参考以下加入到Properties中即可

# Dubbo Config properties
dubbo.application.name=svw-cdi-ids-aep
dubbo.scan.base-packages=com.desaysv.tsp.logic.gate
# RegistryConfig Bean
dubbo.registry.id=svw-cdi-ids-aep
dubbo.registry.protocol=${DUBBO_RG_PROTOCOL:zookeeper}
dubbo.registry.address=${DUBBO_REGISTRY_ADDRESS:zookeeper://IP:端口?backup=IP:端口,IP:端口}
dubbo.registry.group=svw-cdi-ids
dubbo.consumer.retries=-1
dubbo.consumer.check=false
dubbo.consumer.timeout=180000
dubbo.application.qosEnable=false
# 暴露服务方式
dubbo.protocol.name=dubbo
# 暴露服务端口
dubbo.protocol.port=${DUBBO_PORT:20880}

3.2 Parameter 1 of constructor required a bean of type

Parameter 1 of constructor in IdsController required a bean of type WhiteListService’ that could not be found.

参考前面的注意事项:private 后面不能跟final 。不能使用Lombok的@AllArgsConstructor注解,优化后,如下代码

public class IdsController {
    @DubboReference(version = DubboVersionConf.DUBBO_REGISTRY_SERVICE_VERSION)
    private WhiteListService whiteListService;
     //省略其他代码
}

3.3 No provider available from registry for service WhiteListService:1.0.0 ,please check status of providers(disabled, not registered or in blacklist).

原因是因为,注册dubbo服务到Zookeeper中失败,服务的消费者以及生产者,参考上述yml格式的Dubbo配置重新配置好Dubbo服务的消费者以及生产者

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhfjicaj
系列文章
更多 icon
同类精品
更多 icon
继续加载