文章目录
十七、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、搭建环境
Zookeeper
[root@localhost ~]# docker pull docker.io/zookeeper
[root@localhost ~]# docker run --name ZK01 -p 2181:2181 --restart always -d 4ebfb9474e72
2b423b6cf6f11d128cf8f2de66c46066982e7d255550573cd2bc6f85a804ec2f
Dubbo
依次创建项目,为了实现Dubbo中间件效果,创建两个Module,接下来我们会在Client端调用到Server端的方法。
4、实现Dubbo的RPC功能
<1>、配置服务端的Dubbo和Zookeeper依赖并注册地址
服务端导入Dubbo相关的依赖
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.1.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>
在application.properties对俩个模块连接进行配置
dubbo.application.name=provider-ticket
dubbo.registry.address=zookeeper://192.168.3.158:2181
dubbo.scan.base-packages=com.example.ticket.service
<2>、使用@Service将服务发布出去
import com.alibaba.dubbo.config.annotation.Service;
import org.springframework.stereotype.Controller;
@Controller
@Service //将服务发布出去
public class TicketServiceImpl implements TicketService {
@Override
public String getTicket() {
return "复仇者联盟四";
}
}
按照上面写的地址将任务发布出去。
<3>、配置客户端的Dubbo和Zookeeper依赖并注册地址
导入Dubbo的相关依赖和Zookeeper客户端工具
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.1.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>
注册服务
dubbo.application.name=consumer-user
dubbo.registry.address=zookeeper://192.168.3.158:2181
<4>、服务端的接口复制到客户端
可以直接调用复制来的接口
import com.alibaba.dubbo.config.annotation.Reference;
import com.example.ticket.service.TicketService;
import org.springframework.stereotype.Service;
@Service
public class UserService {
@Reference
TicketService ticketService;
public void hello(){
String ticket = ticketService.getTicket();
System.out.println("-----"+ticket);
}
}
编写一个测试类
注意一定要将服务端的程序一直启动
import com.example.user.service.UserService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
public class ConsumerUserApplicationTests {
@Autowired
UserService userService;
@Test
public void contextLoads() {
userService.hello();
}
}