Spring Cloud Alibaba Dubbo

2023-11-04

Spring Cloud Alibaba Dubbo

为什么?是什么?怎么做?

为什么?

  1. 单体应用
    单体服务经过长期的迭代更新,逐渐走向代码臃肿、高耦合,这显然与我们软件开发设计理念高内聚\低耦合背道而驰,从而难以维护~
    市场需求也在逐渐要求服务高并发、高性能、高可用,在这样的场景下,单体服务宕机重启时间长、访问过慢的问题一一暴露!

  2. 分布式应用系统
    分布式开发,将服务拆分,是建立在网络之上的软件系统。正是因为软件的特性,所以分布式系统具有高度的内聚性和透明性。

    这么多服务,遇到四个问题:

  • 客户端如何访问?
  • 服务与服务间如何通信?
  • 如何管理这么多服务?
  • 挂了怎么办?

是什么?

微服务架构是一种架构概念,实际的开发时分布式应用的开发,旨在解决分布式开发下遇到的四个问题

怎么做?

1. 目标

Spring Cloud Alibaba Dubbo 项目的目标是将 Dubbo 融入到 Spring Cloud Alibaba 生态中,使微服务之间的调用同时具备 RESTful 和 Dubbo 调用的能力。

RPC 即远程过程调用(Remote Procedure Call Protocol,简称RPC),像调用本地服务(方法)一样调用服务器的服务(方法)

REST直接使用HTTP做应用层协议

  1. RPC,支持多种语言(但不是所有语言),四层通讯协议,性能高,节省带宽。相对Restful协议,使用RPC,在同等硬件条件下,带宽使用率仅为前者的20%,性能却提升一个数量级。但是这种协议最大的问题在于,无法穿透防火墙。
  2. 以Spring Cloud为代表所支持的Restful 协议,优势在于能够穿透防火墙,使用方便,语言无关,基本上可以使用各种开发语言实现的系统,都可以接受Restful 的请求。但性能和带宽占用上有劣势。

所以,对微服务的实现,基本是确定一个组织边界,在该边界内,使用RPC; 边界外,使用Restful。这个边界,可以是业务、部门,甚至是全公司。

做到对业务代码无侵入,无感知;引入 JAR 包则微服务间调用使用 Dubbo,去掉 JAR 包则使用默认的 RESTful;

实现参考的是 Spring Cloud 中文社区的 Spring Cloud Dubbo 项目。

2. 部署Nacos

既然已经将 Dubbo 集成进了 Spring Cloud Alibaba,那么理所当然的我们的注册中心也不再采用 Zookeeper 方案而是转为 Nacos 方案了
部署 Nacos

下载并安装
# 下载源码
git clone https://github.com/alibaba/nacos.git

# 安装到本地仓库
cd nacos/
mvn -Prelease-nacos clean install -U

# 启动服务
cd distribution/target/nacos-server-0.7.0/nacos/bin
startup.cmd

实现基于 Feign 的注册方案

Dubbo

API
Provider
	@Service
Comsumer
	@Reference
	

Spring Cloud Alibaba

Feign(HttpClient)
Comsumer
	@FeignClient()

由于 Nacos、Dubbo、Spring Cloud Alibaba 都是阿里系产品,所以我们可以很容易的将 Dubbo 和 Http 服务注册到 Nacos 中。

此时服务提供者即注册了 Dubbo 又注册了 Http 服务,服务消费者根据配置方式可以在 Dubbo 与 Http 调用中随意切换

服务提供者

服务提供者在使用 Dubbo 注册服务时是需要使用 @Service 注解将服务注册到注册中心的,现在改用 @FeignClient 注解来注册

spring-cloud-alibaba-dubbo-provider-api 项目中定义的 API 接口为例

package com.funtl.alibaba.dubbo.provider.service;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;

@FeignClient("provider")
public interface ProviderService {
    @GetMapping("/hi")
    String hi();
}

spring-cloud-alibaba-dubbo-provider-service 项目中实现接口为例

package com.funtl.alibaba.dubbo.provider.service.impl;

import com.funtl.alibaba.dubbo.provider.service.ProviderService;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ProviderServiceImpl implements ProviderService {
    @Override
    public String hi() {
        return "Hi Spring Cloud Alibaba Dubbo";
    }
}

以上代码是一个典型的 Spring Cloud RESTFul API,服务提供者需要做的就是引入 Dubbo 相关依赖
扫描包含 @FeignClient 注解的类并注册到 Nacos 即可,关键代码在 spring-cloud-alibaba-dubbo-core 项目的 FeignClientToDubboProviderBeanPostProcessor 类中

    /**
     * Registers Beans whose classes was annotated {@link FeignClient}
     *
     * @param packagesToScan The base packages to scan
     * @param registry       {@link BeanDefinitionRegistry}
     */
    private void registerServiceBeans(Set<String> packagesToScan, BeanDefinitionRegistry registry) {

        DubboClassPathBeanDefinitionScanner scanner =
                new DubboClassPathBeanDefinitionScanner(registry, environment, resourceLoader);

        BeanNameGenerator beanNameGenerator = resolveBeanNameGenerator(registry);

        scanner.setBeanNameGenerator(beanNameGenerator);

        scanner.addIncludeFilter(new AnnotationTypeFilter(FeignClient.class, true, true));

        for (String packageToScan : packagesToScan) {

            // Registers @Service Bean first
            scanner.scan(packageToScan);

            // Finds all BeanDefinitionHolders of @Service whether @ComponentScan scans or not.
            Set<BeanDefinitionHolder> beanDefinitionHolders =
                    findServiceBeanDefinitionHolders(scanner, packageToScan, registry, beanNameGenerator);

            if (!CollectionUtils.isEmpty(beanDefinitionHolders)) {

                for (BeanDefinitionHolder beanDefinitionHolder : beanDefinitionHolders) {
                    registerServiceBean(beanDefinitionHolder, registry, scanner);
                }

                if (logger.isInfoEnabled()) {
                    logger.info(beanDefinitionHolders.size() + " annotated Dubbo's @Service Components { " +
                            beanDefinitionHolders +
                            " } were scanned under package[" + packageToScan + "]");
                }

            } else {

                if (logger.isWarnEnabled()) {
                    logger.warn("No Spring Bean annotating Dubbo's @Service was found under package["
                            + packageToScan + "]");
                }

            }

        }

    }

服务消费者

服务消费者需要依赖 spring-cloud-alibaba-dubbo-provider-api,并直接使用 @Autowired 注解即可实现注入,可以不使用 Dubbo 提供的 @Reference 注解

package com.funtl.alibaba.dubbo.consumer.service;

import com.funtl.alibaba.dubbo.provider.service.ProviderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestService {

    @Autowired
    private ProviderService providerService;

    @GetMapping("/test")
    public String test() {
        return providerService.hi();
    }
}

以上代码是一个典型的 Spring Cloud Feign 调用。我们只需要替换 Feign 的实现。产生 ProviderService 接口的 ProxyBean 时,使用 Dubbo 产生的 Bean 替换默认的 Feign 产生的 RESTFul 调用的 Bean 即可,关键代码在 spring-cloud-alibaba-dubbo-core 项目的 DubboFeignBuilder 类中

    @Override
    public <T> T target(Target<T> target) {
        ReferenceBeanBuilder beanBuilder = ReferenceBeanBuilder
                .create(defaultReference, target.getClass().getClassLoader(), applicationContext)
                .interfaceClass(target.type());

        try {
            T object = (T) beanBuilder.build().getObject();
            return object;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

消费者使用 RESTFul 调用

只需将 Dubbo 相关依赖排除即可

<dependency>
    <groupId>com.funtl</groupId>
    <artifactId>spring-cloud-alibaba-dubbo-starter</artifactId>
    <exclusions>
        <exclusion>
            <groupId>com.funtl</groupId>
            <artifactId>spring-cloud-alibaba-dubbo-core</artifactId>
        </exclusion>
        <exclusion>
            <groupId>com.alibaba.boot</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
        </exclusion>
    </exclusions>
</dependency>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring Cloud Alibaba Dubbo 的相关文章

随机推荐

  • 指针仪表角度检测和读数

    指针仪表识别的方法 主要流程是 1 检测仪表所在的位置 提取出来 该方法有两条路径实现 1 霍夫圆形检测 2 机器学习训练 2 检测仪表圆盘的位置后 用霍夫直线检测指针 3 去除无关直线干扰 提取正确的角度 4 判断指针所在的区域 下面两个
  • labview2015->matlab2015b->veristand2015s p1安装顺序

    安装完相应的软件后 安装顺序 labview2015 gt matlab2015b gt veristand2015s p1 如果两者关联成功后 运行matlab后会在matlab命令窗口前两行显示 NI VeriStand 2015 SP
  • Redis缓存击穿,缓存穿透,缓存雪崩,附解决方案

    前言 在日常的项目中 缓存的使用场景是比较多的 缓存是分布式系统中的重要组件 主要解决在高并发 大数据场景下 热点数据访问的性能问题 提高性能的数据快速访问 本文以Redis作为缓存时 针对常见的缓存击穿 缓存穿透 缓存雪崩问题做简单地说明
  • dell 台式机bios虚拟化_怎么开启VT虚拟化功能,BIOS中怎么开启虚拟技术,经验告诉你该这样...

    很多人都不知道BIOS中怎么开启虚拟技术 下面我们就一起来看看吧 操作方法 01 首先在开机的时候按住对应的键进入BIOS 组装机以主板分 华硕按F8 Intel按F12 其他品牌按ESC F11或F12 笔记本以品牌分 联想ThinkPa
  • Proxy error: Could not proxy request //sysTenant/getTenantDropDownList from localhost:9528 to http:/

    一 项目背景 提示 这里简述报错问题背景 当我们开发完前端一个功能之后运行调试时 通常前后端分离情况下 前 后端程序都运行起来之后 会出现 协议 域名 端口不一致的形况 此时前端调用后端接口时就会产生跨域问题 可以在前端设置代理解决 vue
  • 区块链技术框架

    当前主流的区块链架构包含六个层级 网络层 数据层 共识层 激励层 合约层和应用层 图中将数据层和网络层的位置进行了对调 主要用途将在下一节中详述 网络层 区块链网络本质是一个P2P Peer to peer点对点 的网络 网络中的资源和服务
  • 再战WebGoat之代码审计

    声明 好好学习 天天向上 回想首次接触webgoat已是两年前 当时可能连漏洞原理都不是很明白就开始上手靶场了 也是搜了很多文章 还用的word的方式写的草稿 惭愧惭愧 webgoat一直是我心中高质量的靶场 其实当时发布文章时 我就一直在
  • github趋势追踪 2023年5月25日

    1 text2vec text2vec是一个文本向量表征工具 它可以将文本转化为向量矩阵 这个项目实现了多种文本表征和文本相似度计算模型 如Word2Vec RankBM25 Sentence BERT和CoSENT等 使用text2vec
  • 小车PCB板视觉分拣软件

    小车PCB板视觉分拣软件 前言 赛题内容 视觉算法 算法选择 算法实现过程 读入Train并创建模板 读入Test数据 图像预处理与视觉分拣 实际效果 指定读入 顺序读入 其他 UI界面设计 数据库 DEMO分享 前言 智能制造赛是中国机械
  • Qt 中开启线程的五种方式

    作者 billy 版权声明 著作权归作者所有 商业转载请联系作者获得授权 非商业转载请注明出处 简介 在开发过程中 使用线程是经常会遇到的场景 本篇文章就来整理一下 Qt 中使用线程的五种方式 方便后期回顾 前面两种比较简单 一笔带过了 主
  • 命令行前边出现base

    问题 命令行开头出现base base lihongzhang home 原因 安装了conda引起的 默认启动命令行即自动进去conda环境 解决办法 方法1 退出conda环境 base lihongzhang home conda d
  • nodejs、npm、cnpm、yarn安装及环境配置

    一 nodejs的安装 1 官网下载对应系统安装包 https nodejs org en download 2 安装时注意修改安装目录 建议放在非C盘目录下 一路默认安装即可 3 安装完成后启动命令行工具 输入 node v npm v
  • too much data for RSA block .关于RSA算法密钥长度/密文长度/明文长度

    今天在做RSA加密的时候遇到了一个这样的错误 ArrayIndexOutOfBoundsException too much data for RSA block 查询相关资料后得知该错误是加密数据过长导致的 加密数据长度 lt 模长 11
  • 各linux操作系统查看内核版本命令

    原文出处 https linuxlog cyou post 18297 html 默认情况下 所有已安装的 Linux 内核及其相关文件都存储在 boot 目录 只需使用 find 查看已安装内核列表的命令 find boot vmli b
  • 智能合约 -- 安全考量

    相关概念 就是我们写代码是考虑这种涉及到合约安全的问题 下面这个方面写合约是重点考虑 创建消息发送以太币 1 要创建消息发送以太币 您需要构建一个有效的交易 并将其发送到以太坊网络中 2 交易被发送到以太坊网络后 会经过矿工的验证和打包 并
  • VMware 创建 ubuntu

    一 下载 ubuntu镜像 1 Ubuntu下载地址参考 下载链接 本人选择下载地址 http mirrors melbourne co uk ubuntu releases 2 本人选择下载 18 4 06版本 二 创建虚拟机 点击创建虚
  • python 安装pandas

    1 pandas有啥用 pandas 是基于NumPy 的一种工具 该工具是为了解决数据分析任务而创建的 Pandas 纳入了大量库和一些标准的数据模型 提供了高效地操作大型数据集所需的工具 pandas提供了大量能使我们快速便捷地处理数据
  • HarmonyOS扫码服务,应用服务一扫直达打造系统级流量新入口

    二维码如今是移动应用流量入口以及功能实现的重要工具 也是各App的流量入口 是物 人 服务的连接器 通过扫码我们可以更便捷的生活 更高效的进行信息交互 包括信息的发布 信息的获取 在日常扫码过程中 我们也经常会遇到扫码环境暗 二维码污损 模
  • 中国现代服务业发展趋势及十四五战略模式研究报告2021-2027年

    中国现代服务业发展趋势及十四五战略模式研究报告2021 2027年 全新修订 2021年11月 报告价格 纸质版 6500元 电子版 6800元 纸质 电子 7000元 可以优惠 服务形式 文本 电子版 光盘 联 系 人 顾言 撰写单位 鸿
  • Spring Cloud Alibaba Dubbo

    Spring Cloud Alibaba Dubbo 为什么 是什么 怎么做 为什么 单体应用 单体服务经过长期的迭代更新 逐渐走向代码臃肿 高耦合 这显然与我们软件开发设计理念高内聚 低耦合背道而驰 从而难以维护 市场需求也在逐渐要求服务