SpringBoot框架学习(十三)——分布式简介
文章目录
十七、SpringBoot与分布式
Dubbo与Zookeeper:
1.分布式应用
在分布式系统中,国内常用zookeeper+dubbo组合,而Spring Boot推荐使用全栈的Spring,Spring Boot+Spring Cloud。
2.Zookeeper和Dubbo
-
Zookeeper
ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。 -
Dubbo
Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合)。从服务模型的角度来看,Dubbo采用的是一种非常简单的模型,要么是提供方提供服务,要么是消费方消费服务,所以基于这一点可以抽象出服务提供方(Provider)和服务消费方(Consumer)两个角色。
3.搭建环境(Docker)
- Zookeeper
[[email protected] ~]# docker search zookeeper
INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED
docker.io docker.io/zookeeper Apache ZooKeeper is an open-source server ... 614 [OK]
docker.io docker.io/jplock/zookeeper Builds a docker image for Zookeeper versio... 162 [OK]
docker.io docker.io/wurstmeister/zookeeper 76 [OK]
docker.io docker.io/mesoscloud/zookeeper ZooKeeper 73 [OK]
docker.io docker.io/confluentinc/cp-zookeeper Official Confluent Docker Image for Zookeeper 44
docker.io docker.io/mbabineau/zookeeper-exhibitor 24 [OK]
docker.io docker.io/digitalwonderland/zookeeper Latest Zookeeper - clusterable 19 [OK]
docker.io docker.io/confluent/zookeeper 13 [OK]
docker.io docker.io/hyperledger/fabric-zookeeper Fabric Zookeeper docker image for Hyperled... 13
docker.io docker.io/bitnami/zookeeper ZooKeeper is a centralized service for dis... 12 [OK]
docker.io docker.io/debezium/zookeeper Zookeeper image required when running the ... 8 [OK]
docker.io docker.io/31z4/zookeeper Dockerized Apache Zookeeper. 6 [OK]
docker.io docker.io/springxd/zookeeper A Docker image that can run a ZooKeeper se... 6 [OK]
docker.io docker.io/thefactory/zookeeper-exhibitor Exhibitor-managed ZooKeeper with S3 backup... 5 [OK]
docker.io docker.io/eventuateio/eventuateio-local-zookeeper Zookeeper suitable for dev/test 2 [OK]
docker.io docker.io/duffqiu/zookeeper-cli 1 [OK]
docker.io docker.io/emccorp/zookeeper Zookeeper 1
docker.io docker.io/openshift/zookeeper-346-fedora20 ZooKeeper 3.4.6 with replication support 1
docker.io docker.io/paulbrown/zookeeper Zookeeper on Kubernetes (PetSet) 1 [OK]
docker.io docker.io/avvo/zookeeper Apache Zookeeper 0 [OK]
docker.io docker.io/jamiecressey89/marathon-zookeeper Zookeeper image that uses Marathon's API f... 0 [OK]
docker.io docker.io/josdotso/zookeeper-exporter ref: https://github.com/carlpett/zookeeper... 0 [OK]
docker.io docker.io/midonet/zookeeper Dockerfile for a Zookeeper server. 0 [OK]
docker.io docker.io/phenompeople/zookeeper Apache ZooKeeper is an open-source server ... 0 [OK]
docker.io docker.io/strimzi/zookeeper 0
[[email protected] ~]# docker pull docker.io/zookeeper
Using default tag: latest
Trying to pull repository docker.io/library/zookeeper ...
latest: Pulling from docker.io/library/zookeeper
8e402f1a9c57: Pull complete
4866c822999c: Pull complete
cf419f3f41ff: Pull complete
88430b15d43f: Pull complete
d5a9723280f1: Pull complete
c43110341cd8: Pull complete
9ec9c92edf13: Pull complete
cdf8329cd90a: Pull complete
Digest: sha256:8832a49f7ee6399c608e9a666e294adeaef0e4b1bc540c60ac75b8ec4b41f572
Status: Downloaded newer image for docker.io/zookeeper:latest
[[email protected] ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/rabbitmq 3-management 20c898989d5c 4 days ago 213 MB
docker.io/tomcat latest 02eaee4dc65c 6 days ago 463 MB
docker.io/zookeeper latest 4ebfb9474e72 6 days ago 150 MB
docker.io/redis latest a55fbf438dfd 7 days ago 95 MB
docker.io/mysql latest 7bb2586065cd 7 days ago 477 MB
registry.docker-cn.com/library/elasticsearch latest 5acf0e8da90b 6 months ago 486 MB
registry.docker-cn.com/library/elasticsearch 2.4.6 5e9d896dc62c 6 months ago 479 MB
[[email protected] ~]# docker run --name zk01 -p 2181:2181 --restart always -d 4ebfb9474e72
2b423b6cf6f11d128cf8f2de66c46066982e7d255550573cd2bc6f85a804ec2f
[[email protected] ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2b423b6cf6f1 4ebfb9474e72 "/docker-entrypoin..." 4 seconds ago Up 2 seconds 2888/tcp, 0.0.0.0:2181->2181/tcp, 3888/tcp zk01
- Dubbo
然后依次创建项目,为了实现Dubbo的中间件效果,所以我们创建两个Module,接下来我们将会在client端调用到Server端的方法。
4.实现Dubbo的RPC服务
<1>配置服务端的dubbo与zk的依赖并注册地址
首先配置好服务端dubbo的maven环境
<!-- 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.0</version>
</dependency>
然后引入zookeeper的客户端工具
<!-- https://mvnrepository.com/artifact/com.github.sgroschupf/zkclient -->
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
然后再properties文件中对我们两个Module的连接进行基本的配置
server.port=8781
dubbo.application.name=dubbo-Server
dubbo.registry.address=zookeeper://192.168.243.30:2181
dubbo.scan.base-packages=springboot.dubbo.service
<2>使用@Service发布服务
@Component
@Service
public class TicketServiceImpl implements ticketServer{
@Override
public String getTicker() {
return "《SBZZ》";
}
}
然后按照我们上面写的发布地址将服务发布出去。
<3>配置客户端的dubbo和zk依赖并注册地址
也是先导入dubbo和zk的相关依赖
<!-- 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.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.github.sgroschupf/zkclient -->
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
然后进行注册
server.port=8782
dubbo.application.name=dubbo-client
dubbo.registry.address=zookeeper://192.168.243.30:2181
<4>将服务端的接口复制到客户端
然后直接调用复制过来的接口。
@Service
public class UserService {
@Reference
ticketServer ticketServer;
}
然后写一个测试程序
一定要将之前服务端的程序一直启动,不然会报错
@RunWith(SpringRunner.class)
@SpringBootTest
public class DubboClientApplicationTests {
@Autowired
UserService userService;
@Test
public void contextLoads() {
userService.hello();
}
}