1.前驱技术
(1)分布式
(2)RPC
(3)SpringBoot
2.dubbo入门
(1)dubbo官网: dubbo官网
(2)工作原理图:
服务提供者(Provider) :暴露服务的服务提供方,服务提供者在启动时,向注册中心注册自己提供的服务。
服务消费者(Consumer) : 调用远程服务的服务消费方,服务消费者在启动时,向注册中心订阅自己所需的服务,服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
注册中心(Registry) :注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者.
监控中心(Monitor) :服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心
调用关系说明:
- 服务容器负责启动,加载,运行服务提供者。
- 服务提供者在启动时,向注册中心注册自己提供的服务。
- 服务消费者在启动时,向注册中心订阅自己所需的服务。
- 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
- 服务消费者,从提供者地址列表中,基于软负载均衡算法,选台提供者进行调用,如果调用失败,再选另台调用。
- 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
(3)dubbo-admin下载安装
1)首先
1)在官网下载下载地址,然后解压缩
2)使用maven命令打包(因为这是个maven项目且是springboot项目),同时记得改一下端口号,因为默认是8080,老是和tomcat冲突,我该为了7001
mvn clean package -D maven.test.skip=true
3)打包好jar包之后,使用命令运行它
4)然后访问localhost:7001就可以看到可视化界面了
(4)zookeeper环境搭建
1)下载zookeeper(一个注册中心):下载地址
2)解压后进入bin文件夹,双击运行zkServer.cmd文件,如果一闪而过,则在call的下一行加上pause查看错误原因
3)如果报错就进入conf目录下,复制一份simple-conf文件:并命名zoo.cfg
4)再次运行即可:打开客户端(zkCli.cmd),如果连接成功,则不会报错
(5)springboot+dubbo+zookeeper
1)创建新的empty project
2)在新项目下创建两个model,springboot项目模拟provider和customer
3)为provider项目导入maven依赖
<!-- https://mvnrepository.com/artifact/org.apache.dubbo/dubbo-spring-boot-starter -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.github.sgroschupf/zkclient -->
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
<!--zk服务端-->
<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>
<!-- 避免日志冲突的包-->
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
4)配置文件基本信息
#服务端口
server.port=8001
#注册这个应用的名称
dubbo.application.name=provider-server
#注册中心的ip地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
#需要注册的服务
dubbo.scan.base-packages=edu.ncu.dong.server
5)为provider项目创建自定义的服务
package edu.ncu.dong.server;
import org.apache.dubbo.config.annotation.Service;
@Service
//尽量不用Service注解,因为容易和spring的service注解搞混,用component注解也可以的
public class TicketsServiceImpl implements TicketsService{
@Override
public String soleTickets() {
return "Hello i am dong li!";
}
}
6)解释
因为这个服务有@Service注解,所以启动服务之后就会添加到注册中心,让zookeeper发现服务并添加到注册中心
7)验证
我们登录localhost:7001这个网址(就是dubbo-admin可视化页面),可以看到provider服务已经有了
8)同样地,我们为customer项目导入maven依赖(省略),并配置properties配置文件
#同理 端口号
server.port=8002
#消费者去注册中心拿取服务 需要暴露自己的名字
dubbo.application.name=customer-server
#注册中心的地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
9)编写customer项目的service类
package edu.ncu.dong.server;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.stereotype.Service;
@Service //这里要使用spring的@Service注解,因为我们想把它放入spring容器中,而不是注册中心
public class TicketService {
//在provider服务中配置服务到了注册中心,那么这里就需要去注册中心取服务
//使用@Reference注解(注意是dubbo包下的)
@Reference
TicketsService TICKETSSERVICE;
public void getTickets(){
System.out.println(TICKETSSERVICE.soleTickets());
System.out.println("拿到了ticket");
}
}
10)这里要注意@Reference注解,用于引用注册中心下的服务接口
虽然在注册中心下有provider服务,但是在customer包下并没有,有两种方法解决
1.定义与接口路径相同的接口名(包名也要和provider包相同),比如这里就从provider包下复制了TicketsService接口,注意并不需要定义实现类
编写测试类
@SpringBootTest
class CustomerApplicationTests {
@Autowired
TicketService ticketService;
@Test
void contextLoads() {
ticketService.getTickets();
}
}
在provider启动的前提下,启动customer服务,查看运行结果:得到了privider提供的String,且输出成功了