SpringCloudAlibaba篇(四)整合Dubbo(RPC 分布式服务框架)

上一篇,SpringCloudAlibaba篇(三)整合Sentinel(限流、流量整形、熔断降级、系统负载保护、热点防护,分布式服务架构的高可用流量防护组件)

文章目录

    • 什么是 Dubbo
    • 调用关系说明
    • Dubbo 功能特点
    • 1.添加dubbo依赖
      • 1.1nacos中创建dubbo.yaml
      • 1.2 修改bootstrap.yml ,application.yml
    • 2.创建order-service服务
      • 2.1创建启动类
      • 2.2创建bootstrap.yml ,application.yml
    • 3.创建一个service的api接口模块
      • 3.1 在service-api的基础上再创建一个user-service-api
      • 3.2 user-service-api创建 UserService
    • 4.user-service添加user-service-api依赖
      • 4.1 user-service 创建UserServiceImpl实现UserService
      • 4.2 user-service启动类中添加注解
    • 5.order-service调用user-service
      • 5.1 pom 添加依赖
      • 5.2 controller调用
      • 5.3 启动运行
      • 5.4 测试

什么是 Dubbo

Apache Dubbo (incubating) |ˈdʌbəʊ| 是一款高性能、轻量级的开源 Java RPC 分布式服务框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。她最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合)。从服务模型的角度来看,Dubbo 采用的是一种非常简单的模型,要么是提供方提供服务,要么是消费方消费服务,所以基于这一点可以抽象出服务提供方(Provider)和服务消费方(Consumer)两个角色。

调用关系说明

  • 服务容器负责启动,加载,运行服务提供者
  • 服务提供者在启动时,向注册中心注册自己提供的服务
  • 服务消费者在启动时,向注册中心订阅自己所需的服务
  • 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者
  • 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用
  • 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心

Dubbo 功能特点

  • 面向接口代理的高性能 RPC 调用: 提供高性能的基于代理的远程调用能力,服务以接口为粒度,为开发者屏蔽远程调用底层细节
  • 智能负载均衡: 内置多种负载均衡策略,智能感知下游节点健康状况,显著减少调用延迟,提高系统吞吐量
  • 服务自动注册与发现: 支持多种注册中心服务,服务实例上下线实时感知
  • 高度可扩展能力: 遵循微内核 + 插件的设计原则,所有核心能力如 Protocol、Transport、Serialization 被设计为扩展点,平等对待内置实现和第三方实现
  • 运行期流量调度: 内置条件、脚本等路由策略,通过配置不同的路由规则,轻松实现灰度发布,同机房优先等功能
  • 可视化的服务治理与运维: 提供丰富服务治理、运维工具:随时查询服务元数据、服务健康状态及调用统计,实时下发路由策略、调整配置参数

1.添加dubbo依赖


<dependency>
    <groupId>com.alibaba.cloudgroupId>
    <artifactId>spring-cloud-starter-dubboartifactId>
    <version>${spring-cloud-alibaba.version}version> 
dependency>

1.1nacos中创建dubbo.yaml

SpringCloudAlibaba篇(四)整合Dubbo(RPC 分布式服务框架)_第1张图片

dubbo:
  application:
    qos-enable: false
    qos-accept-foreign-ip: false
  registry:
    address: spring-cloud://localhost
  consumer:
  # check为false,则关闭该Consumer下所有服务检查
    check: false 
  • dubbo另一部分我这边写在了本地, nacos中的配置我是用来共享的

1.2 修改bootstrap.yml ,application.yml

  • 在bootstrap.yml中最佳dubbo.yaml
    SpringCloudAlibaba篇(四)整合Dubbo(RPC 分布式服务框架)_第2张图片
  • application.yml
dubbo:
  protocol:
    # dubbo 协议
    name: dubbo
    # dubbo 协议端口( -1 表示自增端口,从 20880 开始)
    port: 20881
  cloud:
  	# producer 服务名 , "" 为不加载,多个服务名用逗号分隔
    subscribed-services: ""
  • application.properties
spring.main.allow-circular-references=true

2.创建order-service服务

SpringCloudAlibaba篇(四)整合Dubbo(RPC 分布式服务框架)_第3张图片

  • pom

    这里的service-starter-parent 是我在SpringCloudAlibaba篇(二)自定义的,可以去看一下前面的文章


<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>SpringCloudAlibaba2022artifactId>
        <groupId>top.fategroupId>
        <version>1.0.0version>
    parent>
    <modelVersion>4.0.0modelVersion>

    <artifactId>order-serviceartifactId>
    <name>${project.artifactId}name>
    <version>${fate.project.version}version>
    <packaging>jarpackaging>

    <dependencies>
        <dependency>
            <groupId>top.fategroupId>
            <artifactId>service-starter-parentartifactId>
            <version>1.0.0version>
        dependency>
    dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.pluginsgroupId>
                <artifactId>maven-antrun-pluginartifactId>
                <executions>
                    <execution>
                        <phase>packagephase>
                    execution>
                executions>
            plugin>
        plugins>
    build>
project>

2.1创建启动类

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

2.2创建bootstrap.yml ,application.yml

  • bootstrap.yml
url:
  nacos: localhost:8848
spring:
  application:
    name: order-service #实例名
  profiles:
    active: dev
  cloud:
    nacos:
      discovery:
        #集群环境隔离
        cluster-name: shanghai
        #命名空间
        namespace: ${spring.profiles.active}
        #持久化实例 ture为临时实例 false为持久化实例  临时实例发生异常直接剔除, 而持久化实例等待恢复
        ephemeral: true
        #注册中心地址
        server-addr: ${url.nacos}
      config:
        namespace: ${spring.profiles.active}
        file-extension: yaml
        #配置中心地址
        server-addr: ${url.nacos}
        extension-configs[0]:
          data-id: mysql-user.yaml
          group: DEFAULT_GROUP
          refresh: false
        extension-configs[1]:
          data-id: sentinel.yaml
          group: DEFAULT_GROUP
          refresh: false
        extension-configs[2]:
          data-id: dubbo.yaml
          group: DEFAULT_GROUP
          refresh: false
  • application.yml
dubbo:
  protocol:
    # dubbo 协议
    name: dubbo
    # dubbo 协议端口( -1 表示自增端口,从 20880 开始)
    port: 20882
  cloud:
    subscribed-services: user-service
  • application.properties
spring.main.allow-circular-references=true
  • nacos中创建order-service.yaml
server:
  port: 8082

3.创建一个service的api接口模块

  • 删除src
    在这里插入图片描述
  • pom

<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>SpringCloudAlibaba2022artifactId>
        <groupId>top.fategroupId>
        <version>1.0.0version>
    parent>
    <modelVersion>4.0.0modelVersion>

    <artifactId>service-apiartifactId>
    <name>${project.artifactId}name>
    <version>${fate.project.version}version>
    <packaging>pompackaging>
    <description>SpringCloudAlibaba 微服务API集合description>

    <properties>
        <maven.compiler.source>8maven.compiler.source>
        <maven.compiler.target>8maven.compiler.target>
    properties>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-maven-pluginartifactId>
                <configuration>
                    <skip>trueskip>
                    <finalName>${project.name}finalName>
                configuration>
            plugin>
        plugins>
    build>
project>

3.1 在service-api的基础上再创建一个user-service-api

SpringCloudAlibaba篇(四)整合Dubbo(RPC 分布式服务框架)_第4张图片

  • pom

<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>service-apiartifactId>
        <groupId>top.fategroupId>
        <version>1.0.0version>
    parent>
    <modelVersion>4.0.0modelVersion>

    <artifactId>user-service-apiartifactId>
    <name>${project.artifactId}name>
    <version>${fate.project.version}version>
    <packaging>jarpackaging>

    <properties>
        <maven.compiler.source>8maven.compiler.source>
        <maven.compiler.target>8maven.compiler.target>
    properties>
project>

3.2 user-service-api创建 UserService

SpringCloudAlibaba篇(四)整合Dubbo(RPC 分布式服务框架)_第5张图片

public interface UserService {
    String getServiceName();
}

4.user-service添加user-service-api依赖

<dependency>
    <groupId>top.fategroupId>
    <artifactId>user-service-apiartifactId>
    <version>1.0.0version>
dependency>

4.1 user-service 创建UserServiceImpl实现UserService

@DubboService
public class UserServiceImpl implements UserService {
    @Override
    public String getServiceName() {
        return "this is UserService";
    }
}

4.2 user-service启动类中添加注解

@EnableDubbo(scanBasePackages = "top.fate.service")

在这里插入图片描述

5.order-service调用user-service

5.1 pom 添加依赖

<dependency>
    <groupId>top.fategroupId>
    <artifactId>user-service-apiartifactId>
    <version>1.0.0version>
dependency>

5.2 controller调用

@RestController
@RequestMapping(value = "order")
public class OrderController {

    @DubboReference
    private UserService userService;
    
    @GetMapping("getUserService")
    public String getUserService(){
        return userService.getServiceName();
    }

}

5.3 启动运行

SpringCloudAlibaba篇(四)整合Dubbo(RPC 分布式服务框架)_第6张图片

5.4 测试

访问http://localhost:8082/order/getUserService

  • 调用成功
    SpringCloudAlibaba篇(四)整合Dubbo(RPC 分布式服务框架)_第7张图片
    SpringCloudAlibaba篇(五)整合GateWay(微服务网关)2022年最新

你可能感兴趣的:(SpringBoot,springcloud,spring,boot,java,maven,云原生)