线下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

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务&nbsp;ACK 容器服务&nbsp;Kubernetes&nbsp;版(简称&nbsp;ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情:&nbsp;https://www.aliyun.com/product/kubernetes
目录
相关文章
|
2月前
|
存储 运维 Kubernetes
批处理及有状态等应用类型在 K8S 上应该如何配置?
批处理及有状态等应用类型在 K8S 上应该如何配置?
|
5天前
|
Kubernetes 监控 Cloud Native
构建高效云原生应用:基于Kubernetes的微服务治理实践
【4月更文挑战第13天】 在当今数字化转型的浪潮中,企业纷纷将目光投向了云原生技术以支持其业务敏捷性和可扩展性。本文深入探讨了利用Kubernetes作为容器编排平台,实现微服务架构的有效治理,旨在为开发者和运维团队提供一套优化策略,以确保云原生应用的高性能和稳定性。通过分析微服务设计原则、Kubernetes的核心组件以及实际案例,本文揭示了在多变的业务需求下,如何确保系统的高可用性、弹性和安全性。
11 4
|
6天前
|
JSON Kubernetes Go
无缝集成:在IntelliJ IDEA中利用Kubernetes插件轻松管理容器化应用
无缝集成:在IntelliJ IDEA中利用Kubernetes插件轻松管理容器化应用
15 0
无缝集成:在IntelliJ IDEA中利用Kubernetes插件轻松管理容器化应用
|
17天前
|
消息中间件 Kubernetes Kafka
Terraform阿里云创建资源1分钟创建集群一键发布应用Terraform 创建 Kubernetes 集群
Terraform阿里云创建资源1分钟创建集群一键发布应用Terraform 创建 Kubernetes 集群
14 0
|
25天前
|
SQL 监控 Java
nacos常见问题之dubbo+nacos+springboot3的native打包成功后运行出现异常如何解决
Nacos是阿里云开源的服务发现和配置管理平台,用于构建动态微服务应用架构;本汇总针对Nacos在实际应用中用户常遇到的问题进行了归纳和解答,旨在帮助开发者和运维人员高效解决使用Nacos时的各类疑难杂症。
33 2
|
28天前
|
边缘计算 Kubernetes 负载均衡
容器编排技术在云计算中的应用
随着云计算技术的飞速发展,容器编排技术作为一种重要的部署和管理工具,正在逐渐成为云计算领域的热门话题。本文将介绍容器编排技术在云计算中的应用,探讨其在提高应用程序部署效率、资源利用率以及系统可靠性方面的优势,并分析其未来发展趋势。
|
29天前
|
人工智能 自然语言处理 Kubernetes
LLM 技术图谱(LLM Tech Map)& Kubernetes (K8s) 与AIGC的结合应用
LLM 技术图谱(LLM Tech Map)& Kubernetes (K8s) 与AIGC的结合应用
58 0
|
1月前
|
Dubbo Java 应用服务中间件
Spring Boot整合Dubbo+Zookeeper实现RPC调用
Spring Boot整合Dubbo+Zookeeper实现RPC调用 技术栈说明 Dubbo:Dubbo作为RPC框架,能在多个服务之间实现远程服务的调用。比如有两个独立的微服务A和B,A服务想要调用B服务时,因为两者不在同个内存空间中,不能直接调用,所以可以通过Dubbo实现这点。 功能和Spring Cloud的Feign相同,两者都是应用于微服务架构的远程调用框架 Zookeeper:作为注册中心去管理Dubbo服务,这点和Eureka、Nacos相同。 概述 通过一个示例说明Dubbo+Zookeeper在Spring Boot中的应用。 现有两个服务provider和con
114 4
|
2月前
|
JavaScript NoSQL Redis
深入浅出:使用 Docker 容器化部署 Node.js 应用
在当今快速发展的软件开发领域,Docker 作为一种开源的容器化技术,已经成为了提高应用部署效率、实现环境一致性和便于维护的关键工具。本文将通过一个简单的 Node.js 应用示例,引导读者从零开始学习如何使用 Docker 容器化技术来部署应用。我们不仅会介绍 Docker 的基本概念和操作,还会探讨如何构建高效的 Docker 镜像,并通过 Docker Compose 管理多容器应用。此外,文章还将涉及到一些最佳实践,帮助读者更好地理解和应用 Docker 在日常开发和部署中的强大功能。
60 0
|
2月前
|
消息中间件 Kubernetes NoSQL
「译文」K8S 及 OpenShift 上应用程序的 Labels 和 Annotations 最佳实践
「译文」K8S 及 OpenShift 上应用程序的 Labels 和 Annotations 最佳实践

相关产品

  • 容器服务Kubernetes版
  • 推荐镜像

    更多