Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合)。从服务模型的角度来看,Dubbo采用的是一种非常简单的模型,要么是提供方提供服务,要么是消费方消费服务,所以基于这一点可以抽象出服务提供方(Provider)和服务消费方(Consumer)两个角色。
Dubbo 的RPC 调用流程主要涉及到4个模块:
1、Registry:服务注册,我们一般会采取Zookeeper 作为我们的注册中心
2、Provider:服务提供者(生产者),提供具体的服务实现
3、Consumer:消费者,从注册中心中订阅服务
4、Monitor:监控中心,RPC调用次数和调用时间监控
从上图中我们可以看出RPC 服务调用的过程主要为:
1、生产者发布服务到服务注册中心
2、消费者在服务注册中心中订阅服务
3、消费者调用已注册的服务
下面讲解在idea环境下实现springboot与dubbo整合
一、下载zookeeper和ZooInspector
通过百度网盘下载
1、zookeeper
链接:https://pan.baidu.com/s/1wCYHiKVNbbC2zCaLbYkdIQ
提取码:8gsjzookeeper下载成功后进行解压,新建zoo.cfg文件
zoo.cfg文件内容:
圈出来的两个地方需要修改成自己的文件目录,这两个文件夹需要自己新建,在根目录新建:
启动zookeeper方法:双击zkServer.cmd,即可启动zookeeper
2、ZooInspector链接:https://pan.baidu.com/s/1SBjlfrEr4_rTfTeS37nrDA
提取码:1ddj下载后解压
在build目录下打开cmd
输入上面命令即可如下界面,点击绿色运行键,即可出现connection settings框,直接点ok即可:
点击OK后进入如下界面,因为我已经实现了zookeeper整合dobbo,因此多了一个文件夹,在最开始的时候,只有zookeeper文件夹这一个文件。
下载dubbo
百度网盘下载地址:
链接:https://pan.baidu.com/s/1t5UQ-oiuE8TiAM1iJHiv0w
提取码:136j
下载后进行解压:
进入如下目录,复制我圈出来的文件,到tomcat下的webapps目录,双击startup.bat进行dubbo启动,先启动zookeeper,然后启动tomcat在浏览其中输入地址http://localhost:tomcat端口号/war的名字/ 回车,输入用户名和密码,用户名和密码均为root,这时候就会看到dubbo控制台,如下图.
下面是整个项目的结构
1、父pom文件:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!--添加SpringBoot parent支持-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.0.RELEASE</version>
</parent>
<groupId>cn.itcast.dubbo</groupId>
<artifactId>itcast-dubbo</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>itcast-dubbo-service</module>
<!-- <module>itcast-dubbo-consumer</module>-->
</modules>
<dependencies>
<!--添加SpringBoot测试-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--添加dubbo的springboot依赖-->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>
<!--添加dubbo依赖-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.6.4</version>
</dependency>
</dependencies>
<build>
<plugins>
<!--添加springboot的maven插件-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2、现在来讲解服务端代码
以下是目录结果
user类:
package cn.itcast.dubbo.itcast.dubbo.service.pojo; // 使用dubbo要求传输的对象必须实现序列化接口 public class User implements java.io.Serializable { private static final long serialVersionUID = -7341603933521593227L; private Long id; private String username; private String password; private Integer age; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } }
userservice代码:
package cn.itcast.dubbo.itcast.dubbo.service.service; import cn.itcast.dubbo.itcast.dubbo.service.pojo.User; import java.util.List; public interface UserService { /** * 查询所有的用户数据 * * @return */ List<User> queryAll(); }
userserviceimpl代码:
package cn.itcast.dubbo.itcast.dubbo.service.service.impl; import cn.itcast.dubbo.itcast.dubbo.service.pojo.User; import cn.itcast.dubbo.itcast.dubbo.service.service.UserService; import com.alibaba.dubbo.config.annotation.Service; import java.util.ArrayList; import java.util.List; @Service(version = "${dubbo.service.version}") //声明这是一个dubbo服务 public class UserServiceImpl implements UserService { /** * 实现查询,这里做模拟实现,不做具体的数据库查询 */ public List<User> queryAll() { List<User> list = new ArrayList<User>(); for (int i = 0; i < 10; i++) { User user = new User(); user.setAge(10 + i); user.setId(Long.valueOf(i + 1)); user.setPassword("123456"); user.setUsername("username_" + i); list.add(user); } System.out.println("---------Service 3------------"); return list; } }
启动类:
package cn.itcast.dubbo.itcast.dubbo.service; import org.springframework.boot.WebApplicationType; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; @SpringBootApplication /*@EnableDubboConfiguration*/ public class DubboProvider { public static void main(String[] args) { new SpringApplicationBuilder(DubboProvider.class) .web(WebApplicationType.NONE) // 非 Web 应用 .run(args); } }
消费者代码目录结构
消费者代码只进行测试
package cn.itcast.itcast.dubbo.consumer; import cn.itcast.dubbo.itcast.dubbo.service.pojo.User; import cn.itcast.dubbo.itcast.dubbo.service.service.UserService; import com.alibaba.dubbo.config.annotation.Reference; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import java.util.List; @RunWith(SpringRunner.class) @SpringBootTest public class ItcastDubboConsumerApplicationTests { @Reference(version = "1.0.0") private UserService userService; @Test public void testQueryAll(){ List<User> users = this.userService.queryAll(); for (User user : users) { System.out.println(user.getAge()); }} @Test public void contextLoads() { } }
所有代码都写好后,先启动 这个文件,后启动
,就可以看到如下图所示的信息