一、分布式主要的思想:常用Dubbo/Zookeeper、而SpringBoot推荐使用全栈的Spring,SpringBoot+SpringCloud
随着互联网应用的增加,业务会越来越多,如果修改一个模块就会整个应用重新部署,比如:
RPC远程调用服务
为了解决这个问题:可以用到zookeeper+Dubbo 或者SpringBoot+SpringCloud来解决
1、先已zookeeper+Dubbo来解决
zookeeper先把订单模块注册进入,然后user模块去zk里面就找对应的订单,这样就解决了上面的问题
-----dubbo原理图-----
Containerdobbo的服务容器,在启动时Provider(服务提供者)将服务信息注册到zk(1.register),服务消费者通过消息的订阅(2.subscribe)zk的消息,然后zk把消息推送(3.notify)给consumer,
服务如果有变更,zk也会通过长连接的方式推送给comsumer,这就意味着comsumer实时掌握着一份服务信息。如果消费者要调用,就会通过手持的这些服务者名单中通过负载均衡机制(4.invoke)
找到对应的服务,如果调用失败可以在地址列表中继续调用,知道调用成功,dubbo还有监控机制(5.count)调用的次数,时间都会给监控中心发送
#案例
1、docker先拉取zookeeper镜像
docker pull zookeeper:latest
2、运行zookeeper
docker run --name zk01 -p 2181:2181 --restart always -d ab3f783cf9c4
ab3f783cf9c4是imageID
3、创建一个服务project工程,包含两个module,创建服务提供者和消费者
ticket(服务提供者)和user(消费者)之间的关系:ticket把信息注册到zk,user订阅zk的消息,user调用ticket的消息也是通过dubbo来完成的
4、整个dubbo -->在provider的pom文件中引入
<!--整合dubbo--> <dependency> <groupId>com.alibaba.spring.boot</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>2.0.0</version> </dependency> <!--整合zookeeper的客户端工具--> <dependency> <groupId>com.github.sgroschupf</groupId> <artifactId>zkclient</artifactId> <version>0.1</version> </dependency>
5、配置provider的application.properties属性
dubbo.application.name=provider-ticket
#zk地址
dubbo.registry.address=zookeeper://172.16.203.130:2181
#扫描service下的服务发布出去
dubbo.scan.base-packagess=com.wufq.providerticket.service
6、如何发布服务-->在对应的service包下需要发布的服务类加上
@Component //加入到spring容器中 @Service //将服务发布出去 public class TicketServiceImpl implements TicketService { @Override public String getTicket() { return "《长津湖》"; } }
7、启动provider的服务
8、消费者测试-consumer的步骤
1)引入依赖 --和provider引入的依赖一样
2)配置dubbo的注册中心地址 --和provider的application.properties配置的一样
dubbo.application.name=consumer-user
#zk地址
dubbo.registry.address=zookeeper://172.16.203.130:2181
3)引用服务
consumer中把provider的service包拷贝进入 ---》注意com.wufq的包,consumer和provider必须是一样的
测试消费者是否消费了服务者提供的服务