线下Springboot+dubbo应用迁kubernetes方案

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 随着微服务应用架构的兴起,当前很多用户在开发测试生产上已经采用微服务的理念进行应用的架构设计及部署。常用的框架比如dubbo,springcloud等都已经在大规模进行使用了。当前kubernetes云原生应用的最佳部署平台,如何将线下的微服务应用迁移到kubernetes成为用户的一个难题,本文将以springboot+dubbo为例进行迁移的方案介绍。

    随着微服务应用架构的兴起,当前很多用户在开发测试生产上已经采用微服务的理念进行应用的架构设计及部署。常用的框架比如dubbo,springcloud等都已经在大规模进行使用了。当前kubernetes云原生应用的最佳部署平台,如何将线下的微服务应用迁移到kubernetes成为用户的一个难题,本文将以springboot+dubbo为例进行迁移的方案介绍。

1 典型的spring+dubbo例子

1.1 环境及工具

运行环境:JDK 8,Maven 3.3

技术栈:springboot 2.0,dubbo 2.6,zookeeper 3.3

工具:IntelliJ IDEA

1.2 Springboot快速集成dubbo的挂件依赖

Dubbo采用全Spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用Spring加载Dubbo的配置即可,Dubbo基于Spring的Schema扩展进行加载。

本例中dubbo采用zookeeper作为注册中心。Dubbo及zookeeper的安装方式请参考官方指导。

<dependency>

    <groupId>com.alibaba.boot</groupId>

    <artifactId>dubbo-spring-boot-starter</artifactId>

    <version>0.2.0</version>

</dependency>

a3f48d7a22dbb9803c8e1116dfbdc18ebd704e88

1.3 服务提供者和消费者示例代码

1.3.1 dubbo服务注册及消费流程

在使用dubbo的时候需要清除服务提供者(provider)和服务消费者(consumer)。流程如下:

1.      服务提供者在服务启动的时候向注册中心注册自己提供的服务;

2.      服务消费者在启动的时候向注册中心注册自己所需的服务;

3.      注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者;

4.      服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用;

5.      服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

1.3.2 目录结构

8a2180e6f1b0806915c4e8c102179598a3932de0

       Dubbo-api里面定义了服务接口,由服务提供者和服务消费者共同调用;

       Dubbo-consumer中定义了一个提供外部url访问的类,并且在该类中实现了从dubbo中的消费接口。

       Dubbo-provider中定义了向dubbo注册的服务。

1.3.3 定义服务接口

    定义的服务接口在服务提供者和服务消费者中共同使用。

f8bee0c79ccfe4c9a6d4b9ca37e23a8747ca8e1a

1.3.4 服务提供方

在服务提供方实现服务接口,该接口的实现方式对消费者是隐藏的。简单来说就是将上面接口的实现方法(称之为服务)注册到zookeeper上,并暴露端口供其他消费者消费。@Service里面的一些信息就是服务具体的注册地址。

a111d21e332939fe93b8f30803a607daff3da4fc

      

       服务提供方与dubbo的配置如下;

c6adda427c93dc0b1e8063611e33e22c8d41c1f4

1.3.5 服务消费方

       服务消费方主要完成服务接口的调用,调用方式与本地调用是一样的,但是服务的地址来自于注册在dubbo上的远程地址。

f61c52b8dd9a6adc59de42e5918787d0deb2fb8b

       服务消费方的配置与服务提供方的配置基本一致:

43a8e86b561e7db8f198db2440344b64862bc1db

1.3.6 启动服务提供者和服务消费者

     在本示例中,服务提供者接收到调用请求会返回  "Hello, " + 传入的字符串 + " (from Spring Boot)"。服务消费者会提供一个url访问方式,并在url中获取调用服务使用的字符串。

    操作:

1、运行dubbo-provider中的DemoServiceImpl和dubbo-consumer中的DemoConsumerController两个类;

2、此时服务消费方提供一个url访问接口,在浏览器中输入http://localhost:9091/sayHello/HelloWorld

b633340bda6242d46b60aa92d5021bb5d3cddb1a

2 迁移到kubernetes的方案

2.1 dubbo注册中心部署

       dubbo的注册中心有很多种,主流的用法是将zookeeper作为dubbo的注册中心。Dubbo的注册中心可以放在集群内部部署也可以放在集群外部部署。

       在这里考虑到注册中心是有状态的服务,我们可以在kubernetes上部署,也可以在集群外的ECS上部署。

2.1.1 在集群外部部署

       如果dubbo部署在集群之外,需要集群中的部署的应用(服务提供者和服务消费者)需要能够访问dubbo所在的网络即可。

2.1.2 在集群内部部署

       如果dubbo部署在集群内部需要做以下事情:

                   i.           制作dubbo的相关镜像并部署在kubernetes平台;

                 ii.           为dubbo应用创建service,可以为clusterIP和LoadBalancer类型,如果用到LoadBalancer类型,可以创建内网slb;

                iii.           应用可以通过dubbo的service name、clusterIP或者内网SLB地址进行访问。

2.2 服务提供者和服务消费者全部在集群内调用

应用改造及部署

       在该种情况下,应用不需要进行改造,在application.properties文件中需要更改下dubbo.registry.address中dubbo的地址。如下图:

c720320d87d5b5a14cbfb09e45a4ef505b2cb57e

同时在该种情况下,应用不需要关心自己注册到dubbo中的地址,因为在同一个集群中所有的pod地址默认是通的,并且该默认情况下,应用会将pod的地址作为注册地址。 

2.3 服务提供者需要提供服务给集群外部的服务消费者

2.3.1 服务提供者与kubernetes集群都部署在阿里云上

2.3.1.1 在同一VPC中

       如果服务消费者与kubernetes集群在同一个VPC,那么只需要将将两者放到一个安全组中,保证能够互相访问即可。此时,部署在kubernetes集群上的应用是将pod IP地址注册在dubbo上。

        注意,此时pod的IP地址规划不能与其他VPC环境的IP段冲突。
2.3.1.2 在不同VPC中或线下IDC

       如果服务消费者与kubernetes集群不在同一个VPC中,则需要先打通两者的VPC环境,使两方的应用能够互通即可,显现IDC同理。此时,部署在kubernetes集群上的应用也是将pod IP地址注册在dubbo上。

       注意,此时pod的IP地址规划不能与其他VPC环境或者线下IDC环境的IP段冲突。

2.3.2 线下IDC内网(无法与VPC打通)应用改造及部署

     首先,在该种情况下,应用不需要进行改造,在application.properties文件中需要更改下dubbo.registry.address中dubbo的地址。如果dubbo部署在集群内,应用应该根据情况填写能够访问到的地址。

       其次,在部署应用前,需要先为该应用创建外网LoadBalancer类型的service,以便先获取到外网SLB的地址,在下面注册地址到dubbo的时候需要用。

最后,由于存在集群外部的应用交互调用,所以作为服务提供者不能使用pod地址,需要使用外网LoadBalancer类型service的地址。需要在application.properties中进行注册IP地址的更改。

       以上两步如下图所示:     

d245a9b76de49c661e04c779f83eed9774503e9e

参考文档:

       本文中使用的代码见GitHub:https://github.com/xiaoze-smirk/dubbo-springboot

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
Kubernetes Cloud Native 网络协议
Kubernetes 高可用性与灾难恢复方案
【8月更文第29天】随着业务的不断增长,保持应用程序的高可用性和灾难恢复能力变得越来越重要。Kubernetes 作为现代云原生应用的主要平台,提供了丰富的工具和方法来保证应用的高可用性以及快速恢复的能力。本文将详细介绍如何利用 Kubernetes 的功能来构建高可用性的系统,并实施有效的灾难恢复策略。
590 2
|
11月前
|
存储 运维 Kubernetes
正式开源,Doris Operator 支持高效 Kubernetes 容器化部署方案
飞轮科技推出了 Doris 的 Kubernetes Operator 开源项目(简称:Doris Operator),并捐赠给 Apache 基金会。该工具集成了原生 Kubernetes 资源的复杂管理能力,并融合了 Doris 组件间的分布式协同、用户集群形态的按需定制等经验,为用户提供了一个更简洁、高效、易用的容器化部署方案。
484 16
正式开源,Doris Operator 支持高效 Kubernetes 容器化部署方案
|
10月前
|
Kubernetes 持续交付 开发工具
阿里云协同万兴科技落地ACK One GitOps方案,全球多机房应用自动化发布,效率提升50%
阿里云协同万兴科技落地ACK One GitOps方案,全球多机房应用自动化发布,效率提升50%
368 2
|
10月前
|
Kubernetes 持续交付 开发工具
阿里云协同万兴科技落地ACK One GitOps方案,全球多机房应用自动化发布,效率提升50%
阿里云协同万兴科技落地ACK One GitOps方案,全球多机房应用自动化发布,效率提升50%
|
12月前
|
决策智能 数据库 开发者
使用Qwen2.5+SpringBoot+SpringAI+SpringWebFlux的基于意图识别的多智能体架构方案
本项目旨在解决智能体的“超级入口”问题,通过开发基于意图识别的多智能体框架,实现用户通过单一交互入口使用所有智能体。项目依托阿里开源的Qwen2.5大模型,利用其强大的FunctionCall能力,精准识别用户意图并调用相应智能体。 核心功能包括: - 意图识别:基于Qwen2.5的大模型方法调用能力,准确识别用户意图。 - 业务调用中心:解耦框架与业务逻辑,集中处理业务方法调用,提升系统灵活性。 - 会话管理:支持连续对话,保存用户会话历史,确保上下文连贯性。 - 流式返回:支持打字机效果的流式返回,增强用户体验。 感谢Qwen2.5系列大模型的支持,使项目得以顺利实施。
3496 8
使用Qwen2.5+SpringBoot+SpringAI+SpringWebFlux的基于意图识别的多智能体架构方案
|
11月前
|
缓存 容灾 网络协议
ACK One多集群网关:实现高效容灾方案
ACK One多集群网关可以帮助您快速构建同城跨AZ多活容灾系统、混合云同城跨AZ多活容灾系统,以及异地容灾系统。
|
12月前
|
人工智能 Kubernetes 安全
赋能加速AI应用交付,F5 BIG-IP Next for Kubernetes方案解读
赋能加速AI应用交付,F5 BIG-IP Next for Kubernetes方案解读
254 13
|
12月前
|
缓存 NoSQL Java
Spring Boot中的分布式缓存方案
Spring Boot提供了简便的方式来集成和使用分布式缓存。通过Redis和Memcached等缓存方案,可以显著提升应用的性能和扩展性。合理配置和优化缓存策略,可以有效避免常见的缓存问题,保证系统的稳定性和高效运行。
349 3
|
easyexcel Java UED
SpringBoot中大量数据导出方案:使用EasyExcel并行导出多个excel文件并压缩zip后下载
在SpringBoot环境中,为了优化大量数据的Excel导出体验,可采用异步方式处理。具体做法是将数据拆分后利用`CompletableFuture`与`ThreadPoolTaskExecutor`并行导出,并使用EasyExcel生成多个Excel文件,最终将其压缩成ZIP文件供下载。此方案提升了导出效率,改善了用户体验。代码示例展示了如何实现这一过程,包括多线程处理、模板导出及资源清理等关键步骤。
|
Kubernetes API Docker
跟着iLogtail学习容器运行时与K8s下日志采集方案
iLogtail 作为开源可观测数据采集器,对 Kubernetes 环境下日志采集有着非常好的支持,本文跟随 iLogtail 的脚步,了解容器运行时与 K8s 下日志数据采集原理。

相关产品

  • 容器服务Kubernetes版