springboot+dubbo+zookeper的使用心得

自从4.2号跳槽后,在新公司用springboot+dubbo也有一段时间了,期间也碰到过一些坑,下面就说一说。

  先说说为什么使用dubbo:

1.什么是dubbo:Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需要用的,只有在分布式的时候,才有dubbo这样的分布式服务框架的需求,并且本质上是个服务调用的东东,说白了就是个远程服务调用的分布式框架(告别Web Service模式中的WSdl,以服务者与消费者的方式在dubbo上注册)

2.Dubbo可以做什么:1.透明化的远程方法调用,就像调用本地方法一样调用远程方法,只需简单配置,没有任何API侵入。      
2.软负载均衡及容错机制,可在内网替代F5等硬件负载均衡器,降低成本,减少单点。
3. 服务自动注册与发现,不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的IP地址,并且能够平滑添加或删除服务提供者。

Dubbo采用全spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用Spring加载Dubbo的配置即可,Dubbo基于Spring的Schema扩展进行加载。

接下来就是springboot+dubbo+zookeper的使用配置使用了

一:版本和运行环境:

运行环境:JDK 8,Maven 3.0+

技术栈:SpringBoot 1.5+、Dubbo 2.5+、ZooKeeper 3.3+

其中SpringBoot ,Dubbo 只要在Maven中配置就可以自动下载jar了,ZooKeeper 需要独立加载软件并运行才可以。

二:Zookeeper的安装和使用步骤:

ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。 ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。 ZooKeeper包含一个简单的原语集, 提供Java和C的接口。 ZooKeeper代码版本中,提供了分布式独享锁、选举、队列的接口,代码在zookeeper-3.4.3\src\recipes。其中分布锁和队列有Java和C两个版本,选举只有Java版本。

第一步:官网下载ZooKeeper 3.3+的软件

ZooKeeper下载地址:http://mirrors.cnnic.cn/apache/zookeeper/zookeeper-3.4.8/zookeeper-3.4.8.tar.gz

第二步:进行配置,其配置过程如下:

在 conf 目录新建 zoo.cfg ,照着该目录的 zoo_sample.cfg 配置如下。

 
  1. # The number of milliseconds of each tick

  2. tickTime=2000

  3. # The number of ticks that the initial

  4. # synchronization phase can take

  5. initLimit=10

  6. # The number of ticks that can pass between

  7. # sending a request and getting an acknowledgement

  8. syncLimit=5

  9. # the directory where the snapshot is stored.

  10. dataDir=/tmp/zookeeper

  11. # the port at which the clients will connect

  12. clientPort=70

第三步:在 bin 目录下,双击zkSever.cmd,启动 ZooKeeper

ZooKeeper安装和使用就完成了,接下来是SpringBoot如何配置Dubbo和Zookeeper了。

四:SpringBoot项目构建模块

第一步是搭建SpringBoot项目,来作为Dubbo的客户端请求服务。

首先需要在pom.xml加入相应的jar关联:

 
  1. <!-- Spring Boot Dubbo 依赖 -->

  2. <dependency>

  3. <groupId>io.dubbo.springboot</groupId>

  4. <artifactId>spring-boot-starter-dubbo</artifactId>

  5. <version>${dubbo-spring-boot}</version>

  6. </dependency>

这里还需要添加log4j关联,否则项目会启动报错

 
  1. <!-- https://mvnrepository.com/artifact/log4j/log4j -->

  2. <dependency>

  3. <groupId>log4j</groupId>

  4. <artifactId>log4j</artifactId>

  5. <version>1.2.14</version>

  6. </dependency>

接下来就是application.properties配置文件中关于Dubbo信息的配置了,配置内容如下所示:

 
  1. ## tomcat端口号配置

  2. server.port=8080

  3. ## 项目访问路径配置

  4. server.context-path=/bootTest

  5. ## Dubbo 应用名称

  6. spring.dubbo.application.name=consumer

  7. ##Dubbo 注册中心地址

  8. spring.dubbo.registry.address=zookeeper://127.0.0.1:70

  9. ## Dubbo 服务类包目录(service所在包的地址,这个千万不要配置错误)

  10. spring.dubbo.scan=dys.boot.test.service

接下来就是写功能代码主要有:接口,接口实现类,实体类,控制类,项目启动类

1实体类:

 
  1. package dys.boot.test.entity;

  2. import java.io.Serializable;

  3. /**

  4. * 返回结果实体类

  5. * @author dys

  6. *

  7. */

  8. public class ResultInfo implements Serializable{

  9. private static final long serialVersionUID = -1L;

  10. private String resultInfo;

  11.  
  12. public ResultInfo(String resultInfo) {

  13. super();

  14. this.resultInfo = resultInfo;

  15. }

  16.  
  17. public ResultInfo() {

  18. super();

  19. }

  20.  
  21. public String getResultInfo() {

  22. return resultInfo;

  23. }

  24.  
  25. public void setResultInfo(String resultInfo) {

  26. this.resultInfo = resultInfo;

  27. };

  28.  
  29. }

2.接口:

 
  1. package dys.boot.test.service;

  2. /**

  3. * RPC调用接口

  4. * @author dys

  5. *

  6. */

  7.  
  8. import dys.boot.test.entity.ResultInfo;

  9.  
  10. public interface RPCInterface {

  11. /**

  12. * 通过Dubbo实现远程RPC调用接口信息

  13. * @return

  14. */

  15. public ResultInfo getRPCInfo();

  16. }

3.接口实现类:

 
  1. package dys.boot.test.service.impl;

  2. import org.springframework.stereotype.Component;

  3. import com.alibaba.dubbo.config.annotation.Reference;

  4. import dys.boot.test.entity.ResultInfo;

  5. import dys.boot.test.service.RPCInterface;

  6. /**

  7. * RPC调用

  8. * @author dys

  9. */

  10. @Component

  11. public class RPCInterfaceImpl implements RPCInterface {

  12. @Reference()

  13. RPCInterface rpcInterface;//调用远程接口的实现类

  14.  
  15. @Override

  16. public ResultInfo getRPCInfo() {

  17. ResultInfo resultInfo=rpcInterface.getRPCInfo();

  18. return resultInfo;

  19. }

  20.  
  21. }

4.控制类:

 
  1. package dys.boot.test.controller;

  2. import org.springframework.beans.factory.annotation.Autowired;

  3. import org.springframework.stereotype.Controller;

  4. import org.springframework.web.bind.annotation.RequestMapping;

  5. import org.springframework.web.bind.annotation.ResponseBody;

  6. import dys.boot.test.entity.ResultInfo;

  7. import dys.boot.test.service.RPCInterface;

  8. /**

  9. * 测试

  10. * @author dys

  11. *

  12. */

  13. @Controller

  14. public class DubboController {

  15. @Autowired

  16. private RPCInterface rpcInterface;

  17. @RequestMapping("/test")

  18. @ResponseBody

  19. public String errorNginxTest(){

  20. ResultInfo resultInfo=rpcInterface.getRPCInfo();

  21. return "result:"+resultInfo.getResultInfo();

  22. }

  23. }

5.项目启动类:

 
  1. package dys.boot.test;

  2. import org.springframework.boot.SpringApplication;

  3. import org.springframework.boot.autoconfigure.SpringBootApplication;

  4. @SpringBootApplication

  5. public class SpringBootTest1Application {

  6. public static void main(String[] args) {

  7. SpringApplication.run(SpringBootTest1Application.class, args);

  8. }

  9. }

最后就是新建一个SpringBoot项目,来作为Dubbo的服务端用来返回请求信息

该项目和客户端项目基本差不多也是先在pom.xml 进行maven的配置

在pom.xml加入相应的jar关联:

 
  1. <!-- Spring Boot Dubbo 依赖 -->

  2. <dependency>

  3. <groupId>io.dubbo.springboot</groupId>

  4. <artifactId>spring-boot-starter-dubbo</artifactId>

  5. <version>${dubbo-spring-boot}</version>

  6. </dependency>

这里还是需要额外的添加log4j关联,否则项目会启动报错

 
  1. <!-- https://mvnrepository.com/artifact/log4j/log4j -->

  2. <dependency>

  3. <groupId>log4j</groupId>

  4. <artifactId>log4j</artifactId>

  5. <version>1.2.14</version>

  6. </dependency>

接下来还是application.properties配置文件中关于Dubbo信息的配置了,配置内容如下所示:

 
  1. ## tomcat端口号配置

  2. server.port=8081

  3. ## 项目访问路径配置

  4. server.context-path=/bootTest

  5. ## Dubbo 应用名称

  6. spring.dubbo.application.name=provider

  7. ##Dubbo 注册中心地址

  8. spring.dubbo.registry.address=zookeeper://127.0.0.1:71

  9. ##Dubbo 协议名称

  10. spring.dubbo.protocol.name=dubbo

  11. ##Dubbo 协议端口

  12. spring.dubbo.protocol.port=20880

  13. ## Dubbo 服务类包目录(service所在包的地址,这个千万不要配置错误)

  14. spring.dubbo.scan=dys.boot.test.service

接下来还是写功能代码主要有:接口,接口实现类,实体类,项目启动类

1实体类:

 
  1. package dys.boot.test.entity;

  2. import java.io.Serializable;

  3. /**

  4. * 返回结果实体类

  5. * @author dys

  6. *

  7. */

  8. public class ResultInfo implements Serializable{

  9. private static final long serialVersionUID = -1L;

  10. private String resultInfo;

  11.  
  12. public ResultInfo(String resultInfo) {

  13. super();

  14. this.resultInfo = resultInfo;

  15. }

  16.  
  17. public ResultInfo() {

  18. super();

  19. }

  20.  
  21. public String getResultInfo() {

  22. return resultInfo;

  23. }

  24.  
  25. public void setResultInfo(String resultInfo) {

  26. this.resultInfo = resultInfo;

  27. };

  28.  
  29. }

2.接口:

 
  1. package dys.boot.test.service;

  2. /**

  3. * RPC调用接口

  4. * @author dys

  5. *

  6. */

  7.  
  8. import dys.boot.test.entity.ResultInfo;

  9.  
  10. public interface RPCInterface {

  11. /**

  12. * 通过Dubbo实现远程RPC调用接口信息

  13. * @return

  14. */

  15. public ResultInfo getRPCInfo();

  16. }

3.接口实现类:

 
  1. package dys.boot.test.service.impl;

  2. import com.alibaba.dubbo.config.annotation.Service;

  3. import dys.boot.test.entity.ResultInfo;

  4. import dys.boot.test.service.RPCInterface;

  5. /**

  6. * RPC接口的实现类

  7. * @author dys

  8. */

  9. //注册为 Dubbo 服务

  10. @Service()

  11. public class RPCInterfaceImpl implements RPCInterface {

  12. @Override

  13. public ResultInfo getRPCInfo() {

  14. ResultInfo resultInfo=new ResultInfo("RPC的返回信息");

  15. return resultInfo;

  16. }

  17. }

4.项目启动类:

 
  1. package dys.boot.test;

  2. import org.springframework.boot.SpringApplication;

  3. import org.springframework.boot.autoconfigure.SpringBootApplication;

  4. @SpringBootApplication

  5. public class SpringBootTest2Application {

  6. public static void main(String[] args) {

  7. SpringApplication.run(SpringBootTest2Application.class, args);

  8. }

 

小结:泛化调用可以方便用户对dubbo服务消费者端的扩展,可以方便,丰富了服务消费者的调用方式,甚至可以做变相的Rest调用,这些都是可以的,不过,它的缺点也是很明显的,参数传递复杂不方便使用。但是这种方式是不能缺失的.

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值