一.架构的演进
1.什么是分布式系统:
分布式系统(distributed system)是建立在网络之上的软件系统。正是因为软件的特性,所以分布式系统具有高度的内聚性和透明性。因此,网络和分布式系统之间的区别更多的在于高层软件(特别是操作系统),而不是硬件。
基于多台计算机上的多个服务,来提供某一个完整的业务功能
2.架构的演进
单体架构 -> 垂直架构 -> 分布式架构 -> 流式架构
3.常见的RPC框架
1.dubbo 阿里在2011对外开源,后贡献给apache,并在GitHub上维护
2.HSF 阿里正在使用的框架
3.GRPC 谷歌的rpc框架
4.swift Facebook的框架
。。。
二.Dubbo的介绍
1.Dubbo的体系结构
Provider:生产者(提供者)
Consumer:消费者
Registry:注册中心
Monitor:监控中心
init:
0.生产者启动
1.将生产者的信息注册到注册中心
2.消费者启动,并去注册中心订阅指定服务
async:
3.注册中心将订阅的提供者信息告诉消费者
sync:
4.消费者直接调用生产者
async:
5.将调用服务的信息保存到监控中心
2.RPC的原理
三.Dubbo的快速入门
1.下载并安装zookeeper
zookeeper是一个服务治理的中间件,原本是大数据Hadoop中的一个组件
https://downloads.apache.org/zookeeper/zookeeper-3.4.14/
解压:
tar -zxvg zookeeper-3.4.14.tar.gz -C /usr/local
修改名字 为 zookeeper
修改配置文件
cd /usr/local/zookeeper/conf/
cp zoo_sample.cfg zoo.cfg
修改zoo.cfg
dataDir=/usr/local/zookeeper/data/
clientPort=2181
启动zookeeper:
cd /usr/local/zookeeper/bin/
./zkServer.sh start
测试:
./zkCli.sh
2.下载Monitor监控中心
1.github.com/apache/dubbo-admin/tree/master
2.git clone github.com/apache/dubbo-admin/tree/master
3.修改dubb-admin-server中的properties文件
#修改如下配置改成注册中心也就是上面的端口号
admin.registry.address=zookeeper://114.55.219.117:2181
4.采用mvn的方式,给dubbo-admin打包(dubbo-admin/dubbo-admin-server目录打开cmd)
5.使用java -jar 启动项目
6.默认占用了7001端口
7.localhost:7001
8.默认的用户名和密码都是root
3.编写生产者代码
1.创建项目
2.导入依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.6.2</version>
</dependency>
<!-- 链接zookeeper-->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>2.12.0</version>
</dependency>
3.编写service接口和实现类
public interface DemoService {
String sayHello(String name);
}
public class DemoServiceImpl implements DemoService {
public String sayHello(String name) {
return "hello"+name;
}
}
4.编写配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
<!-- 1.给服务起个名-->
<dubbo:application name="dubbo-provider"/>
<!-- 2.将zookeeper路径指定-->
<dubbo:registry address="zookeeper://114.55.219.117:2181"/>
<!-- 3.指定建立socket链接的端口号-->
<dubbo:protocol name="dubbo" port="20880"/>
<!-- 4.对外服务提供-->
<dubbo:service interface="com.qf.service.DemoService" ref="demoService"/>
<!-- 5.将DemoServiceImpl配置到spring容器中去-->
<bean id="demoService" class="com.qf.service.impl.DemoServiceImpl"></bean>
</beans>
5.使用classpathxml加载配置文件启动
public class DubboProviderApplication {
public static void main(String[] args) throws IOException {
ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("classpath:application-dubbo.xml");
ac.start();
System.in.read();
}
}
4.编写消费者代码
1.创建项目
2.导入依赖(同上)
3.编写service接口和controller
public interface DemoService {
String sayHello(String name);
}
public class DemoController {
private DemoService demoService;
public void setDemoService(DemoService demoService) {
this.demoService = demoService;
}
public void sayHello(String name){
System.out.println(demoService.sayHello(name));
}
}
4.编写配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<!--取名-->
<dubbo:application name="dubbo-consumer"/>
<!--zookeeper地址-->
<dubbo:registry address="zookeeper://114.55.219.117:2181"/>
<!--生成远程服务代理,和生产者的service包名一致-->
<dubbo:reference interface="com.qf.service.DemoService" id="demoService"/>
<!--将controller交给spring去管理-->
<bean class="com.qf.controller.DemoController" id="demoController">
<property name="demoService" ref="demoService"/>
</bean>
</beans>
5.使用classpathxml加载配置文件启动
public class DemoConsumerApplication {
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:application-dubbo.xml");
context.start();
DemoController demoController = context.getBean(DemoController.class);
demoController.sayHello("张三");
}
}
6.调用指定方法测试
这里可以将两个项目中公共的api抽取出来放在另一个项目中,其他项目使用只需导入依赖即可
四.SpringBoot整合Dubbo
1.创建项目
1.dubbo-springboot-api -> maven项目
2.dubbo-springboot-provider -> springboot项目
3.dubbo-springboot-consumer -> springboot项目
2.导入依赖
<!--和dubbo2.6兼容-->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>
3.配置生产者
1.服务的名称
2.zookeeper的地址
3.socket通讯协议和端口
4.对外提供的服务
在实现类上添加注解 @service(dubbo中的注解)
5.在启动类上添加注解 @EnableDubbo
application.yml
server:
port: 8080
dubbo:
#服务名称
application:
name: dubbo-springboot-provider
registry:
#zookeeper地址
address: zookeeper://114.55.219.117:2181
protocol:
#socket的协议和端口
name: dubbo
port:
实现类:
@Service
public class DemoServiceImpl implements DemoService {
@Override
public String sayHaHaHa() {
return "哈哈哈哈哈哈哈哈哈额";
}
}
4.配置消费者:
application.yml
dubbo:
application:
name: dubbo-springboot-consumer
registry:
address: zookeeper://114.55.219.117:2181
#修改端口,防止冲突
server:
port: 80
controller
@RequestMapping("/demo")
public class DemoController {
@Reference
private DemoService demoService;
@GetMapping(value = "/hhh",produces = "text/html;charset-utf-8")
public String hhh(){
String str = demoService.sayHaHaHa();
return str;
}
}