先说两句题外话
激动地心!颤抖的手!恨不得在此刻,半夜两点仰天长啸!我特码运行起来辣!!!!
别问,问就是一个小问题debug8个小时精神恍惚瞎猫碰上死耗子把问题解决了,只能说,麻了
回归正题,接下来简述一下springboot整合zookeeper 和 dubbo的流程和途中碰到问题
zookeeper环境搭建
首先去官网下载zookeeper压缩包,我这里使用的是3.4.14版本的
下载完毕解压之后,点进去找到conf目录,里面有个zoo.conf文件,打开,修改其中的dataDir和dataLogDir路径,是zookeeper的数据存储和日志存储相关的配置参数。
修改后再找到bin目录,里面有zkCli.cmd和zkServer.cmd,前者是zookeeper的客户端,后者是服务端,后面配置好了dubbo再讲这个,至此zookeeper的环境搭建就完成了
引入dubbo
刚开始弄这个分布式的还没搞懂什么是父项目,研究了一下原来和eclipse里面的包中包再放项目差不多,就是新建项目选择一个空项目,这个就是父项目。
(这里要有一个父项目的目的一是为了在pom里设置dubbo的依赖,可以让多个子项目全局使用,不用额外引用。二是为了各个子项目之间的引用更加方便。)
父项目需要引入的依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.0.0.RELEASE</version>
</dependency>
<!-- dubbo -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>
<!-- zookeeper -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.8</version>
</dependency>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
</dependencies>
然后在空项目的根目录那里点击新建,选择新模块(Module),这里就和正常创建一个项目一样了。选择你需要的项目的类型,我们这里是简单的做一个微服务,所以也都选择一个空项目
这里有一个老版本关于log4j12和slf4j的坑(不引入的话我会报错,虽然不影响运行),引入依赖来解决(在 zookeeper
的依赖中排除了 slf4j-log4j12
。这是为了避免与项目中可能使用的 SLF4J(Simple Logging Facade for Java)和 Log4j 版本发生冲突。这样可以确保项目使用的 SLF4J 和 Log4j 版本与 ZooKeeper 的版本兼容。)
<!-- 引入zookeeper -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.12.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>2.12.0</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.14</version>
<!--排除这个slf4j-log4j12-->
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
环境配置好了,现在注入代码
第一个子项目:api
里面只需要放置一个接口就可以,如图
第二个子项目:服务消费者(comsumer)
新建两个类和一个application即可
创建一个控制器
切记使用dubbo的@reference注解
package com.example.controller;
import api.HelloService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@com.alibaba.dubbo.config.annotation.Reference
private HelloService helloService;
@RequestMapping("sayHello")
public String sayHello(String message){
return helloService.sayHello(message);
}
}
启动类
package com.example;
import com.alibaba.dubbo.config.spring.context.annotation.EnableDubboConfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication(scanBasePackages = "com.example.controller")
@EnableDubboConfig
public class consumerMainApplication {
public static void main(String[] args) {
SpringApplication.run(consumerMainApplication.class,args);
System.out.println("=============this is consumer===============");
}
}
application环境配置
server:
port: 9001
dubbo:
application:
# 服务名称,随便写写
name: server-consumer
# zookeeper地址,用于向其注册服务
registry:
protocol: zookeeper
address: zookeeper://127.0.0.1:2181
#要对照自己zookeeper的注册地址来写,我这里zookeeper的地址是2181
scan:
base-packages: com.example.controller
第三个子项目:服务提供者(provider)
还是只需要写两个类和一个配置
实现接口
这里的service切记依赖dubbo的Service
package com.example.service;
import api.HelloService;
import com.alibaba.dubbo.config.annotation.Service;
import org.springframework.stereotype.Component;
@Service(interfaceClass = HelloService.class)
@Component
public class HelloServiceImpl implements HelloService {
@Override
public String sayHello(String message) {
return "hello:"+message;
}
}
启动类
package com.example;
import com.alibaba.dubbo.config.spring.context.annotation.EnableDubboConfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication(scanBasePackages = "com.example.controller")
@EnableDubboConfig
public class consumerMainApplication {
public static void main(String[] args) {
SpringApplication.run(consumerMainApplication.class,args);
System.out.println("=============this is consumer===============");
}
}
application配置
server:
port: 8080
dubbo:
application:
name: server-provider
registry:
protocol: zookeeper
address: zookeeper://127.0.0.1:2181
# group: api.HelloService/providers # 指定注册到的分组,这里不需要,这是之前为解决bug做出的尝试
protocol:
name: dubbo
port: 7777
scan:
base-packages: com.example.service
Idea的布置大概就是这些,然后就是微服务,启动!
首先启动上面zookeeper提到的zkServer.cmd,然后启动dubbo -admin,(不启动zkServer的话admin会死循环报错),通过admin留下的端口去浏览器访问“localhost:端口号”,输入账号密码(一般都是root),即可通过admin客户端查看有哪些微服务了
咱们这个流程走下来启动应该是这个效果
(最后切记把启动类放在com.example或者更深层,6个小时的血与泪啊5555,虽然知识很简单,但是让不知道的人去了是真无从下手。因为最后在admin里面看到自己的消费者信息,找不到提供者信息,把provider和cosumer的demo和配置一行一行的看,去zkCli里面把zookeeper的注册信息都看麻了,最后找到真是provider没有注册到,但不知道原理。真是在网上把别人布置微服务的坑都看了一遍硬是没反应过来自己问题在哪儿,已经走投无路开摆了调了一下结构,居然神奇的运行起来了,这也是基础不牢固,经过今晚的这个折磨,感觉这个启动类的位置知识俺能记一辈子)文章来源:https://www.toymoban.com/news/detail-764213.html
-----被zookeeper折磨后的随手一记文章来源地址https://www.toymoban.com/news/detail-764213.html
到了这里,关于windows idea 整合dubbo zookeeper bug记录的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!