文章详情

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

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2023-07-05 08:22

关注

这篇文章主要讲解了“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中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@RestControllerpublic 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端改造

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

感谢各位的阅读,以上就是“Dubbo Service Mesh基础架构组件源码分析”的内容了,经过本文的学习后,相信大家对Dubbo Service Mesh基础架构组件源码分析这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

阅读原文内容投诉

免责声明:

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

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

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯