自从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 配置如下。
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
dataDir=/tmp/zookeeper
# the port at which the clients will connect
clientPort=70
第三步:在 bin 目录下,双击zkSever.cmd,启动 ZooKeeper
ZooKeeper安装和使用就完成了,接下来是SpringBoot如何配置Dubbo和Zookeeper了。
四:SpringBoot项目构建模块
第一步是搭建SpringBoot项目,来作为Dubbo的客户端请求服务。
首先需要在pom.xml加入相应的jar关联:
这里还需要添加log4j关联,否则项目会启动报错
接下来就是application.properties配置文件中关于Dubbo信息的配置了,配置内容如下所示:
## tomcat端口号配置
server.port=8080
## 项目访问路径配置
server.context-path=/bootTest
## Dubbo 应用名称
spring.dubbo.application.name=consumer
##Dubbo 注册中心地址
spring.dubbo.registry.address=zookeeper://127.0.0.1:70
## Dubbo 服务类包目录(service所在包的地址,这个千万不要配置错误)
spring.dubbo.scan=dys.boot.test.service
接下来就是写功能代码主要有:接口,接口实现类,实体类,控制类,项目启动类
1实体类:
package dys.boot.test.entity;
import java.io.Serializable;
/**
* 返回结果实体类
* @author dys
*
*/
public class ResultInfo implements Serializable{
private static final long serialVersionUID = -1L;
private String resultInfo;
public ResultInfo(String resultInfo) {
super();
this.resultInfo = resultInfo;
}
public ResultInfo() {
super();
}
public String getResultInfo() {
return resultInfo;
}
public void setResultInfo(String resultInfo) {
this.resultInfo = resultInfo;
};
}
2.接口:
package dys.boot.test.service;
/**
* RPC调用接口
* @author dys
*
*/
import dys.boot.test.entity.ResultInfo;
public interface RPCInterface {
/**
* 通过Dubbo实现远程RPC调用接口信息
* @return
*/
public ResultInfo getRPCInfo();
}
3.接口实现类:
package dys.boot.test.service.impl;
import org.springframework.stereotype.Component;
import com.alibaba.dubbo.config.annotation.Reference;
import dys.boot.test.entity.ResultInfo;
import dys.boot.test.service.RPCInterface;
/**
* RPC调用
* @author dys
*/
@Component
public class RPCInterfaceImpl implements RPCInterface {
@Reference()
RPCInterface rpcInterface;//调用远程接口的实现类
@Override
public ResultInfo getRPCInfo() {
ResultInfo resultInfo=rpcInterface.getRPCInfo();
return resultInfo;
}
}
4.控制类:
package dys.boot.test.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import dys.boot.test.entity.ResultInfo;
import dys.boot.test.service.RPCInterface;
/**
* 测试
* @author dys
*
*/
@Controller
public class DubboController {
@Autowired
private RPCInterface rpcInterface;
@RequestMapping("/test")
@ResponseBody
public String errorNginxTest(){
ResultInfo resultInfo=rpcInterface.getRPCInfo();
return "result:"+resultInfo.getResultInfo();
}
}
5.项目启动类:
package dys.boot.test;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringBootTest1Application {
public static void main(String[] args) {
SpringApplication.run(SpringBootTest1Application.class, args);
}
}
最后就是新建一个SpringBoot项目,来作为Dubbo的服务端用来返回请求信息。
该项目和客户端项目基本差不多也是先在pom.xml 进行maven的配置
在pom.xml加入相应的jar关联:
这里还是需要额外的添加log4j关联,否则项目会启动报错
接下来还是application.properties配置文件中关于Dubbo信息的配置了,配置内容如下所示:
## tomcat端口号配置
server.port=8081
## 项目访问路径配置
server.context-path=/bootTest
## Dubbo 应用名称
spring.dubbo.application.name=provider
##Dubbo 注册中心地址
spring.dubbo.registry.address=zookeeper://127.0.0.1:71
##Dubbo 协议名称
spring.dubbo.protocol.name=dubbo
##Dubbo 协议端口
spring.dubbo.protocol.port=20880
## Dubbo 服务类包目录(service所在包的地址,这个千万不要配置错误)
spring.dubbo.scan=dys.boot.test.service
接下来还是写功能代码主要有:接口,接口实现类,实体类,项目启动类
1实体类:
package dys.boot.test.entity;
import java.io.Serializable;
/**
* 返回结果实体类
* @author dys
*
*/
public class ResultInfo implements Serializable{
private static final long serialVersionUID = -1L;
private String resultInfo;
public ResultInfo(String resultInfo) {
super();
this.resultInfo = resultInfo;
}
public ResultInfo() {
super();
}
public String getResultInfo() {
return resultInfo;
}
public void setResultInfo(String resultInfo) {
this.resultInfo = resultInfo;
};
}
2.接口:
package dys.boot.test.service;
/**
* RPC调用接口
* @author dys
*
*/
import dys.boot.test.entity.ResultInfo;
public interface RPCInterface {
/**
* 通过Dubbo实现远程RPC调用接口信息
* @return
*/
public ResultInfo getRPCInfo();
}
3.接口实现类:
package dys.boot.test.service.impl;
import com.alibaba.dubbo.config.annotation.Service;
import dys.boot.test.entity.ResultInfo;
import dys.boot.test.service.RPCInterface;
/**
* RPC接口的实现类
* @author dys
*/
//注册为 Dubbo 服务
@Service()
public class RPCInterfaceImpl implements RPCInterface {
@Override
public ResultInfo getRPCInfo() {
ResultInfo resultInfo=new ResultInfo("RPC的返回信息");
return resultInfo;
}
}
4.项目启动类:
package dys.boot.test;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringBootTest2Application {
public static void main(String[] args) {
SpringApplication.run(SpringBootTest2Application.class, args);
}
小结:泛化调用可以方便用户对dubbo服务消费者端的扩展,可以方便,丰富了服务消费者的调用方式,甚至可以做变相的Rest调用,这些都是可以的,不过,它的缺点也是很明显的,参数传递复杂,不方便使用。但是这种方式是不能缺失的.