把一个服务拆分成多个服务的时候(微服务),最大的问题是服务间的调用问题。调用方式总体分为两类:RPC 和 事件驱动。
RPC:常见的(远程通信)rest/RMI/Stocket、(Google)gRPC、(阿里)Dubbo等
事件驱动:常见的ActiveMQ,RabbitMQ,RocketMQ、Kafka等
1.dubbo使用tcp实现服务之间调用(任何两个服务间通信都需要先进行tcp连接,ip地址+端口号),注册中心会自动来实现连接。
dubbo常用注册中心:SimpleRegistry(dubbo自带)、Zookeeper、Multicast、Redis、Simple、Nacos
1.1 本次演示不使用注册中心实现服务间调用
服务提供者provider.xml:
作用:暴露服务接口
//name:通信协议名称,例如:dubbo、RMI、Http等
<dubbo:protoc name="dubbo“ port="20881 host="localhost">
//提供的接口
<dubbo service interface="com.test.DemoService" ref="demoServiceImpl"/>
//接口具体实现类,一般用@Component放入bean容器
<bean id="demoServiceImpl" class="com.test.DemoServiceImpl"/>
消费者customer.xml
作用:调用服务者接口
<dubbo:protoc name="dubbo“ port="20881" host="localhost">
<dubbo:reference interface="com.test.DemoService" id="demoServiceImpl
url="dubbo://localhost:20881/com.test.DemoService"">
customer server调用provider server
public class Consumer {
public static void main(String[] args) throws Exception {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("customer.xml");
context.start();
// 获取远程服务代理
DemoService demoService = (DemoService)context.getBean("demoServiceImpl");
// 执行远程方法
demoService.xxxxx();
}
}
这就是一个典型的点对点的服务调用。
2)为了高可用,提供者可以启动多个服务。借用大佬画的图
一个用户服务对应一个:ip
userService1:192.0.0.1
userService2:192.0.0.2
userService3:192.0.0.3
//配置负责均衡策略loadbalance:random,roundrobin,leastactive,
分别表示:随机,轮循,最少活跃调用
<dubbo:reference interface="com.test.DemoService" id="demoServiceImpl”
url="dubbo://192.0.0.1:20881/com.test.DemoService;
dubbo://192.0.0.2:20881/com.test.DemoService;
dubbo://192.0.0.3:20881/com.test.DemoService"
loadbalance=“roundrobin">
这种方式存在的问题:
1.当服务者增加减少节点,需要更改配置文件。
2.当其中一个服务宕机,消费者感知不到,还会向宕机的服务发送请求,发生错误。
总结:dubbo使用tcp实现服务器之间连接/调用。可以使用注册中心也可以不使用