使用dubbo注册服务提供者失败参考方式

前提条件:需要打开zookeeper的服务端

报错内容截图如下

dubbo 新增提供者 dubbo提供者注册不上_dubbo 新增提供者

翻译意思为:
HTTP 状态 500 - 请求处理失败;
嵌套异常是 com.alibaba.dubbo.rpc.RpcException: No provider available from registry 127.0.0.1:2181 for service com.zcl.service.UserService on consumer 192.168.26.1 use dubbo version 2.6.0, 可能是 provider disabled 或者没有
挂号的 ?
由此可以发现,消费者是可以直接请求dubbo的而报错的原因就是服务提供者提供这个服务给消费者导致的500错误

查看spring的配置注册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:dubbo="http://code.alibabatech.com/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

    <!-- 指定应用名称 -->
    <dubbo:application name="DFJD_Service_Provider"/>
    <!--指定暴露服务的端口,如果不指定默认为20880-->
    <dubbo:protocol name="dubbo" port="20887"/>
    <!--指定服务注册中心地址-->
    <dubbo:registry address="zookeeper://127.0.0.1:2181"/>
    <!--批量扫描,发布服务(是扫描当前模块的业务实现类包)-->
    <dubbo:annotation package="com.zcl.serviceImpl"/>
</beans>

匹配扫描的包应该是我们当前项目的服务提供者包文件,而不是其他模块的包,我遇到的就是修改这个就完成了,下面看一下服务提供者的代码
因为是分模块部署开发的,我将所有的接口都归为了一个接口模块中,通过业务模块来继承接口模块从而实现业务功能

dubbo 新增提供者 dubbo提供者注册不上_java-zookeeper_02

对于dubbo的服务注册于事务@Transactional是会产生冲突的,所有使用的dubbo的@Service必须指定它所继承的一个类的字节码文件。而我们在上面配置的批量扫描位置就应该扫描的是这个地方,扫描到了之后就会通过zookeeprt注册到注册中心成为提供者(而如果扫描的不是当前包就会注册失败)

package com.zcl.serviceImpl;

import com.alibaba.dubbo.config.annotation.Service;
import com.zcl.dao.UserDao;
import com.zcl.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

/**
 * 项目名称:DFJD
 * 描述:用户接口实现类
 *
 * @author zhong
 * @date 2022-07-11 20:13
 */
@Service(interfaceClass = UserService.class)
@Transactional
public class UserServiceImpl implements UserService {
    @Autowired
    private UserDao userDao;

    @Override
    public String testUser() {
        System.out.println("用户接口实现类");
        userDao.add("123456");
        return "success";
    }
}

对于远程服务的调用如下:
dubbo的远程调用使用的是dubbo的@Reference注解(一般的同一个模块开发的我们都是使用@Autowired根据类型注入),消费者就是通过了@Reference注解到注册中心消费提供者的服务的

package com.zcl.controller;

import com.alibaba.dubbo.config.annotation.Reference;
import com.zcl.service.UserService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 项目名称:DFJD
 * 描述:用户控制器
 *
 * @author zhong
 * @date 2022-07-11 20:10
 */
@RestController
@RequestMapping("/user")
public class UserController {
    @Reference
    private UserService userService;

    @RequestMapping("/test")
    public String test() {
        System.out.println("资源被访问");
        return userService.testUser();
    }
}

如何使用zookeeper客户端来查看注册的dubbo服务

使用的是win版本操作

一:在按照路径的bin目录下打开客户端程序

dubbo 新增提供者 dubbo提供者注册不上_dubbo 新增提供者_03


二:进入程序输出指令如下

# 查看所有的服务
ls /

# 进入服务
ls /xxx

# 删除服务
deleteall /xxx

具体操作如下

dubbo 新增提供者 dubbo提供者注册不上_dubbo 新增提供者_04