SpringBoot+Dubbo搭建微服务
文章目录
一、分布式基本知识
1.1) 架构演变
1.2)、分布式基本概念
二、RCP简介
2.1) RPC概念
2.2) RPC核心模块
三、Dubbo原理简介
3.1) Dubbo简介
3.2) 核心功能
3.3) 原理简介
四、Dubbo安装部署
4.1) Zookeeper安装
4.2) Dubbo监控平台部署
五、Dubbo例子
参考资料
一、分布式基本知识
1.1) 架构演变
先给出dubbo官方的图,图片表示了架构的演变。然后我说一下自己的理解。
应用最开始是单体应用,即一个应用包括了所有应用模块。
随后就是垂直应用架构,也就是将系统拆分为多个应用模块。
随后就是RPC架构,之前的垂直应用架构其实可以说是在一个进程内的通讯,而RPC就是一种进步,RPC是进程之间的通讯,远程过程调用就是这么来的。
有了RPC之后,虽然可以实现进程之间的通讯,但是服务器集群后的服务器资源利用有些时候容易造成浪费,比如有个系统,一般情况都是不能很好地预估需要分配多少机器的,很容易造成一种情况就是业务访问很频繁的模块分配了不足的机器,而访问不是很频繁的模块分配了太多的机器,这种情况就不能实现资源的很好利用,所以针对这种情况就有了SOA(Service Oriented Architecture)的出现,SOA其实就是一个服务注册中心,可以实现资源调度,合理地分配资源,提高资源调度,是一个治理中心。
1.2)、分布式基本概念
所以我们了解了架构演变之后,就可以更好的理解分布式,分布式其实就是一种可以实现不同进程之间通讯的架构,然后进程之间怎么通讯的?一般都是通过RPC框架实现。比如Java方面的,Dubbo框架或者Spring Cloud。
二、RCP简介
2.1) RPC概念
RPC:全称远程过程调用,是一种进程间的通信的方式,它所做的事情就是实现进程内的通信,允许调用另外一个地址空间,可以是共享网络里的另外一台机器。
2.2) RPC核心模块
RPC有两个核心模块:通信和序列化
三、Dubbo原理简介
3.1) Dubbo简介
Dubbo是阿里巴巴开源的一款Java RPC框架,现在已经捐赠给Apache
官网:http://dubbo.apache.org/
3.2) 核心功能
a、智能容错和负载均衡
b、服务注册和发现
c、面向接口的远程方法调用
3.3) 原理简介
上图是Dubbo官方的图
角色
Provider:暴露服务的服务提供者
Container:服务运行的容器
Consumer:调用远程服务的消费者
Registry:服务注册和发现的注册中心
Minitor:统计服务调用次数和时间的监控中心
调用
下面根据我的理解说明一下
0:服务器容器负责启动、加载、运行服务提供者
1:服务提供者在启动后就可以向注册中心暴露服务
2:服务消费者在启动后就可以向注册中心订阅想要的服务
3:注册中心向服务消费者返回服务调用列表
4:服务消费者基于软负载均衡算法调用服务提供者的服务,这个服务提供者有可能是一个服务提供者列表,调用那个服务提供者就是根据负载均衡来调用了
5:服务提供者和服务消费者定时将保存在内存中的服务调用次数和服务调用时间推送给监控中心
四、Dubbo安装部署
4.1) Zookeeper安装
因为没有实践过linux系统的安装,所以本博客只介绍window系统的安装,当然linux安装dubbo环境也不会难。Dubbo的注册中心实现有很多种,比如Redis、Multicast等等,不过官方推荐的还是Zookeeper,所以本博客选Zookeeper注册中心搭建进行介绍。
下载Zookeeper
https://archive.apache.org/dist/zookeeper/
ps:先下载Zookeeper,因为3.5.X的都是公测版或者内测版,所以有可能不太稳定,不建议下载。
修改配置文件
解压下载好的Zookeeper压缩文件,zookeeper-3.4.13的配置文件在conf文件夹下面,可以看到里面有个zoo_sample.cfg的文件,我们需要修改文件名称,不然会出现文件找不到,将文件名称改为zoo.cfg
这里主要改一下Zookeeper临时文件夹,默认是linux系统的tmp/zookeeper,我修改后的配置如下:
# 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.
# do not use /tmp for storage, /tmp here is just
# example sakes.
# Linux系统下的临时目录
# dataDir=/tmp/zookeeper
dataDir=../tmp/zookeeper
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
启动Zookeeper
在bin目录下面,有个zkServer.cmd文件,这是Zookeeper服务端启动的文件,点击启动
zkCli.cmd是客户端启动文件,我们点击启动,Zookeeper是一个树形目录结构的
### get根目录
[zk: localhost:2181(CONNECTED) 1] get /
cZxid = 0x0
ctime = Thu Jan 01 08:00:00 CST 1970
mZxid = 0x0
mtime = Thu Jan 01 08:00:00 CST 1970
pZxid = 0x0
cversion = -1
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 1
### 看一下根目录下面有什么,默认有Zookeeper这个目录
[zk: localhost:2181(CONNECTED) 2] ls /
[zookeeper]
### 在根目录下面创建一个taoshop的目录,并写值"mytest"
[zk: localhost:2181(CONNECTED) 3] create -e /taoshop mytest
Created /taoshop
### 查看一下,创建成功
[zk: localhost:2181(CONNECTED) 4] ls /
[taoshop, zookeeper]
### 查看一下taoshop目录下面有什么,可以看到"mytest"这个保存的值
[zk: localhost:2181(CONNECTED) 5] get /taoshop
mytest
cZxid = 0x6
ctime = Sun Nov 04 20:54:19 CST 2018
mZxid = 0x6
mtime = Sun Nov 04 20:54:19 CST 2018
pZxid = 0x6
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x1000250f2010000
dataLength = 6
numChildren = 0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
4.2) Dubbo监控平台部署
下载一下Dubbo提供的监控平台,可以先去下载master分支,有看到一个develop分支,不过感觉develop分支的还没稳定下来,根据自己需要下载,我就是下载master版本的
https://github.com/apache/incubator-dubbo-ops/tree/master
可以git clone一下https://github.com/apache/incubator-dubbo-ops.git
git clone https://github.com/apache/incubator-dubbo-ops.git
1
然后到dubbo-admin下面打包一下
incubator-dubbo-ops-master/dubbo-admin
mvn clean package
1
完成后,到该目录target下面发现一个jar,cmd运行
java -jar dubbo-admin-0.0.1-SNAPSHOT.jar
1
当然也可以写个简单的bat脚本来执行,不用每次都敲命令,创建一个startDubboAdmin.bat文件
敲上以下脚本,然后保存,下次就不用再敲命令了,不过jar文件要和bat文件放在同级目录
@echo off
java -jar dubbo-admin-0.0.1-SNAPSHOT.jar
1
2
访问Dubbo管理平台
http://localhost:7001/
输入账号密码root/root
Dubbo监控平台配置
在官方下载的incubator-dubbo-ops-master/dubbo-monitor-simple下面
使用maven命令打包一下
mvn clean package
1
然后在target文件夹下面会生成
dubbo-monitor-simple-2.0.0-assembly.tar.gz压缩文件夹,我们解压一下,然后
在dubbo-monitor-simple-2.0.0-assembly/dubbo-moitor-simple-2.0.0/assembly.bin文件夹下面可以看到start.bat文件,start.sh是linux系统的。win系统可以点击start.bat运行,运行之后访问127.0.0.1:8080,可以看到Dubbo官方提供的一个监控平台页面
五、Dubbo例子
下面简单写个例子实践一下Dubbo
Dubbo是处理分布式架构的一种很不错的RPC框架,官方文档比较齐全。
下面是Dubbo官方给的架构分包建议。ps:Dubbo现在暂不能支持分布式事务,所以服务定义的时候要设计好,尽量避免分布式事务的处理
建议将服务接口,服务模型,服务异常等均放在 API 包中,因为服务模型及异常也是 API 的一部分,同时,这样做也符合分包原则:重用发布等价原则(REP),共同重用原则(CRP)。
服务提供者实现
maven加上jar,Zookeeper注意加上去除log4j依赖,假如你项目引入其它版本的log4j的话,容易造成jar冲突
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
1
2
3
4
5
6
7
8
9
10
dubbo配置,我放在一个common工程,taoshop-common-rpc
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<dubbo.springboot.version>1.0.0</dubbo.springboot.version>
<zookeeper.version>3.4.6</zookeeper.version>
</properties>
<dependencies>
<dependency>
<groupId>io.dubbo.springboot</groupId>
<artifactId>spring-boot-starter-dubbo</artifactId>
<version>${dubbo.springboot.version}</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.12.0</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>${zookeeper.version}</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
provider工程一般是Service工程,我新建一个taoshop-provider-item订单工程
<!--API接口工程 -->
<dependency>
<groupId>com.muses.taoshop.provider-api</groupId>
<artifactId>taoshop-provider-api-item</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- 有dubbo相关jar的工程-->
<dependency>
<groupId>com.muses.taoshop.common</groupId>
<artifactId>taoshop-common-rpc</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
1
2
3
4
5
6
7
8
9
10
11
12
dubbo配置:
spring.dubbo.application.name=taoshop-provider-item
spring.dubbo.registry.protocol=zookeeper
spring.dubbo.registry.address=127.0.0.1:2181
spring.dubbo.protocol.name=dubbo
spring.dubbo.protocol.port=20880
spring.dubbo.scan=com.muses.taoshop
1
2
3
4
5
6
业务接口实现:
注意点:这里要加上dubbo提供的@Service注解,而不是spring框架提供的@Service注解
com.alibaba.dubbo.config.annotation.Service
package com.muses.taoshop.item.service;
import com.alibaba.dubbo.config.annotation.Service;
import com.muses.taoshop.item.entity.ItemDetail;
import com.muses.taoshop.item.entity.ItemPortal;
import com.muses.taoshop.item.entity.ItemSpec;
import com.muses.taoshop.item.mapper.ItemMapper;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.List;
/**
* <pre>
* 商品信息服务实现类
* </pre>
*
* @author nicky
* @version 1.00.00
* <pre>
* 修改记录
* 修改后版本: 修改人: 修改日期: 2018.06.24 22:37 修改内容:
* </pre>
*/
@Service(version = "1.0.0")
public class ItemServiceImpl implements IItemService {
@Autowired
ItemMapper itemMapper;
/**
* 在门户网站列出商品粗略信息
*
* @return
*/
@Override
public List<ItemPortal> listItemPortal() {
return itemMapper.listItemPortal();
}
/**
* 获取商品详情信息
* @return ItemDetail
*/
@Override
public ItemDetail getItemDetailInfo(int spuId){
ItemDetail itemDetail = itemMapper.getItemDetail(spuId);
return itemDetail;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
随意写个SpringBoot启动类:
package com.muses.taoshop.item;
/**
* <pre>
* 服务提供者
* </pre>
*
* @author nicky
* @version 1.00.00
* <pre>
* 修改记录
* 修改后版本: 修改人: 修改日期: 2018.11.17 23:24 修改内容:
* </pre>
*/
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ImportResource;
import java.util.concurrent.CountDownLatch;
@SpringBootApplication
//@ImportResource({"classpath:dubbo-provider.xml"})
public class ItemProviderApplication {
// private static final Logger logger = Logger.getLogger(ItemProviderApplication.class);
@Bean
public CountDownLatch closeLatch() {
return new CountDownLatch(1);
}
public static void main(String[] args) throws InterruptedException {
ApplicationContext ctx = SpringApplication.run(ItemProviderApplication.class, args);
//logger.info("项目启动!");
//CountDownLatch closeLatch = ctx.getBean(CountDownLatch.class);
//closeLatch.await();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
启动一下provider,在监控平台上可以看到启动成功的服务,服务接口暴露成功
服务消费者
Dubbo配置:
spring.dubbo.application.name=taoshop-consume-portal
spring.dubbo.registry.protocol=zookeeper
spring.dubbo.registry.address=127.0.0.1:2181
spring.dubbo.scan=com.muses.taoshop
spring.dubbo.monitor.protocol=registry
1
2
3
4
5
xml配置就是这样的
自动发现
<dubbo:monitor protocol="registry"></dubbo:monitor>
1
引用,主要是引入import com.alibaba.dubbo.config.annotation.Reference;
@Reference
IItemService iItemService;