线下Springboot+dubbo应用迁kubernetes方案

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 随着微服务应用架构的兴起,当前很多用户在开发测试生产上已经采用微服务的理念进行应用的架构设计及部署。常用的框架比如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

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
3月前
|
小程序 数据可视化 Java
Java+后端Spring boot 开发的全套UWB定位方案,0.1米高精度定位系统源码
UWB定位系统由硬件定位设备、定位引擎和应用软件组成。该定位系统应用软件支持PC端和移动端访问,并提供位置实时显示、历史轨迹回放、人员考勤、电子围栏、行为分析、智能巡检等功能。定位精度高达10cm,同时具备高动态、高容量、低功耗的优点。应用场景包括:隧道、化工、工厂、煤矿、工地、电厂、养老、展馆、整车、机房、机场等。
75 8
|
13天前
|
Kubernetes Cloud Native 网络协议
Kubernetes 高可用性与灾难恢复方案
【8月更文第29天】随着业务的不断增长,保持应用程序的高可用性和灾难恢复能力变得越来越重要。Kubernetes 作为现代云原生应用的主要平台,提供了丰富的工具和方法来保证应用的高可用性以及快速恢复的能力。本文将详细介绍如何利用 Kubernetes 的功能来构建高可用性的系统,并实施有效的灾难恢复策略。
33 1
|
4月前
|
存储 数据采集 Kubernetes
一文详解K8s环境下Job类日志采集方案
本文介绍了K8s中Job和Cronjob控制器用于非常驻容器编排的场景,以及Job容器的特点:增删频率高、生命周期短和突发并发大。文章重点讨论了Job日志采集的关键考虑点,包括容器发现速度、开始采集延时和弹性支持,并对比了5种采集方案:DaemonSet采集、Sidecar采集、ECI采集、同容器采集和独立存储采集。对于短生命周期Job,建议使用Sidecar或ECI采集,通过调整参数确保数据完整性。对于突发大量Job,需要关注服务端资源限制和采集容器的资源调整。文章总结了不同场景下的推荐采集方案,并指出iLogtail和SLS未来可能的优化方向。
146 1
|
17天前
|
Kubernetes 文件存储 容器
【Azure K8S | AKS】在中国区AKS上遇见ImagePullBackOff时的替代方案
【Azure K8S | AKS】在中国区AKS上遇见ImagePullBackOff时的替代方案
|
19天前
|
存储 Prometheus Kubernetes
在K8S中,如何收集K8S日志?有哪些方案?
在K8S中,如何收集K8S日志?有哪些方案?
|
27天前
|
Dubbo Java Nacos
【实战攻略】破解Dubbo+Nacos+Spring Boot 3 Native打包后运行异常的终极秘籍——从零开始彻底攻克那些让你头疼不已的技术难题!
【8月更文挑战第15天】Nacos作为微服务注册与配置中心受到欢迎,但使用Dubbo+Nacos+Spring Boot 3进行GraalVM native打包后常遇运行异常。本文剖析此问题及其解决策略:确认GraalVM版本兼容性;配置反射列表以支持必要类和方法;采用静态代理替代动态代理;检查并调整配置文件;禁用不支持的功能;利用日志和GraalVM诊断工具定位问题;根据诊断结果调整GraalVM配置。通过系统排查方法,能有效解决此类问题,确保服务稳定运行。
48 0
|
2月前
|
Kubernetes Dubbo Cloud Native
如何将Dubbo应用接入服务网格
介绍使用传统Dubbo微服务体系的客户要如何将自己的服务接入到服务网格这一新一代云原生基础设施。
|
2月前
|
监控 Dubbo 应用服务中间件
通用快照方案问题之Sentinel与SpringCloud和Dubbo的整合如何解决
通用快照方案问题之Sentinel与SpringCloud和Dubbo的整合如何解决
36 0
|
3月前
|
Dubbo Java 应用服务中间件
Spring Boot 调用 Dubbo 接口与编写 Dubbo 接口实战
Spring Boot 调用 Dubbo 接口与编写 Dubbo 接口实战
282 1
|
3月前
|
缓存 NoSQL Java
案例 采用Springboot默认的缓存方案Simple在三层架构中完成一个手机验证码生成校验的程序
案例 采用Springboot默认的缓存方案Simple在三层架构中完成一个手机验证码生成校验的程序
87 5

相关产品

  • 容器服务Kubernetes版