看完视频想着实战一下,遇到好多坑,现在好像用的也少了,查文章资料什么的也好少,详细记录下实战步骤和遇到的坑。
目录
1 简介
1.1 dubbo介绍
1.2 运行原理
1.3 使用
2 环境搭建
2.1 下载安装zookeeper
2.2 下载运行dubbo-admin
3 工程创建
4 dubbo使用总结
4.1 关键步骤
4.2 遇到的坑
dubbo是一款高性能、轻量级开源的java rpc框架
三大核心能力:面向接口的远程方法调用、智能容错和负载均衡以及服务自动注册和发现。
1)服务提供者Provider:暴露服务的提供方,服务提供者在启动时,向注册中心注册自己提供的服务。
2)服务消费者Consumer:调用远程服务的服务消费方,服务消费者在启动时,向注册中心订阅自己所需要的服务,服务消费者,才能够提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
3)注册中心Registry:注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接体送变更数据给消费者。
4)监控中心Montor:服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
1.只需要spring加载dubbo的配置即可(导入依赖;yml配置应用名,暴露自己的名字,配置注册中心地址,提供者配置需要暴露的服务(消费者只需要消费,不提供服务不用配置这个))
2.定义服务接口Service,在服务提供方实现接口,注解@DubboService
3.服务消费方定义与提供者路径相同的接口名,注入使用@DubboReference
dubbo:jar包
zookeeper:注册中心
dubbo-admin:是一个监控管理后台,查看我们注册了哪些服务,哪些服务被消费了
dubbo-admin本身并不是一个服务软件。它其实就是一个jar包,能够帮你的java程序连接到zookeeper,并利用zookeeper消费、提供服务。
但是为了用户更好地管理监控众多的dubbo服务,官方提供了一个可视化的监控程序dubbo-admin,不过这个不安装也不影响使用
1)下载地址:Apache ZooKeeper,上面说3.6.3是latest stable release (最新稳定版本,新词汇get),所以我下载的3.63。
ps:下面一个带source Release的百度了下是代表还没编译过的源代码,需要自行编译,一般Linux系统用。
2)conf文件夹下的复制zoo.sample.cfg一份,命名zoo.cfg(在这个文件我们可以看到zookeeper默认端口是2181)。然后再启动zkServer.cmd就可以了!
ps:如果直接运行/bin/zkServer.cmd,初次运行会报错,可能闪退,编辑这个cmd文件,末尾endlocal上一行添加pause,再启动就可以看到报错信息哦。报错说没有zoo.cfg什么的。所以我们再遇到闪退可以这样看一下哦!(新技能get!)
3)启动bin目录下的zkCli.cmd测试。看到Welcome to ZooKeeper!就可以了!
可以学几个命令:虽然节点这个词我也还不太懂。
ls/:列出zookeeper根下保存的所有节点。
create -e/kuangshen 123:创建一个节点
get /kuangshen:
1)从github把项目clone下来https://github.com/apache/dubbo-admin
ps:可以修改dubbo-admin\src\main\resourcs\application.properties里的dubbo.registry.address 指定zookeeper地址,配置文件已经默认是对的,我们不用改!dubbo.registry.address=zookeeper://127.0.0.1:2181
2)打包dubbo-admin,然后dubbo-admin\target下就会生成dubbo-admin-0.0.1-SNAPSHOT.jar
cmd打开命令行窗口然后
mvn clean package -Dmaven.test.skip=true
ps:下载了maven但是没有配置maven环境变量的话需要配置才可以。
3)执行我们的jar包,命令:java -jar xxx.jar
java -jar D:\dubbo-admin\dubbo-admin-master\dubbo-admin\target\dubbo-admin-0.0.1-SNAPSHOT.jar
4)访问http://localhost:7001/,默认账号密码root和root,登陆进去。
1)创建empty项目dubbo-zookeeper
2)new module 提供者:com.wcx provider-server
UTF-8
UTF-8
1.8
8.0.23
org.springframework.boot
spring-boot-starter-web
1.5.1.RELEASE
org.apache.dubbo
dubbo-spring-boot-starter
2.7.7
com.github.sgroschupf
zkclient
0.1
org.apache.curator
curator-framework
2.12.0
org.apache.curator
curator-recipes
2.12.0
org.apache.zookeeper
zookeeper
3.4.14
org.slf4j
slf4j-log4j12
org.springframework.boot
spring-boot-autoconfigure
1.5.1.RELEASE
package com.wcx.service;
public interface TicketService {
String getTicket();
}
package com.wcx.service;
import org.apache.dubbo.config.annotation.DubboService;
@DubboService(version = "1.0.0",timeout = 3000)
public class TicketServiceImpl implements TicketService{
public String getTicket() {
return "拿到票了";
}
}
创建启动类ProviderServerApplication
@SpringBootApplication
public class ProviderServerApplication {
public static void main(String[] args) {
ConfigurableEnvironment env = SpringApplication.run(ProviderServerApplication.class, args).getEnvironment();
System.out.println(env.getProperty("dubbo.application.name")+"服务端启动完成");
}
}
server:
port: 8001
dubbo:
application:
name: provider-server #注册的应用名
registry:
address: zookeeper://127.0.0.1:2181 #注册中心的地址zookeeper
scan:
basePackages: com.wcx #要暴露的注册的服务,我们的包名
3)new module 消费者:com.wcx comsumer-server
server:
port: 8002
dubbo:
application:
name: consumer-server #消费者去哪里拿服务器,需要暴露自己的名字
registry:
address: zookeeper://127.0.0.1:2181 #注册中心的地址
package com.wcx.controller;
import com.wcx.service.TicketService;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
@DubboReference(version = "1.0.0",timeout = 300)
private TicketService ticketService;
@PostMapping(value = "buyTicket")
public String buyTicket() {
return ticketService.getTicket();
}
}
看一遍跟实际做一遍真的完全不一个感受,各种各样的坑,但是真的得动手做,看一遍感觉看了就忘了,做一遍才真的感觉掌握了。
坑1.主要是导入依赖这块,如果版本有问题就各种奇怪的问题,
springboot依赖用的2版本就不行先是启动报错,用1可以了
坑2.启动报错:WARN - Session 0x0 for server null, unexpected error, closing socket connection and attempting
百度跟tomcat版本也有冲突,需要指定tomcat版本
坑3.启动报错:Class path contains multiple SLF4J bindings.
log4j:WARN No appenders could be found for logger (org.springframework.core.env.StandardEnvironment)
log4j警告:WARN Please initialize the log4j system properly
百度说是少导入依赖,那就把zookeeper里排除的slf4j依赖这块先注释。
log4j需要加log.properties文件到src,不行,再百度,说maven项目要放到resources下。
坑4.启动服务端报错:Current Spring Boot Application is await...
需要加入spring-boot-starter-web依赖
坑5.consumer正常启动了,但是没有日志,就一个spring的图案日志在那,,
百度到一个相同的情况,说要将slf4j的jar包注释,但是注释了会出现上面的slf4j错误,,
灵机一动排除了依赖,重新导入一个新的slf4j,启动成功!