自从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关联:
-
<!-- Spring Boot Dubbo 依赖 -->
-
<dependency>
-
<groupId>io.dubbo.springboot</groupId>
-
<artifactId>spring-boot-starter-dubbo</artifactId>
-
<version>${dubbo-spring-boot}</version>
-
</dependency>
这里还需要添加log4j关联,否则项目会启动报错
-
<!-- https://mvnrepository.com/artifact/log4j/log4j -->
-
<dependency>
-
<groupId>log4j</groupId>
-
<artifactId>log4j</artifactId>
-
<version>1.2.14</version>
-
</dependency>
接下来就是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关联:
-
<!-- Spring Boot Dubbo 依赖 -->
-
<dependency>
-
<groupId>io.dubbo.springboot</groupId>
-
<artifactId>spring-boot-starter-dubbo</artifactId>
-
<version>${dubbo-spring-boot}</version>
-
</dependency>
这里还是需要额外的添加log4j关联,否则项目会启动报错
-
<!-- https://mvnrepository.com/artifact/log4j/log4j -->
-
<dependency>
-
<groupId>log4j</groupId>
-
<artifactId>log4j</artifactId>
-
<version>1.2.14</version>
-
</dependency>
接下来还是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调用,这些都是可以的,不过,它的缺点也是很明显的,参数传递复杂,不方便使用。但是这种方式是不能缺失的.