Dubbo篇
背景
服务之间的远程通信是分布式架构最基本的组成部分,传统意义上的通信,主要解决的是数据孤岛和数据联通的问题,侧重于数据的共享。随着SOA的出现,当前的需求主要集中于服务的解耦。除此之外,随着业务需求的增加导致微服务数量的增多,随之产生了很多问题,例如:协调线上的服务、根据不同服务的需求合理分配资源、动态更新服务中的配置信息等等。为了解决这些问题,就提出了Dubbo,统一的服务治理框架对服务进行统一的管理,保证高效。
1.1 概念
Apache Dubbo是一个分布式服务框架,主要实现多个系统直接的高性能、透明化调用,相当于RPC(远程过程调用)框架,不过在此基础上实现了服务治理功能,比如:服务注册、监控、路由、容器等。从图中可以看出,除了RPC的功能之外,Dubbo的核心功能就是监控和服务注册。
1.2 Springboot集成Apache Dubbo
虽然Apache Dubbo本身并不依赖于Springboot,也可以实现微服务,但是集成之后可以享受Spring Boot生态的框架和技术支持。下面是案例:
1.2.1 服务提供者
- 首先创建一个Maven工程springboot-provider,其中有2个模块:sample-api和sample-provider,其中sample-provider是一个Spring Boot工程。
- 在sample-api模块中定义一个接口,并且通过mvn install安装到本地私服。
- 在sample-provider中引入依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.6.3</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.15</version>
</dependency>
<dependency>
<groupId>org.example</groupId>
<artifactId>sample_api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
- 在sample-provider中实现IHelloWorld接口,使用Dubbo中的@Service注解发布服务
@Service
public class HelloServiceImpl implements IHelloWorld{
@Value("${dubbo.application.name}")
private String serviceName;
@Override
public String sayHello(String name){
return String.format("[%s]:Hello,%s",serviceName,name);
}
}
- 在application.properties文件中添加Dubbo的配置信息
spring.application.name = springboot-dubbo-demo
dubbo.application.name = springboot-provider
dubbo.protocal.name = dubbo
dubbo.protocal.port = 20880
dubbo.registry.address = N/A
- 写个启动类,加@DubboComponentScan注解,将@Service注解识别为Dubbo的service
@DubboComponentScan
@SpringBootApplication
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class,args);
}
}
1.2.2 服务使用者
- 创建一个Spring Boot项目springboot-cosumer,添加jar包依赖
- 在application.properties中配置项目名称
- 在启动类中使用Dubbo提供的@Reference注解来获得一个远程代理对象。
1.2.3 分析
上述的案例通过点对点的方式实现服务之间的通信,Dubbo可以很好的集成注册中心来实现服务地址的统一管理。早期通过zookeeper来实现注册,关于zookeeper的介绍此处不提供。
1.3 Dubbo的其他应用
- 集群容错
- 负载均衡
- 服务降级
- 主机绑定规则
1.4 Dubbo集成三方软件实现服务注册
大规模服务化之后,在远程RPC通信中,会遇到2个问题:
- 服务动态上下线感知
- 负载均衡
1.4.1 服务动态上下线感知
服务调用者要感知服务提供者的上下线变化。按照传统形式,服务调用者如果要调用提供者,那么需要知道提供者的地址信息和映射参数。如果提供者是一个集群节点,那么调用者就要维护很多地址。因此这个工作需要第三方软件来做不可能人工实现 ,统一管理服务者的URL地址,调用者从软件中获取提供者的地址,软件也动态感知提供者的状态变化,做相应处理。
1.4.2 负载均衡
负载均衡就是假如服务提供者是由多个集群节点组成的集群环境,服务调用者需要通过负载均衡算法选择一台目标服务器进行远程通信。负载均衡的目的就是通过多个节点的集群来均衡服务器的访问压力,提升整体性能。前提是服务地址的获取给调用者进行计算要依赖三方软件。
1.4.3 三方软件
常用的:Zookeeper、Nacos、Redis等
Nacos可参考: