1. 分布式?
可以将一个系统的各个模块分离出来, 单独部署。若是某个服务访问量大的话,可以多部署在多台机器上。
2. 如何进行模块之间访问
需要远程调用(RPC), 模块需要将自己注册进注册中心,使得其他模块可以调用。
3.Zookeeper与Dubbo
解释:Zookeeper就是注册中心,Dubbo是RPC,下面是Dubbo的结构
Container是dubbo的服务容器,启动的时候会顺便启动Provider(服务提供者),provider会注册进注册中心,其中注册中心会检测服务的变更,notify(提醒)Consumer,Consumer通过订阅Registry,了解各服务,调用需要的服务。期间,调用次数会传给监控器。
4. Zookeeper与dubbo使用
4.1 安装zookeeper
docker run --name zk01 -p 2181:2181 --restart always -d zookeeper
4.2 下载测试项目,导入idea打包,运行。并在浏览器查看界面
4.3 新建两个项目,一个服务提供,一个服务调用
4.4 配置Denpendences, 服务名,zookeeper地址等
- pom.xml
1 | <!-- https://mvnrepository.com/artifact/org.apache.dubbo/dubbo-spring-boot-starter --> |
服务提供方
1
2
3
4
58002 =
ticket-consumer =
zookeeper://lqk.com:2181 =
- 服务消费方
1 | 8001 = |
4.5 具体代码
TicketConsumer
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15package com.teskinfly.ticketconsumer.service;
import com.teskinfly.service.TicketService;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.stereotype.Service;
public class TicketConsumer {
TicketService ticketService;
public void buy() {
String ticket = ticketService.getTicket();
System.out.println("拿到"+ticket);
}
}
TicketServiceImp
1
2
3
4
5
6
7
8
9
10
11
12
13package com.teskinfly.ticketprovider.service;
import com.teskinfly.service.TicketService;
import org.apache.dubbo.config.annotation.Service;
import org.springframework.stereotype.Component;
public class TicketServiceImp implements TicketService {
public String getTicket() {
return "夏洛克福尔摩斯";
}
}4.6 运行测试
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17package com.teskinfly.ticketconsumer;
import com.teskinfly.ticketconsumer.service.TicketConsumer;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
public class TicketConsumerApplicationTests {
TicketConsumer ticketConsumer;
public void contextLoads() {
ticketConsumer.buy();
}
}结果截图
注意不要混用@Service注解,@Reference是消费端的调用,服务接口放置的位置,消费端与服务端保持一致。
5. 微服务
分布式:一个业务拆分为多个子业务,并部署于不同机器中
集群:一个业务部署于多个机器中
微服务:模块拆分成一个独立的服务单元通过接口来实现数据的交互。 包含分布式,可以将子业务部署与一个机器中。
6. 微服务架构问题
6.1 问题
- 服务的访问问题
- 服务间的通信问题
- 如何治理
- 服务挂了怎么办
6.2 解决方案(分点对应上面的问题):
Spring Cloud Netflix(2018,停止维护)一站式解决方案
1.1 Api网关,zuul组件
1.2 Feign, Ribbon
1.3 服务注册与发现Eureka
1.4 熔断机制,hystrix
Apache Dubbo zookeeper
2.1 没有
2.2 Dubbo
2.3 Zookeeper
2.4 没有
SpringCloud Alibaba 一站式解决方案
6.3 展望
下一代微服务标准,Server Mesh(代表解决方案istio)