我的编程空间,编程开发者的网络收藏夹
学习永远不晚

DubboServiceMesh基础架构组件改造

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

DubboServiceMesh基础架构组件改造

前言

公司的分布式架构是基于Alibaba Dubbo实现的,微服务的相关治理也是基于Alibaba Dubbo做的,随着公司系统规模的增长服务发布,服务的治理,注册中心的压力,硬件成本等问题逐渐的凸显出来,尤其是服务发布和服务治理,比如多版本的发布,金丝雀发布,精细化的流量控制等,用Alibaba Dubbo实现这些分布式语义很麻烦,在Service Mesh架构下,解决这些问题都会变得容易,基于此,本篇介绍一下公司Dubbo项目Service Mesh改造方案。

其他基础架构

除了Alibaba Dubbo,公司使用Zookeeper作为配置中心,分布式消息队列rocketmq,分布式缓存redis,阿里云分库分表产品DRDS,阿里云关系型数据库RDS,这些基础组件在整个Service Mesh架构的改造中是不变的。

Dubbo项目Service Mesh改造具体实现 基础技术方案

Dubbo架构改造成Service Mesh架构就要Dubbo框架从项目中移除,我们这里将Dubbo框架移除,并且将服务端接口全部改造成rest接口,这就需要服务端使用新的容器发布rest接口,所以干脆就将项目改造成Sping Boot Web应用,协议问题没有了,但是如何尽可能改动小的能够让消费端快速的接入Sping Boot Web应用的服务端就成为了难点,由于Dubbo项目API模块的作用与Spring Cloud Feign模块的作用十分相似,模块内都是一些interface,需要服务端定义xxxServiceImpl去实现各个interface,然后消费者通过Spring依赖注入将interface注入并使用,这就使得Dubbo最复杂的服务间调用方式有了解决的方案。

基础组件改造

  • 根pom.xml引入SpringBoot parent,增加 spring-cloud-dependencies import引用
  • 删除所有dubbo相关引用。

这一步骤简单来说就是将pom.xml中Dubbo的所有jar依赖全部删除,并且引入SpringBoot parent和 spring-cloud-dependencies的引用,例如:

改造前:

<?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">
    <modelVersion>4.0.0</modelVersion>
    <dependencies>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.8.4</version>
            <exclusions>
                <exclusion>
                    <artifactId>slf4j-log4j12</artifactId>
                    <groupId>org.slf4j</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>log4j</artifactId>
                    <groupId>log4j</groupId>
                </exclusion>
                <exclusion>
                    <groupId>org.apache.curator</groupId>
                    <artifactId>curator-client</artifactId>
                </exclusion>
                <exclusion>
                    <artifactId>curator-framework</artifactId>
                    <groupId>org.apache.curator</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.github.sgroschupf</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.1</version>
            <exclusions>
                <exclusion>
                    <artifactId>zookeeper</artifactId>
                    <groupId>org.apache.zookeeper</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.6</version>
            <!-- 移除log4j的打印框架,否则,log 4j日志不生效 -->
            <exclusions>
                <exclusion>
                    <artifactId>slf4j-log4j12</artifactId>
                    <groupId>org.slf4j</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>log4j</artifactId>
                    <groupId>log4j</groupId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>
</project>

改造后:

<?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">
    <modelVersion>4.0.0</modelVersion>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
            <version>2.2.3.RELEASE</version>
            <exclusions>
                <exclusion>
                    <artifactId>slf4j-api</artifactId>
                    <groupId>org.slf4j</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>feign-hystrix</artifactId>
                    <groupId>io.github.openfeign</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
                    <groupId>org.springframework.cloud</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-cloud-starter-netflix-archaius</artifactId>
                    <groupId>org.springframework.cloud</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-cloud-netflix-ribbon</artifactId>
                    <groupId>org.springframework.cloud</groupId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>
</project>

Dubbo门面API改造

  1. pom.xml增加spring-cloud-starter-openfeign引用。
  2. 删除所有Dubbo相关引用Dubbo相关配置文件。
  3. Dubbo原有API接口是标准的JAVA接口定义,与Feign Restful接口定义十分类似。这里可以在原有的API接口基础上增加 @FeignClient@RequestMapping等注解,将一个普通的API接口改造成一个Feign Restful接口,后续会使用Feign这个 Restful框架来处理服务间调用等问题。由于Feign本身是自带了Ribbon负载均衡,服务访问者经过负载均衡后会找到服务提供者的一个 IP+Port进行调用,这与K8S Service要求的服务名调用的方式相冲突,所以必须想办法去掉Feign自带的负载均衡。好在 @FeignClient可以手工指定一个固定的调用地址,这里可以把这个地址设置成K8S Servicename名称,从而实现了通过FeignK8S Service服务名调用的能力。此部分需要每个API接口增加注解一次,改造工作量相对可控。
  4. 由于Feign要求接口使用Restful格式,所以接口中的每个抽象方法都必须添加@RequestMapping,@GetMapping,@PostMapping等注解暴露成一个Restful资源地址。此部分改造涉及到每个API接口的每个抽象方法,是整个方案里改动量最大的一部分。
  5. 此部分整体改造工作量取决于原有的Dubbo项目包含多少个API接口,以及每个API包含多少个抽象方法。

改造前示例:

public interface IOdaApi {
    ModelsReturn<ModelsCommonResponse<ConsumptionODAResponse>> consumptionODA(ConsumptionODARequest consumptionODARequest);
    ModelsReturn<ModelsCommonResponse<RefundODAResponse>> refundODA(RefundODARequest refundODARequest);
    ModelsReturn<ModelsCommonResponse<ConsumptionODAResponse>> consumptionQueryODA( ConsumptionQueryODARequest consumptionQueryODARequest);
    ModelsReturn<ModelsCommonResponse<String>> repayODA(RepayODARequest repayODARequest);
}

改造后示例:

@FeignClient(name = "miss-xxx-svc", url = "http://miss-xxx-svc:8080")
public interface IOdaApi {
    @PostMapping(value = "/xxxService/consumptionODA")
    ModelsReturn<ModelsCommonResponse<ConsumptionODAResponse>> consumptionODA(@RequestBody ConsumptionODARequest consumptionODARequest);
}

Dubbo Provider端改造

  1. pom.xml增加spring-boot-starter-webspring-cloud-starter-openfeign等引用,同时增加SpringBoot mainClass 标准启动项配置。删除所有Dubbo相关引用、Dubbo相关配置文件。
  2. 增加SpringBoot启动类,增加@SpringBootApplication@EnableFeignClients两个注解,配置dubbo provider服务端口号。
  3. xxxServiceImpl服务实现类上增加@RestController注解,提供 consumer Restful 访问的能力。 这个需要每个服务实现类都加上@RestController注解,不要遗漏。
  4. 此部分大都属于一次性改动,改造工作量相对可控。

改造后示例:

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">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        ...
    </parent>
    <artifactId>MISS.xxxService</artifactId>
    <dependencies>
        <dependency>
            <groupId>com.xxx.xxx</groupId>
            <artifactId>MISS.xxxService.API</artifactId>
            <version>2.0.5-RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
    </dependencies>
    <build>
        ...
    </build>
</project>

改造后的 OdaImpl.java 代码示例(改造前只是缺少 @RestController 注解,其他代码完全一致):

@Slf4j
@RestController
public class OdaImpl implements IOdaApi {
    @Resource
    private OdaService odaService;
    @Override
    public ModelsReturn<ModelsCommonResponse<ConsumptionODAResponse>> consumptionODA(ConsumptionODARequest consumptionODARequest) {
        try {
            Validation.validate(consumptionODARequest);
            ...
            return ErrorCode.returnMsg(ErrorCode.OPSERATE_SUCCESS, odaService.consumptionODA(consumptionODARequest.getMultiIndustryInfo(),consumptionODA));

        } catch (Exception e) {
            log.error(LogUtil.exceptionMarker(), "ODA交易异常",e);
            return ErrorCode.returnMsgByErrorMessage(ErrorCode.PARA_ERROR, "ODA交易异常");
        }
    }
}

Dubbo Comsumer端改造

  • pom.xml增加spring-boot-starter-webspring-cloud-starter-openfeign等引用,同时增加SpringBoot mainClass 标准启动项配置。
  • 删除所有Dubbo相关引用、Dubbo相关配置文件。
  • 增加SpringBoot启动类,增加@SpringBootApplication@EnableFeignClients(需要配置 basePackages 扫描包路径) 两个注解,并配置dubbo consumer服务端口号。
  • 此部分大都属于一次性改动,改造工作量相对可控。

由于dubbo consumer项目改造与dubbo provider改造极其相似,这里不再贴出代码示例。

总结

至此Dubbo项目的Service Mesh改造就已经完成了,k8s + Istio的部署这里就不做介绍了,此方案是在我司成功落地的技术方案,并且使用次方案进行改造的服务也具有一定规模,目前生产环境还没有遇到任何问题。

此种改造方案改动量相对于完全的去掉dubbo而不使用feign改造的方式来说改动较小,如有更好的改造方案欢迎交流。

到此这篇关于Dubbo Service Mesh基础架构组件改造的文章就介绍到这了,更多相关Dubbo Service Mesh内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

DubboServiceMesh基础架构组件改造

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

DubboServiceMesh基础架构组件改造

ServiceMesh这个“热”词是2016年9月被“造”出来,而今年2018年更是被称为serviceMesh的关键之年,各家大公司都希望能在这个思潮下领先一步
2023-03-02

Dubbo Service Mesh基础架构组件源码分析

这篇文章主要讲解了“Dubbo Service Mesh基础架构组件源码分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Dubbo Service Mesh基础架构组件源码分析”吧!其他基
2023-07-05

使用C++的云计算基础:架构与组件

答案:c++++ 中的云计算架构包含三个层:iaas(基本资源)、paas(应用程序环境)和 saas(现成应用程序)。组件:计算实例:可伸缩虚拟服务器存储:数据和应用程序文件存储数据库:结构化数据管理和存储网络:连接计算实例、存储和数据库
使用C++的云计算基础:架构与组件
2024-05-12

云服务器基础架构有哪些组成

服务器硬件服务器硬件是服务器的基础,包括服务器主板、CPU、内存、硬盘等。云服务器通常使用虚拟化技术将多个物理服务器整合为一个虚拟服务器,从而减少了服务器的硬件数量和成本。网络软件网络软件是云服务器的核心组成部分,包括防火墙、负载均衡器、流量控制器等。这些软件可以将不同服务器之间的数据流量进行隔离和分配,确保服务器的安
云服务器基础架构有哪些组成
2023-10-28

亚马逊云服务器基础架构包括哪些部分组成

硬件和基础设施:亚马逊云服务器通常采用多种硬件设备,如刀片服务器、机架式服务器、塔式服务器、S3存储、网络交换机、负载均衡器、交换机和GPU加速器等。这些设备可根据不同的应用场景和数据存储需求进行组合和配置。软件和操作系统:亚马逊云服务器提供多种操作系统,如Apache、TurboGear、Kubernetes等,以满足不同的业务需求。此外,亚马逊云还提供了一系列安全和管理工具,如AWSLB、KubernetesSecurity和AW...
2023-10-27

微信小程序基本架构与组件是什么

微信小程序基本架构由三部分组成:逻辑层、视图层和微信客户端。逻辑层:逻辑层主要负责处理小程序的逻辑,包括数据处理、页面跳转、事件处理等。开发者可以使用JavaScript语言编写逻辑层的代码,通过调用微信提供的API来实现各种功能。视图层:
微信小程序基本架构与组件是什么
2024-04-09

亚马逊云服务器基础架构包括什么模块组成

云基础设施:包括服务器、存储和网络设备等,用于为亚马逊云平台提供计算、存储和数据处理等服务。数据库:用于存储和管理数据,包括SQLServer、MySQL、PostgreSQL等常见的数据库类型。操作系统:包括Apache、Nginx、Lighttpd等开源的服务器操作系统,以及用于构建云计算应用程序的Java、Python等开发语言。API(应用程序接口):亚马逊云平台上的API接口,用于与第三方应用程序和服务进行交互。这些API可...
2023-10-27

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录