Spring Boot 整合 Dubbo,Zookeper,Dubbo-Admin 教程 不涉及原理

2022-01-14 08:27:53 浏览数 (1)

SpringBoot 注解 Yml配置 整合 Dubbo 、Zookeper

首先 要知道Dubbo、Zookeper依赖知道是什么

代码语言:javascript复制
        <dependency>
            <groupId>com.101tec</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.10</version>
            <exclusions>
                <exclusion>
                    <artifactId>slf4j-log4j12</artifactId>
                    <groupId>org.slf4j</groupId>
                </exclusion>
            </exclusions>

        </dependency>
        <dependency>
            <groupId>com.alibaba.spring.boot</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>2.0.0</version>
        </dependency>

说明,上面排除了 slf4j-log4j12 依赖,不排除会报错,这里我忘记了爆的是包重复依赖还是其他问题

流程 快速过一遍

创建2个工程,一个是生产者,一个是消费者,都要上面的zkclient、dobbo依赖都加上。

然后要了解

消费者:只写Controller与Service接口,不写具体实现的类

生产者:只写Service接口与ServiceImpl实现类

同时 controller层 不再使用 @Autowired注解,而是换用com.alibaba.dubbo.config.annotation.Reference的 @Reference注解

ServiceImpl 实体类上使用@Service注解,要使用Dubbo包下的哦,不然会出现空指针异常 他的作用是 暴露服务

在Applicaiton启动类上 加上@EnableDubbo

还要配置一下Dubbo的配置,不然 是不知道的注册中心在哪里。

知道流程之后,我们再讲解一下 Zookeper、Dubbo-admin2.6.0的使用教程

Zookeper 从网上可以下载,下载后,需要进入配置文件,复制一份zoo_sample.cfg 改名为 zoo.cfg,然后就可以直接启动了,启动不了 ,看下我文章,上面有一些排错(再启动命令最后加上@pause 即可),这里不做详细介绍,不然,文章显得臭而长

Dubbo-admin 我采用的是2.6.0的版本,首先这是个war包,弄个tomcat放进去。再配置文件 webappsdubbo-admin-2.6.0WEB-INF 有个 dubbo.properties 文件,你可看到账号密码,也可以修改账号 与密码,root root,guest guest (修改密码,要重启tomcat生效)

到这,启动Tomcat ,然后访问 http://127.0.0.1:8080/dubbo-admin-2.6.0 (为什么名字臭长,因为war包就这个名字,tomcat启动,解析出的文件就叫这个)

行了 输入密码 看到

行,我们dubbo-admin 也会启动了,

我们简单讲逻辑与启动流程。

首先 启动zookeeper 作为注册中心,然后,启动dubbo-admin,你可监控zookeper已经注册上去的服务。接下来,你可以启动你的生产者,消费者了(这里就没有先后顺序了)。

两个服务启动成功,就可以开始调用服务了。

(看看是不是相应的结果出现,只要不是空指针异常,没什么大问题。)

网上说的很多,空指针的方式解决方案,我们只能瞎猫去碰,没有从根本教我们去排查,太他妈坑了。

这里,我说下排查这个调用空指针的流程

首先,确定生产者、消费者服务能启动,不报错。

然后看下 @Service @Reference 是不是正确的包名。

然后去注册中心可视化的 dubbo-admin 看,是否注册上去了。

(没注册上去,那就想办法,注册上去,看看端口对不对,之类的)

注册上去了,调用依旧是空指针。不出意外,老铁,咱俩遇到的问题一样,你看看你service的生产者与消费者,接口名是否一样,不一样,会爆空指针异常哦。

如果还没解决,真的,铁子,去看看你逻辑有没有写错。实在不行,咱看看我下面的代码吧

开码

说明 : 包名为 com.zanglikun 下面AS 用红色标注,是希望提醒老哥,不要写错大小写 不然 你会再来看我这句话 哈哈哈。

pom文件的代码 生产者、消费者是一样的 其中 zkclient 是 zookeper 的依赖,dubbo 是 dubbo 的依赖

代码语言:javascript复制
        <dependency>
            <groupId>com.101tec</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.10</version>
            <exclusions>
                <exclusion>
                    <artifactId>slf4j-log4j12</artifactId>
                    <groupId>org.slf4j</groupId>
                </exclusion>
            </exclusions>

        </dependency>
        <dependency>
            <groupId>com.alibaba.spring.boot</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>2.0.0</version>
        </dependency>

生产者代码:看下结构,只有service层哦 切记

AService

代码语言:javascript复制
public interface AService {
    String sayhello(String name);
}

AServiceImpl

代码语言:javascript复制
import com.alibaba.dubbo.config.annotation.Service;
import com.zanglikun.service.AService;
@Service
public class AServiceimpl implements AService {
    @Override
    public String sayhello(String name) {
        return "Hello" name;
    }
}

消费者结构:有Controller,service,但没有具体实现的impl类 切记

先看Controller类 类名叫:AController

代码语言:javascript复制
import com.alibaba.dubbo.config.annotation.Reference;
import com.zanglikun.service.AService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/a")
public class AController {
    @Reference

    private AService aservice;
    
    @GetMapping("b")
    public String say(String name){
      return aservice.sayhello(name);
    }
}

再看service AService接口

代码语言:javascript复制
public interface AService {
    String sayhello(String name);
}

代码基本算写完。然是Dubbo不知道往哪里注册啊。

说下生产者的Yml配置

代码语言:javascript复制
server:
  port: 8081
dubbo:
  application:
    #注册在注册中心的名称,唯一标识,请勿重复
    name: dubbo-provider
  #单zookeeper服务:zookeeper://127.0.0.1:2181
  registry:
    address: zookeeper://127.0.0.1:2181
  #暴露服务方式
  protocol:
    id: dubbo
    #通信协议
    name: dubbo
    #暴露服务端口 (默认是20880,修改端口,不同的服务提供者端口不能重复)
    port: 20880

消费者的Yml

代码语言:javascript复制
server:
  port: 8082


dubbo:
  application:
    #注册在注册中心的名称,唯一标识,请勿重复
    name: dubbo-consumer
  #单zookeeper服务:zookeeper://127.0.0.1:2181
  registry:
    address: zookeeper://127.0.0.1:2181

Yml配置 我并不是很熟悉,这里能保证各位能跑起来。具体详细的原理方面,会再其他文章中查看。

启动类 就注解不要忘记加 这里不放代码,直接上图

然后 一切就绪,开始 测试 我这里消费者 端口是 8082

所以 127.0.0.1:8082/a/b?name=zhangsan 只要输出 Hellozhangsan 就算完成。

铁蛋,搞定了。很多东西,我强调了很多遍。不是啰嗦,新手上手,太要命了。

特殊说明: 解决问题的光鲜,藏着磕Bug的痛苦。 万物皆入轮回,谁也躲不掉! 以上文章,均是我实际操作,写出来的笔记资料,不会出现全文盗用别人文章!烦请各位,请勿直接盗用!

0 人点赞