Dubbo
一、架构讲解
- 架构图
- 虚线和实线的意义:虚线表示异步,不阻塞线程且性能高;实线表示同步阻塞。
- Provider:服务提供者。暴露服务的服务提供方,服务提供者在启动时,向注册中心注册自己提供的服务。
- Registry:注册中心。用于放置所有Provider对外提供的信息。
- Consumer:服务消费者。服务消费者在启动时,向注册中心订阅自己所需的服务,服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
- Monitor:监控中心。监控Provider的压力情况等。每隔1分钟Consumer和Provider会把调用次数发送给Monitor,由Monitor进行统计。
二、Dubbo项目
此项目是一个maven架构项目
- 父项目中导入依赖
<modules>
<module>dubbo_api</module>
<module>dubbo_provider</module>
<module>dubbo_consumer</module>
</modules>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.7.RELEASE</version>
</parent>
-
服务端和消费端都需要使用接口
注意:将这个接口写到一个单独的项目中,方便解耦
public interface DemoDubboService {
String sayHello(String name);
}
-
服务端代码
注意:在启动类中要加入@EnableDubbo
导入依赖:
<dependencies>
<!--依赖dubbo_api 为了实现接口-->
<dependency>
<groupId>com.jutixueyuan</groupId>
<artifactId>dubbo_api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--dubbo的服务的提供者需要有spring的容器支持-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!--加入dubbo的依赖-->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.7</version>
</dependency>
<!--加入dubbo的注册中心的依赖-->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.3.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.3.0</version>
</dependency>
</dependencies>
application.yml文件:
dubbo:
#dubbo的协议(都是默认值可以不写)
protocol:
name: dubbo
port: 20881
#配置注册中心
registry:
address: zookeeper://192.168.10.11:2181
timeout: 30000
#配置应用的名称(dubbo要求每一个dubbo的应用必须要有一个应用名称)
application:
name: demo-provider
主要代码:
@DubboService(loadbalance = "roundrobin") // 负载均衡
public class DemoDubboServiceImpl implements DemoDubboService {
@Override
public String sayHello(String name) {
System.out.println("我被调用了....");
return "你好:"+name;
}
}
- 消费端代码
导入依赖:
<dependencies>
<!--dubbo_api依赖-->
<dependency>
<groupId>com.jutixueyuan</groupId>
<artifactId>dubbo_api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--加入web启动器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--加入dubbo的依赖-->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.7</version>
</dependency>
<!--zk的依赖-->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.3.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.3.0</version>
</dependency>
</dependencies>
application.yml文件:
dubbo:
#配置注册中心
registry:
address: zookeeper://192.168.10.11:2181
timeout: 30000
#配置应用的名称(dubbo要求每一个dubbo的应用必须要有一个应用名称)
application:
name: demo-consumer
主要实现代码:
controller层:
@Controller
public class DemoController {
@Autowired
private DemoService demoService;
@RequestMapping("/hello")
@ResponseBody
public String getHello(String name){
return demoService.getHello(name);
}
}
service层:
@Service
public class DemoServiceImpl implements DemoService {
@DubboReference
private DemoDubboService demoDubboService;
@Override
public String getHello(String name) {
return demoDubboService.sayHello(name);
}
}
三、负载均衡
- 集群概念:一个内容,部署多次,形成的整体称为集群。集群中每个个体应该部署到不同的服务器上。
- 伪集群:集群中内容部署到同一台服务器上,通过不同端口区分不同个体。
注意:负载均衡是在集群的前提下
-
Dubbo内置的四个负载均衡策略:
-
Random:
随机策略
。随机访问集群中节点。访问概率与权重有关。@DubboService(loadbalance = "random") public class DemoDubboServiceImpl implements DemoDubboService
-
RoundRobin:
轮询策略
。按公约后的权重设置轮循比率。 存在慢的提供者累积请求的问题,比如:第二台机器很慢,但没挂,当请求调到第二台时就卡在那,久而久之,所有请求都卡在调到第二台上。@DubboService(loadbalance = "roundrobin" weight=4) public class DemoDubboServiceImpl implements DemoDubboService
-
LeastActive:
最少活跃调用数策略
。相同活跃数的随机,活跃数指调用前后计数差。 使慢的提供者收到更少请求,因为越慢的提供者的调用前后计数差会越大。 -
ConsistentHash:
一致性Hash策略
。相同参数的请求总是发到一个提供者。
-