1、Dubbo是什么
1、RPC是什么
Remote Procedure Call,远程过程调用(服务器间调用),是一种进程间的通信方式,是一种技术的思想而不是规范。允许程序调用另一个地址空间的函数或过程。实质上是利用http协议,完成参数、方法名的传递并获得返回值,以此达到远程调用的目的。
原理说明:
具体的执行过程:
2、Dubbo
Dubbo是一款高性能java RPC 框架,可以做:面向接口的高性能RPC调用、智能负载均衡(当多个服务器都有相同业务时进行选择)、支持注册中心服务、高可扩、运行器流量调度、灰度发布、可视化的运维和治理
Dubbo的设计架构:
3、ZooKeeper
充当注册中心的角色,provider在ZooKeeper中注册,consumer去注册中心订阅
ZooKeeper安装
官网下载压缩包解压;
在bin目录下执行zkServer.cmd
;如执行失败,在conf目录下拷贝一份zoo_sample.cfg并重命名为zoo.cfg(在zoo.cfg中配置ZooKeeper数据存放位置);
再次执行zkServer.cmd
成功后在另一个窗口中执行zkCli.cmd
,运行成功后可执行指令
注:两个cmd窗口同时存在
4、需要的安装包
链接:https://pan.baidu.com/s/1Gv2zw4BUNZbFBaPDfJD3HQ
提取码:0707
monitor页面安装
zookeeper按上述步骤解压安装即可,dubbo的monitor安装给的是jar包直接通过java -jar dubbo-admin-0.0.1SNAPSHOT.jar
运行,访问localhost:7001即可进入monitor页面
2、Dubbo整合SpringBoot
示例:创建两个SpringBoot项目(provider、consumer)、一个maven项目(common-component抽取出公共类和接口,具体见这篇文章https://www.cnblogs.com/Gw-CodingWorld/p/16615443.html,通过dependency引入两个项目中),每个项目中内嵌tomcat服务器,在这两个项目间进行服务的调用,即两个服务器间的服务调用
1、引入starter
<!-- https://mvnrepository.com/artifact/com.alibaba.boot/dubbo-spring-boot-starter -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.12.0</version>
</dependency>
2、进行配置
dubbo:
application:
name: dubbo-service-provider
registry:
protocol: zookeeper
address: 127.0.0.1:2181
protocol:
name: dubbo
port: 20880
monitor:
protocol: registry
server:
port: 8080 #注意两个项目端口号不一样,否则在电脑上不能同时运行
3、项目结构说明
common-component
特别说明:抽取的公共类中的实体类需要序列化,即对下例中的User实现Serializable接口
抽取的公共类,加入至本地maven仓库的方法见https://www.cnblogs.com/Gw-CodingWorld/p/16615443.html
<!--抽取出来的公共类在两个SpringBoot项目中依赖引用-->
<dependency>
<groupId>com.common</groupId>
<artifactId>common-component</artifactId>
<version>0.0.1</version>
</dependency>
SpingBoot启动类
两个项目都要开启@EnableDubbo
package com.gw;
import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@EnableDubbo
@SpringBootApplication
public class DubboProviderApplication {
public static void main(String[] args) {
SpringApplication.run(DubboProviderApplication.class, args);
}
}
provider
在provider项目中实现公用的UserService接口,注意@Service为Dubbo包中的注解,使服务暴露在Dubbo中,即在注册中心进行注册,其他服务器可以使用@Reference来引用该类
package com.gw.service;
import com.alibaba.dubbo.config.annotation.Service;
import org.springframework.stereotype.Component;
import pojo.User;
import service.UserService;
import java.util.List;
@Service
@Component
public class UserServiceImpl implements UserService {
@Override
public List<User> queryUser() {
List<User> list= null;
list.add(new User("zhangsan","123456","1"));
list.add(new User("zhangsan","123456","1"));
list.add(new User("zhangsan","123456","1"));
list.add(new User("zhangsan","123456","1"));
return list;
}
}
consumer
在consumer项目中调用provider服务器中实现的UserService
package com.gw.controller;
import com.alibaba.dubbo.config.annotation.Reference;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import pojo.User;
import service.UserService;
import java.util.List;
@Controller
public class test {
@Reference //引用暴露出来的服务
UserService userService;
@RequestMapping("/hello")
@ResponseBody
List<User> testDubbo(){
List<User> list = userService.queryUser();
return list;
}
}
3、可能出现的问题
- Invalid File Path ---> 将data目录中的记录删除或者在zoo.cfg文件中重新设置一个dataDir,重新启动zookeeper
- 注意,项目必须要先启动provider后启动consumer
- 小技巧,启动zookeeper后先启动dubbo的monitor(localhost:7001)页面,通过该页面来判断是否注册到zookeeper中,如已注册则说明java程序有问题
- java程序有问题了先检查pojo实体类是否序列化,再检查dao、service、controller
- 依赖要引入starter和curator
- java.io.IOException: Can not lock the registry cache file D:\home.dubbu\runtime.cache, ignore and retry later, maybe multi java process use the file, please config: dubbo.registry.file=xxx.properties ---> 在provider中设置registry.file= ${catalina.home}/dubbo-registry/dubbo-registry.properties