目录
一,背景及准备:
什么是分布式系统???在《分布式系统原理与范型》一书中有如下定义:“分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像单个相关系统”。这是最简洁明了的解释。
分布式系统是由一组通过网络进行通信、为了完成共同的任务而协调工作的计算机节点组成的系统。分布式系统的出现是为了用廉价的、普通的机器完成单个计算机无法完成的计算、存储任务。其目的是利用更多的机器,处理更多的数据。
分布式系统(distributed system)是建立在网络之上的软件系统。
首先需要明确的是,只有当单个节点的处理能力无法满足日益增长的计算、存储任务的时候,且硬件的提升(加内存、加磁盘、使用更好的CPU)高昂到得不偿失的时候,应用程序也不能进一步优化的时候,我们才需要考虑分布式系统。因为,分布式系统要解决的问题本身就是和单机系统一样的,而由于分布式系统多节点、通过网络通信的拓扑结构,会引入很多单机系统没有的问题,为了解决这些问题又会引入更多的机制、协议,带来更多的问题。。。应运而生Dubbo出现了。
1,Dubbo
下图展现的就是网站的演进过程!
2,RPC
我们还需要了解到RPC通信,Dubbo就是用的RPC通信在服务之间互相调用。
Remote Procedure Call 远程过程调用 是一种进程间通信方式,他是一种技术的思想,而不是规范。它允许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过程或函数,而不用程序员显式编码这个远程调用的细节。即程序员无论是调用本地的还是远程的函数,本质上编写的调用代码基本相同。生活上的案例,你想吃苹果,然后你去了楼下水果店买了水果,回到家洗洗吃,这就是本地调用;同样的你想吃苹果,在美团上购买了,骑手送到你手上,你洗洗吃了,这就是远程调用。RPC最核心的两个部分,通讯,序列化。
推荐阅读文章:https://www.jianshu.com/p/2accc2840a1b
3,dubbo和zookeeper的安装
注意点:
1)在安装zk的时候注意zk的配置文件
a,修改zoo.cfg配置文件
b,将conf文件夹下面的zoo_sample.cfg复制一份改名为zoo.cfg即可。
c,注意几个重要位置:
4,dataDir=./ 临时数据存储的目录(可写相对路径)
5,clientPort=2181 zookeeper的端口号
6,修改完成后再次启动zookeeper
2)GitHub - apache/dubbo-admin at master 下载dubbo-admin,有可视化页面
a,进入dubbo-admin\src\main\resources \application.properties配置文件 指定zookeeper地址
server.port=7001
spring.velocity.cache=false
spring.velocity.charset=UTF-8
spring.velocity.layout-url=/templates/default.vm
spring.messages.fallback-to-system-locale=false
spring.messages.basename=i18n/message
spring.root.password=root
spring.guest.password=guest
dubbo.registry.address=zookeeper://127.0.0.1:2181
b,在项目目录下打包dubbo-admin
打包命令 mvn clean package -Dmaven.test.skip=true
c,打包成功后去dubbo-admin的target目录下会有一个jar的可执行文件
使用java -jar dubbo-admin-0.0.1-SNAPSHOT.jar执行。
d,访问localhost:7001 ,7001是默认的端口,可以在配置文件中修改的
对于分布式的原理理解,很粗线,很表面,还需要更多的联系,应用。
二,demo应用
1,新建两个module一个服务提供者,一个服务消费者
2,在provide中准备服务
买票接口:
public interface TicketService {
public String getTicket();
}
接口的实现:
public class TicketServiceImpl implements TicketService {
@Override
public String getTicket() {
return "im ticket to Lion go home";
}
}
服务的提供者模型大致就这样。返回一个字符串。
3,既然服务提供者有了,那么就需要一个消费者来消费这个服务(就是调用这个服务,不然这个提供者就失去了意义)
在consumer-server中准备服务调用提供者
public class UserService {
public void buyTicket(){
//去拿票(调用提供者返回的字符串)
}
}
现在出现问题了,我consumer怎么取拿到provider的服务呢?需要一个中间商zookeeper来从中调节。zookeeper是注册中心,用来管理服务的,我们只需要将provider给的服务注册到zookpeer中,然后consumer去zookpeer中去拿,就可以了
4,将provider注册到服务中心去。
a,引包
<!-- Dubbo Spring Boot Starter -->
<!-- Dubbo整合springBoot的包-->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.3</version>
</dependency>
<!-- zookeeper的包-->
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
<!--注意引包的时候可能会产生日志依赖的冲突-->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.12.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>2.12.0</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.14</version>
<!--排除这个slf4j-log4j12-->
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
b,在provider的配置文件中添加配置参数
#当前应用名字
dubbo.application.name=provider-server
#注册中心地址--这里用的就是本地的zk,正式环境就换到服务器上的zk,改一下地址就行
dubbo.registry.address=zookeeper://127.0.0.1:2181
#扫描指定包下服务--非常重要,写的不对则扫描不到,就无法注册到zk当中
dubbo.scan.base-packages=com.example.service
c,服务接口完善
import org.apache.dubbo.config.annotation.Service;
import org.springframework.stereotype.Component;
//注意上面引用的两个包
@Service //这不是spring的service,是dubbo的 新版的这个注解变成了@DubboServoce 便于和spring的@Service区分开
@Component //交给spring管理
public class TicketServiceImpl implements TicketService {
@Override
public String getTicket() {
return "im ticket to Lion go home";
}
}
以上,在provider-server启动的时候,服务就会被注册到zk,是以接口名注册的。
可以查看服务的所有信息
服务提供者完善。
5,consumer-server注册到zk中
a,引包,和provider-server一样。
需要多增加一个依赖,巨坑
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-x-discovery</artifactId>
<version>2.12.0</version>
</dependency>
少了这个依赖就会报错org/apache/curator/x/discovery/ServiceDiscoveryBuilder巨坑
b,修改参数
#当前应用名字
dubbo.application.name=consumer-server
#注册中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
c,请求完善
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.stereotype.Service;
@Service//放到容器中 是spring的@Server
public class UserService {
//这里要获得票,那么必须去注册中心拿
@DubboReference
TicketService ts;//两种方式Pom坐标可以定义路径相同的接口名(在pom文件中引入),或者定义相同路径的接口
public void buTicket(){
System.out.println(ts.getTicket());
}
}
以上,完善consumer-server,会被注册到zk中去。
可以在dubbo-admin中看见服务的信息,和provider一样。
d,测试
@SpringBootTest
class ConsumerServerApplicationTests {
@Autowired
UserService userService;
@Test
void contextLoads() {
userService.buTicket();
}
}
纯属个人学习记录之后。有错请指正。