看B站狂神说Dubbo+ZooKeeper视频记的笔记

看完视频想着实战一下,遇到好多坑,现在好像用的也少了,查文章资料什么的也好少,详细记录下实战步骤和遇到的坑。

目录

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.2 运行原理

看B站狂神说Dubbo+ZooKeeper视频记的笔记_第1张图片

1)服务提供者Provider:暴露服务的提供方,服务提供者在启动时,向注册中心注册自己提供的服务。
2)服务消费者Consumer:调用远程服务的服务消费方,服务消费者在启动时,向注册中心订阅自己所需要的服务,服务消费者,才能够提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
3)注册中心Registry:注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接体送变更数据给消费者。
4)监控中心Montor:服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

1.3 使用

1.只需要spring加载dubbo的配置即可(导入依赖;yml配置应用名,暴露自己的名字,配置注册中心地址,提供者配置需要暴露的服务(消费者只需要消费,不提供服务不用配置这个))
2.定义服务接口Service,在服务提供方实现接口,注解@DubboService
3.服务消费方定义与提供者路径相同的接口名,注入使用@DubboReference
dubbo:jar包
zookeeper:注册中心
dubbo-admin:是一个监控管理后台,查看我们注册了哪些服务,哪些服务被消费了

dubbo-admin本身并不是一个服务软件。它其实就是一个jar包,能够帮你的java程序连接到zookeeper,并利用zookeeper消费、提供服务。
但是为了用户更好地管理监控众多的dubbo服务,官方提供了一个可视化的监控程序dubbo-admin,不过这个不安装也不影响使用

2 环境搭建

2.1 下载安装zookeeper

1)下载地址:Apache ZooKeeper,上面说3.6.3是latest stable release (最新稳定版本,新词汇get),所以我下载的3.63。

ps:下面一个带source Release的百度了下是代表还没编译过的源代码,需要自行编译,一般Linux系统用。

看B站狂神说Dubbo+ZooKeeper视频记的笔记_第2张图片看B站狂神说Dubbo+ZooKeeper视频记的笔记_第3张图片

  2)conf文件夹下的复制zoo.sample.cfg一份,命名zoo.cfg(在这个文件我们可以看到zookeeper默认端口是2181)。然后再启动zkServer.cmd就可以了!

ps:如果直接运行/bin/zkServer.cmd,初次运行会报错,可能闪退,编辑这个cmd文件,末尾endlocal上一行添加pause,再启动就可以看到报错信息哦。报错说没有zoo.cfg什么的。所以我们再遇到闪退可以这样看一下哦!(新技能get!)

看B站狂神说Dubbo+ZooKeeper视频记的笔记_第4张图片

3)启动bin目录下的zkCli.cmd测试。看到Welcome to ZooKeeper!就可以了!

可以学几个命令:虽然节点这个词我也还不太懂。

ls/:列出zookeeper根下保存的所有节点。
create -e/kuangshen 123:创建一个节点
get /kuangshen:

2.2 下载运行dubbo-admin

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环境变量的话需要配置才可以。

  • 新建环境变量MAVEN_HOME,赋值D:\Program Files\Apache\maven(下载的maven的位置)
  • 编辑环境变量Path,追加%MAVEN_HOME%\bin\;

3)执行我们的jar包,命令:java -jar xxx.jar

java -jar D:\dubbo-admin\dubbo-admin-master\dubbo-admin\target\dubbo-admin-0.0.1-SNAPSHOT.jar

看B站狂神说Dubbo+ZooKeeper视频记的笔记_第5张图片

4)访问http://localhost:7001/,默认账号密码root和root,登陆进去。

 看B站狂神说Dubbo+ZooKeeper视频记的笔记_第6张图片

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-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")+"服务端启动完成");
        }
    }
  • 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测试接口,成功返回,成功调用服务端的服务!

看B站狂神说Dubbo+ZooKeeper视频记的笔记_第7张图片
 

4 dubbo使用总结

4.1 关键步骤

  • 导入依赖
  • 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,启动成功!

你可能感兴趣的:(微服务,java,微服务,微服务架构,dubbo,zookeeper)