看完视频想着实战一下,遇到好多坑,现在好像用的也少了,查文章资料什么的也好少,详细记录下实战步骤和遇到的坑。
目录
1 简介
1.1 dubbo介绍
1.2 运行原理
1.3 使用
2 环境搭建
2.1 下载安装zookeeper
2.2 下载运行dubbo-admin
3 工程创建
4 dubbo使用总结
4.1 关键步骤
4.2 遇到的坑
1 简介 1.1 dubbo介绍
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-adminsrcmainresourcsapplication.properties里的dubbo.registry.address 指定zookeeper地址,配置文件已经默认是对的,我们不用改!dubbo.registry.address=zookeeper://127.0.0.1:2181
2)打包dubbo-admin,然后dubbo-admintarget下就会生成dubbo-admin-0.0.1-SNAPSHOT.jar
cmd打开命令行窗口然后
mvn clean package -Dmaven.test.skip=true
ps:下载了maven但是没有配置maven环境变量的话需要配置才可以。
新建环境变量MAVEN_HOME,赋值D:Program FilesApachemaven(下载的maven的位置)编辑环境变量Path,追加%MAVEN_HOME%bin;
3)执行我们的jar包,命令:java -jar xxx.jar
java -jar D:dubbo-admindubbo-admin-masterdubbo-admintargetdubbo-admin-0.0.1-SNAPSHOT.jar
4)访问http://localhost:7001/,默认账号密码root和root,登陆进去。
3 工程创建
1)创建empty项目dubbo-zookeeper
2)new module 提供者:com.wcx provider-server
先导入dubbo-spring-boot-starter、zkClient、zookeeper依赖(zookeeper的依赖会日志冲突,要排除slf4j-log4j12)
写个服务端的接口,模拟卖票UTF-8 UTF-8 1.8 8.0.23 org.springframework.boot spring-boot-starter-web1.5.1.RELEASE org.apache.dubbo dubbo-spring-boot-starter2.7.7 com.github.sgroschupf zkclient0.1 org.apache.curator curator-framework2.12.0 org.apache.curator curator-recipes2.12.0 org.apache.zookeeper zookeeper3.4.14 org.slf4j slf4j-log4j12org.springframework.boot spring-boot-autoconfigure1.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")+"服务端启动完成"); } }resouces下创建application.yml(配置1.应用名,2.注册中心地址3.暴露的服务)
server: port: 8001 dubbo: application: name: provider-server #注册的应用名 registry: address: zookeeper://127.0.0.1:2181 #注册中心的地址zookeeper scan: basePackages: com.wcx #要暴露的注册的服务,我们的包名
启动服务,provider-server提供者服务就会自动注册到zookeeper,我们再访问dubbo-admin可以看到提供者数量是1啦。可以通过应用名搜索(我们配置的是provider-server)
3)new module 消费者:com.wcx comsumer-server
导入依赖和provider一样yml配置(配置1.应用名,2.注册中心地址):
server: port: 8002 dubbo: application: name: consumer-server #消费者去哪里拿服务器,需要暴露自己的名字 registry: address: zookeeper://127.0.0.1:2181 #注册中心的地址想拿到provider-server提供的接口,需要去注册中心拿到服务,把provider的TicketService复制过来,需要定义与provider相同的路径和类名。写个controller测试调用提供者的,使用@DubboReference
注解
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(); } }启动消费者服务,然后再访问7001,可以看到消费者数量也是1 了然后使用postman测试接口,成功返回,成功调用服务端的服务!
导入依赖yml配置应用名,暴露自己的名字,配置注册中心地址,提供者配置需要暴露的服务(消费者只需要消费,不提供服务不用配置这个)关键注解,提供者:Service实现类使用@DubboService消费者并且定义与提供者路径相同的接口名,注入使用@DubboReference 4.2 遇到的坑
看一遍跟实际做一遍真的完全不一个感受,各种各样的坑,但是真的得动手做,看一遍感觉看了就忘了,做一遍才真的感觉掌握了。
坑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,启动成功!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)