通过RPC的方式实现服务调用
通过简单实现理解原理:
Client和Server共用一个接口,将接口打成一个jar包,在客户端和服务端引入这个jar包,Client端面向接口写调用,Server端面向接口写实现,中间的网络通信交给Dubbo框架去实现。
以下是黄字叙述内容:“点对点RPC”的实现细节
加载Spring配置
public class Provider {
public static void main(String[] args) throws Exception {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("provider.xml");
context.start();
System.in.read(); // 按任意键退出
}
}
加载Spring配置,并调用远程服务
public class Consumer {
public static void main(String[] args) throws Exception {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("consumer.xml");
context.start();
// 获取远程服务代理
DemoService userService = (DemoService)context.getBean("userService");
// 执行远程方法
String hello = userService.sayHello("world");
// Hello world
System.out.println( hello );
}
}
以上就是典型的点对点的服务调用,假如在未指定zookeeper注册中心时,Client和Server端的配置文件部分如下
此时,若我们为了高可用,可以:
标签的url属性中加入多个地址,中间用分号隔开即可配置负载均衡策略在consumer.xml的dubbo:reference标签中增加loadbalance属性即可,属性值可以为如下四种:一致性Hash,相同参数的请求总是发到同一提供者;
consumer.xml中生成接口的远程代理如下:
现在整体架构如下图(假设consumer为订单服务,provider为用户服务)

此时会有什么问题?
这是后就需要引入zookeeper注册中心了!
zookeeper注册中心实现注册的大致流程如下图:

对照上图来看Dubbo官网上的Dubbo框架图,是不是觉得和上图很类似?zookeeper是被选来作为Dubbo框架中的注册中心。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pwYKV8qn-1650879464231)(https://dubbo.apache.org/imgs/architecture.png)]](https://1000bd.com/contentImg/2022/08/16/133528533.png)
节点
角色说明
Provider
暴露服务的服务提供方
Consumer
调用远程服务的服务消费方
Register
服务注册与发现的注册中心
Monitor
统计服务的调用次数和调用时间的监控中心
Container
服务运行容器
调用关系说明
回归之前的问题,如要使用注册中心,只需要将provider.xml和consumer.xml恢复为如下:
如果zookeeper是一个集群,则多个地址之间逗号分隔即可:
将consumer.xml中配置的直连的方式去掉
启动上述服务后,我们观察在zookeeper的根节点多了一个dubbo节点,如下图(树状存储)

最后一个节点中192.168.1.104是我的内网地址,绿色代表临时节点,而其他节点是持久节点,这样,当服务宕机时,这个节点就会自动消失,不在提供服务,服务消费者也不会载请求。若部署多个Service,则Provider下面会有好几个节点,一个节点保存一个Service的服务地址。