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

什么是 Dubbo

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

调用关系说明

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

Dubbo 功能特点

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

1.添加dubbo依赖


<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-dubbo</artifactId>
    <version>${spring-cloud-alibaba.version}</version> <!--2021.0.1.0-->
</dependency>

1.1nacos中创建dubbo.yaml

在这里插入图片描述

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
    在这里插入图片描述
  • 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服务

在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<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>SpringCloudAlibaba2022</artifactId>
        <groupId>top.fate</groupId>
        <version>1.0.0</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>order-service</artifactId>
    <name>${project.artifactId}</name>
    <version>${fate.project.version}</version>
    <packaging>jar</packaging>

    <dependencies>
        <dependency>
            <groupId>top.fate</groupId>
            <artifactId>service-starter-parent</artifactId>
            <version>1.0.0</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-antrun-plugin</artifactId>
                <executions>
                    <execution>
                        <phase>package</phase>
                    </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
<?xml version="1.0" encoding="UTF-8"?>
<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>SpringCloudAlibaba2022</artifactId>
        <groupId>top.fate</groupId>
        <version>1.0.0</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

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

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

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

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

在这里插入图片描述

  • pom
<?xml version="1.0" encoding="UTF-8"?>
<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-api</artifactId>
        <groupId>top.fate</groupId>
        <version>1.0.0</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>user-service-api</artifactId>
    <name>${project.artifactId}</name>
    <version>${fate.project.version}</version>
    <packaging>jar</packaging>

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

3.2 user-service-api创建 UserService

在这里插入图片描述

public interface UserService {
    String getServiceName();
}

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

<dependency>
    <groupId>top.fate</groupId>
    <artifactId>user-service-api</artifactId>
    <version>1.0.0</version>
</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.fate</groupId>
    <artifactId>user-service-api</artifactId>
    <version>1.0.0</version>
</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 启动运行

在这里插入图片描述

5.4 测试

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

Logo

鸿蒙生态一站式服务平台。

更多推荐