这边举个例子,如果有两个模块,用户模块和订单模块,面对日益增长的用户访问量,对服务器的压力是巨大的,所以这个时候可以将用户模块放在几台服务器上,每个服务器都能承载几百个并发,订单模块也部署在好几台服务器上,这时候用户模块想要调用订单模块的话,需要rpc远程过程调用技术(写代码、或者webservice技术),这样做就太麻烦了,所以就需要一个rpc框架(分布式框架),而dubbo和springcloud做的就是这样的事情。这边就牵扯到一个注册中心(类似于现实生活中的婚宴中介所)的概念,多个用户和多个订单会在注册中心留下自己的信息,这样用户模块在需要调用订单模块的时候,就可以去注册中心去找。
zookeeper就是注册中心。
dubbo就是分布式的服务框架。
dubbo的架构工作图:
说明: container服务容器start启动provider服务提供者,然后服务提供者会将自己注册到注册中心,服务消费者 在启动的时候会从注册中心订阅所需要的服务,注册中心会把消费者需要的服务的地址列表全部返回给消费者,如果服务又变更,注册中心也会基于长连接的方式将变更推送给消费者。
如果消费者要调用的话,从提供者的地址列表中基于负载均衡的机制来找到某一个提供者的位置,然后调用其服务。如果调用失败,则可以去找另一个服务提供者继续调用,直到成功调用。
dubbo还有监控机制,调用次数,调用时间等信息可以定时每分钟都可以给监控中心推送从而做到监控。
docker run --name zk01 -p 2181:2181 --restart always -d XXX(此处是镜像id)
2)创建一个空项目
紧接着创建两个module,一个消费者一个提供者
zookeeper和dubbo的依赖(这里尤其要注意坑,本人在这边卡了好久,最后发现是引入依赖版本有问题)
下面是springboot1版本引入
<dependency>
<groupId>com.alibaba.bootgroupId>
<artifactId>dubbo-spring-boot-starterartifactId>
<version>0.1.0version>
dependency>
<dependency>
<groupId>com.github.sgroschupfgroupId>
<artifactId>zkclientartifactId>
<version>0.1version>
dependency>
如果你用的是springboot2版本的,则需要使用下面的依赖,这是网上查了很多的帖子得出来的,如果引用上方的依赖,消费者是拿不到服务提供者的接口的!!!太坑了!!!
<dependency>
<groupId>org.apache.dubbogroupId>
<artifactId>dubbo-spring-boot-starterartifactId>
<version>2.7.5version>
dependency>
<dependency>
<groupId>org.apache.curatorgroupId>
<artifactId>curator-recipesartifactId>
<version>4.2.0version>
dependency>
#表示当前应用的名字
dubbo.application.name=provider
#zookeeper的地址
dubbo.registry.address=zookeeper://192.168.49.43:2181
#表示要将那个包下的什么发送出去
dubbo.scan.base-packages=com.atguigu.consumer.service
package comatguigu.consumer.service;
public interface TicketService {
public String getTicket();
}
package comatguigu.consumer.service;
import com.alibaba.dubbo.config.annotation.Service;
import org.springframework.stereotype.Component;
/**
* @author pzy
* @ClassName TicketServiceImpl
* @Date 2020/5/8 21:06
*/
@Component
@Service
public class TicketServiceImpl implements TicketService {
@Override
public String getTicket() {
return "《疯狂java》";
}
}
总结:
1.将服务提供者注册到注册中心
1)引入dubbo和zookeeper
2)配置dubbo的扫描版和注册中心地址
3)使用dubbo的@Service发布服务
1)引入依赖
2)配置文件配置
#表示当前应用的名字
dubbo.application.name=user
#zookeeper的地址
dubbo.registry.address=zookeeper://192.168.49.43:2181
#表示要将那个包下的什么发送出去
3) 复制服务提供者项目中service的全路径, 路径名要和消费者项目的路径名一样, 只需要接口类, 不需要实现类
4) @Reference 桥接引用
@Service
public class UserService {
@Reference
TicketService ticketService;
public void getTicket(){
String ticket = ticketService.getTicket();
System.out.println("买到票了:"+ticket);
}
}