Dubbo

103 阅读4分钟

分布式--SOA架构

SOA (Service-Oriented Architecture),即⾯向服务的架构。

在分布式架构的基础上,增加一个调度中心(注册中心)对系统服务进行实时管理。

将controller和service,mapper分开

优点:

  • 使用注册中心解决了各个服务之间的服务依赖和调用关系的自动注册与发现 缺点:
  • 基于dubbo无法实现各服务跨语言开发
  • 模块之间调用对注册中心依赖性过高
  • 模块之间调用变为复杂(提供者、消费者)

分布式--微服务架构

微服务架构可以说是SOA架构的升级版,SOA架构注重的是应用程序服务的可重用性的最大化。

微服务架构注重的是服务的职责单一,服务独立、轻量

将每个功能模块独立出来

优点

  • 面向服务:微服务对外暴露业务接口(基于http协议可跨语言)
  • 自治:团队独立、技术独立、数据独立、部署独立 缺点:
  • 对程序员要求高

Dubbo

阿里开发的一个java RPC框架

RPC

  • RPC全称为remote procedure call,即远程过程调用
  • 简单的讲,RPC可以让我们像调用本地方法一样来调用远程方法
  • 需要注意的是RPC并不是一个具体的技术,而是指整个网络远程调用过程
  • Java中的RPC框架比较多,广泛使用的有RMI、Hessian、Dubbo等

Dubbo+Nacos

服务提供者

导入依赖

     <parent>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-parent</artifactId>
         <version>2.2.2.RELEASE</version>
     </parent>
 
     <dependencies>
         <!--基础环境-->
         <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.8</version>
         </dependency>
         <!-- nacos注册中心 -->
         <dependency>
             <groupId>com.alibaba.nacos</groupId>
             <artifactId>nacos-client</artifactId>
             <version>1.2.1</version>
         </dependency>
     </dependencies>

@DubboService将服务放入注册中心

@DubboService
public class UserServiceImpl implements UserService {


    @Override
    public User queryById(long id) {
        User user = new User();
        user.setUsername("hawk");
        user.setAddress("黄金港");
        System.out.println(1.0);
        return user;
    }
}
配置文件
server:
  port: 18081
spring:
  application:
    name: user-provider # 项目在注册中心的应用名
dubbo:
  protocol:
    name: dubbo # 协议:dubbo(rpc协议,底层是tcp)
    port: -1 # 当前服务在注册中心的端口 端口默认从20881开始  -1代表自动分配端口
  registry: # nacos注册中心地址
    address: nacos://127.0.0.1:8848
  scan: #包扫描
    base-packages: com.eponine.service

服务提供者

搭建环境
<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.2.RELEASE</version>
    </parent>

    <dependencies>
       <!--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.8</version>
        </dependency>
        <!-- nacos注册中心 -->
        <dependency>
            <groupId>com.alibaba.nacos</groupId>
            <artifactId>nacos-client</artifactId>
            <version>1.2.1</version>
        </dependency>
    </dependencies>

@DubboReference远程调用服务

@RestController
@RequestMapping("/user")
public class UserController {

    @DubboReference //远程调用服务
    private UserService userService;

    @GetMapping("/username/{id}")
    public User queryById(@PathVariable Long id){
        User user = userService.queryById(id);
        return user;
    }
}
配置文件
server:
  port: 18080
spring:
  application:
    name: user-consumer
dubbo:
  registry:
    address: nacos://127.0.0.1:8848

代码优化

可以把实体类和业务接口都单独抽出来作为一个模块,以依赖导入的方式提供给服务提供者和消费者

Dubbo高级特性

序列化

dubbo底层是需要通过网络传输数据的,因此被传输的对象必须实现序列化接口

//实现接口=序列化
public class User implements Serializable{
    private Integer id;
    private String name;
    private Integer age;
} 

启动时检查

启动时检查,配置在服务消费者一方,用于服务消费者在启动的时候主动检查注册中心或者服务提供者是否准备好提供服务

  • 如果配置为false,代表不检查

  • 如果配置为true,代表检查,一旦检查到服务提供者未准备好,就会直接抛异常(默认)

dubbo:
  registry:
    check: false # 启动不检查注册中心服务
  consumer:
    check: false # 启动不检查服务提供方

服务超时

# dubbo提供设置一个服务的超时时间,如果超过这个时间,服务无法作出反应,直接终止线程。
dubbo:
	consumer:
    	timeout: 1000

服务重试

dubbo设置了超时时间,如果在这个时间段内,无法完成服务访问,则自动断开连接。

为了弥补这一特性的缺点,保证系统健壮,dubbo提供了重试机制(默认在访问出现问题后还会重试2次)。

dubbo:
  consumer:
    retries: 0 # 不再重试,直接报异常

多版本

dubbo使用version属性来设置和调用同一个接口的不同版本

@DubboService(version = "1.0")
@DubboReference(version = "1.0")

负载均衡

dubbo支持四种负载均衡策略:

  • random:按权重随机选择,这是默认值。
  • roundrobin:按权重轮询选择。
  • leastactive:最少活跃调用数,相同活跃数的随机选择。
  • consistenthash:一致性Hash,相同参数的请求总是发到同一提供者。

SpringCloud组件:SpringCloud Alibaba

依赖

父工程

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-dependencies</artifactId>
    <version>2.2.5.RELEASE</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>

消费者和提供者

<!--nacos注册中心的依赖-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

<!--springcloud alibaba dubbo依赖   -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>

服务提供者

配置

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/dubbo-demo?useSSL=false
    username: root
    password: root
    driver-class-name: com.mysql.jdbc.Driver
  application:
    name: user-service
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
#配置dubbo,注册中心,暴露的端口和协议,dubbo注解的包扫描
dubbo:
  protocol:
    name: dubbo
    port: -1
  registry:
    address: spring-cloud://localhost   #使用SpringCloud中的注册中心
  scan:
    base-packages: cn.itcast.user.service  #dubbo中包扫描

服务消费者

配置

spring:
  application:
    name: order-service
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
#dubbo配置
dubbo:
  protocol:
    name: dubbo
    port: -1
  registry:
    address: spring-cloud://localhost  #使用cloud的注册中心