SpringBoot06-Dubbo和Zookper集成
Posted JagTom
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot06-Dubbo和Zookper集成相关的知识,希望对你有一定的参考价值。
什么是Dubbo?
Dubbo(开源分布式服务框架)
Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。
服务提供者(Provider):暴露服务的服务提供方,服务提供者在启动时,向注册中心注册自己提供的服务。
服务消费者(Consumer):调用远程服务的服务消费方,服务消费者在启动时,向注册中心订阅自己所需的服务,服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
注册中心(Registry):注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者
监控中心(Monitor):服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心
什么是Zookeeper?
- ZooKeeper主要服务于分布式系统,可以用ZooKeeper来做:统一配置管理、统一命名服务、分布式锁、集群管理。
- 使用分布式系统就无法避免对节点管理的问题(需要实时感知节点的状态、对节点进行统一管理等等),而由于这些问题处理起来可能相对麻烦和提高了系统的复杂性,ZooKeeper作为一个能够通用解决这些问题的中间件就应运而生了。
在这里的Zookeeper和Dubbo有什么关系呢?
Zookeeper可以作为一个注册中心,就是原理图中的Register
下载zookeeper,推荐下载3.4.14版本
Index of /dist/zookeeper/zookeeper-3.4.14
解压,讲zoo_sample.cfg复制一份,改名为zoo.cfg,防止启动闪退
它默认是2181端口号
以管理员身份运行该cmd
连接成功
运行该cmd zkCli.cmd
运行起来了按几下回车,就可以输命令了
window下安装dubbo-admin
dubbo本身并不是一个服务软件。它其实就是一个jar包,能够帮你的java程序连接到zookeeper,并利用zookeeper消费、提供服务。
但是为了让用户更好的管理监控众多的dubbo服务,官方提供了一个可视化的监控程序dubbo-admin,不过这个监控即使不装也不影响使用。
我们这里来安装一下:
地址 :https://github.com/apache/dubbo-admin/tree/master
防止github进不去,我也上传了免费资源dubbo-admin-master-0.2.0-Java文档类资源-CSDN下载
解压,可以看出它是一个maven项目
在项目目录下打包dubbo-admin
mvn clean package -Dmaven.test.skip=true
记得要配置maven的环境变量,不然mvn指令无效的
打包成功最后就生成了个这么个jar包
执行 dubbo-admin\\target 下的dubbo-admin-0.0.1-SNAPSHOT.jar,记得打开zookeeper服务
java -jar dubbo-admin-0.0.1-SNAPSHOT.jar
访问 http://localhost:7001/ 默认账号密码为root--root
做完这些东西了,那搞完这些有什么用呢?
接下来我们进行正式的开发。
SpringBoot + Dubbo + zookeeper
我们先创建两个不同的项目来模拟两个服务
并且一个端口号为provide-8001,一个为consumer-8002
如果我们想在服务器接收到另一个服务器的请求,该怎么办?
1、将服务提供者注册到注册中心,我们需要整合Dubbo和zookeeper,所以需要导包
我们从dubbo官网进入github,看下方的帮助文档,找到dubbo-springboot,找到依赖包
<!-- Dubbo Spring Boot Starter --> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>2.7.3</version> </dependency>
zookeeper的包我们去maven仓库下载,zkclient;
<!-- https://mvnrepository.com/artifact/com.github.sgroschupf/zkclient --> <dependency> <groupId>com.github.sgroschupf</groupId> <artifactId>zkclient</artifactId> <version>0.1</version> </dependency>
【新版的坑】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>
2、在springboot配置文件中配置dubbo相关属性!
dubbo: application: name: provider #当前应用名字 registry: address: zookeeper://127.0.0.1:2181 #注册中心地址 scan: base-packages: com.wjc.service #扫描指定包下服务
3、在service的实现类中配置服务注解,发布服务!注意导包问题
TicketServic.interface
public interface TicketService
public String getTicket();
TicketServicImpl.class
import org.apache.dubbo.config.annotation.Service;
import org.springframework.stereotype.Component;
@Service //注意用Dubbo下的注解
@Component //这个是Spring下的注入
public class TicketServiceImpl implements TicketService
@Override
public String getTicket()
return "《HelloWorld》";
为什么?我们会发现@Service有两个包下的注解,容易导错,如果用的Spring的注解,Dubbo是扫描不到的 扩展:Dubbo2.7.7,更新了注解@DubboService,不需要考虑冲突的问题了
逻辑理解 :应用启动起来,dubbo就会扫描指定的包下带有@component注解的服务,将它发布在指定的注册中心中!
我们可以启动一下provider,记得打开zookeeper服务,发现Dubbo 启动起来了,并且注册
我们再去启动dubbo-admin,也能找到提供者
提供者这时已经注册到了注册中心,消费者要来拿服务
消费者导入依赖,和之前的依赖一样;
<!--dubbo--> <!-- Dubbo Spring Boot Starter --> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>2.7.3</version> </dependency> <!--zookeeper--> <!-- https://mvnrepository.com/artifact/com.github.sgroschupf/zkclient --> <dependency> <groupId>com.github.sgroschupf</groupId> <artifactId>zkclient</artifactId> <version>0.1</version> </dependency> <!-- 引入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>
配置参数
dubbo: application: name: consumer #当前应用名字 registry: address: zookeeper://127.0.0.1:2181 #注册中心地址
然后我们去消费者编写
发现这里是找不到提供者的类的,解决办法有两种,方法一,在pom依赖里面导入提供者的pom坐标(常用) ,方法二,在同包名下拷贝提供者的接口
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.stereotype.Service;
@Service //用Spring的注解方法Spring容器中
public class ConsumerService
@Reference //远程引用指定的服务,他会按照全类名进行匹配,看谁给注册中心注册了这个全类名 注意别导错包了
TicketService ticketService;
public void bugTicket()
String ticket = ticketService.getTicket();
System.out.println("在注册中心买到"+ticket);
测试
@SpringBootTest(classes=ConsumerApplication.class) //如果出现multiple错误,里面写上classes
class ConsumerApplicationTests
@Autowired
ConsumerService consumerService;
@Test
void contextLoads()
consumerService.bugTicket();
得到了结果!
总结
步骤:
1.提供者提供服务
1.导入依赖
2.配置文件里配置注册中心的地址,以及服务发现名,和要扫描的包~
3.在想要被注册的服务上面~增加一个注解@Service
2.消费者如何消费
1.导入依赖
2.配置注册中心的地址,配置自己的服务名~
3.用@Reference从远程注入服务~
注意版本问题,注意注解导包,正是开发会在多台服务器上运行,自己也可以用Linux去实验
一些面试题:
40 道基础Dubbo 面试题及答案_茅坤宝骏氹的博客-CSDN博客_dubbo面试题
分布式 - 公司使用什么RPC框架,聊聊你理解的RPC原理_Q.E.D.的博客-CSDN博客_大公司都用什么rpc框架
以上是关于SpringBoot06-Dubbo和Zookper集成的主要内容,如果未能解决你的问题,请参考以下文章