Dubbo

一、Dubbo架构

1 架构图
在这里插入图片描述

2 架构说明

2.1 虚线
虚线表示异步,实线表示同步。异步不阻塞线程性能高,同步阻塞线程必须等待响应结果才能继续执行,相对性能低。
2.2 Provider
提供者。编写持久层、业务层和事务代码。
2.3 Container
容器(Spring容器),Dubbo完全基于Spring实现的。
2.4 Registry
注册中心。放置所有Provider对外提供的信息。包含Provider的IP,访问端口,访问遵守的协议,对外提供的接口,接口中有哪些方法等相关信息。
2.5 Consumer
消费者(RPC调用者,SOA调用服务的项目)开发中也是一个项目,编写service和controller(还可以包括页面等)。调用远程服务实现(XXXXServiceImpl)中的方法。
2.6 Monitor
监控中心。监控Provider的压力情况等。每隔2分钟Consumer和Provider会把调用次数发送给Monitor,由Monitor进行统计。

3 执行流程

  1. start:启动Spring容器时会把Provider启动。
  2. register:把Provider相关信息注册到Registry里
  3. subscribe:Consumer从Registry中订阅Provider的信息
  4. notify:通知给Consumer
  5. invoke:Consumer根据Registry通知的信息进行调用Provider中方法。
  6. count:Consumer和Provider把调用次数信息异步发送给Monitor进行统计。

二、Dubbo支持的协议

1 Dubbo协议(官方推荐协议)

优点:
采用NIO复用单一长连接,并使用线程池并发处理请求,减少握手和加大并发效率,性能较好(推荐使用)
缺点:
大文件上传时,可能出现问题(不使用Dubbo实现文件传输)

2 RMI(Remote Method Invocation)协议

优点:
JDK自带的能力。
缺点:
偶尔连接失败.

3 Hessian协议

优点:
可与原生Hessian互操作,基于HTTP协议
缺点:
需hessian.jar支持,http短连接的开销大

三、Dubbo支持的注册中心

1 Zookeeper(官方推荐)

  1. 优点:
    支持分布式.很多周边产品.
  2. 缺点:
    受限于Zookeeper软件的稳定性.Zookeeper专门分布式辅助软件,稳定较优

2 Multicast

  1. 优点:
    去中心化,不需要单独安装软件.
  2. 缺点:
    2.2.1 Provider、Consumer和Registry不能跨机房(路由)

3 Redis

  1. 优点:
    支持集群,性能高
  2. 缺点:
    要求服务器时间同步.否则可能出现集群失败问题.

4 Simple

  1. 优点:
    标准RPC服务.没有兼容问题
  2. 缺点:
    不支持集群.

四、Dubbo入门案例

[1]、第一个Dubbo的Provider

新建父项目Parent1。最终结构如下:
在这里插入图片描述

编写pom.xml继承SpringBoot父项目。

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.5.RELEASE</version>
</parent>

1 新建api项目,创建接口
创建com.bjsxt.dubbo.service.DemoDubboService接口

public interface DemoDubboService {
    String demo();
}

2 新建provider项目

2.1 编写pom.xml
注意:不需要依赖web,如果依赖spring-boot-start-web还需要考虑端口问题。

<dependencies>
    <dependency>
        <artifactId>api</artifactId>
        <groupId>com.bjsxt</groupId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <dependency>
        <groupId>org.apache.dubbo</groupId>
        <artifactId>dubbo-spring-boot-starter</artifactId>
        <version>2.7.3</version>
    </dependency>
    <dependency>
        <groupId>org.apache.curator</groupId>
        <artifactId>curator-recipes</artifactId>
        <version>4.2.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.curator</groupId>
        <artifactId>curator-framework</artifactId>
        <version>4.2.0</version>
    </dependency>
</dependencies>

2.2 编写配置文件
新建application.yml

dubbo:
  application:
    name: dubbo-provider
  registry:
    address: zookeeper://192.168.32.128:2181

2.3 新建实现类
新建com.bjsxt.dubbo.service.impl.DemoDubboServiceImpl
注意:
Service注解是apache的注解。

import com.bjsxt.dubbo.service.DemoDubboService;
import org.apache.dubbo.config.annotation.Service;

@Service
public class DemoDubboServiceImpl implements DemoDubboService {
    @Override
    public String demo() {
        System.out.println("demo方法");
        return "123";
    }
}

2.4 新建启动类
新建com.bjsxt.ProviderApplication。
必须要有@EnableDubbo注解,否则Dubbo不生效。

@SpringBootApplication
@EnableDubbo
public class ProviderApplication {
    public static void main(String[] args) {
        SpringApplication.run(ProviderApplication.class,args);
    }
}
[2]、Admin管理界面搭建

把dubbo-admin-server-0.2.0.jar\BOOT-INF\classes 中application.properties里面注册中心的ip设置正确
在这里插入图片描述

使用java -jar dubbo-admin-server-0.2.0.jar运行即可。访问http://localhost:8080可以进入Dubbo Admin管理控制台。
注意:占用8080端口,不要冲突了。

[3]、完成Dubbo的Consumer

创建consumer项目
1 编写pom.xml

<dependencies>
    <dependency>
        <artifactId>api</artifactId>
        <groupId>com.bjsxt</groupId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.apache.dubbo</groupId>
        <artifactId>dubbo-spring-boot-starter</artifactId>
        <version>2.7.3</version>
    </dependency>
    <dependency>
        <groupId>org.apache.curator</groupId>
        <artifactId>curator-recipes</artifactId>
        <version>4.2.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.curator</groupId>
        <artifactId>curator-framework</artifactId>
        <version>4.2.0</version>
    </dependency>
</dependencies>

2 新建配置文件
新建application.yml

dubbo:
  application:
    name: dubbo-consumer
  registry:
    address: zookeeper://192.168.32.128:2181

3 新建service及实现类
新建com.bjsxt.service.DemoService
新建com.bjsxt.service.impl.DemoServiceImpl
调用服务使用@Reference注解,不要导错包了,有两个。

public interface DemoService {
    String consumerDemo();
}
import com.bjsxt.dubbo.service.DemoDubboService;
import com.bjsxt.service.DemoService;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.stereotype.Service;

@Service
public class DemoServiceImpl implements DemoService {

    @Reference
    private DemoDubboService demoDubboService;

    @Override
    public String consumerDemo() {
        return demoDubboService.demo();
    }
}

4 新建控制器
新建控制器com.bjsxt.controller.DemoController

@Controller
public class DemoController {
    @Autowired
    private DemoService demoService;

    @RequestMapping("/demo")
    @ResponseBody
    public String demo(){
        return demoService.consumerDemo();
    }
}

5 新建启动器
新建com.bjsxt.ConsumerApplication

@SpringBootApplication
@EnableDubbo
public class ConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class,args);
    }
}

五、负载均衡

集群:一个内容,部署多次,形成的整体称为集群。集群中每个个体应该部署到不同的服务器上。
伪集群:集群中内容部署到同一台服务器上,通过不同端口区分不同个体。
负载均衡是在集群前提下,当访问整个集群时,集群中每个节点被访问次数或频率的规则。

Dubbo 内置了四个负载均衡策略。默认为Random
1 内置策略

1.1 Random
随机。随机访问集群中节点。访问概率和权重有关。
1.2 RoundRobin
轮询。访问频率和权重有关。
权重(weight):占有比例。集群中每个项目部署的服务器的性能可能是不同,性能好的服务器权重应该高一些。
1.3 LeastActive
活跃数相同的随机,不同的活跃数高的放前面。
1.4 ConsistentHash
一致性Hash。相同参数请求总是发到一个提供者。

2 搭建Provider集群

新建四个启动类。启动类名称不同,dubbo端口不同
每次启动启动类修改配置文件dubbo.protocal.port。默认20880。

3 设置负载均衡
3.1 @Reference ,调用的服务采用的负载均衡

@Reference(loadbalance = "roundrobin")
private DemoDubboService demoDubboService;

3.2 @Service , 当前服务采用的负载均衡算法

@Service(loadbalance = "random")
public class DemoDubboServiceImpl implements DemoDubboService {

设置权重

@Service(weight = 4)

3.3 配置文件
全局设置所有provider和consumer的负载均衡效果。

dubbo:
  application:
    name: dubbo-provider
  registry:
    address: zookeeper://192.168.32.128:2181
  protocol:
    port: 20884
  provider:
    loadbalance: random
  consumer:
    loadbalance: random
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AloneDrifters

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值