在阿里云容器服务上开发基于Docker的Spring Cloud微服务应用(五)

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 本文讨论了如何利用zuul实现服务智能路由,以及对外通过阿里云SLB实现对zuul的负载均衡。

服务智能路由

本文为阿里云容器服务Spring Cloud应用开发系列文章的第五篇,讨论如何利用Spring Cloud 对 Netflix Zuul支持,完成服务的职能路由功能。

一、在阿里云容器服务上开发Spring Cloud微服务应用

二、部署Spring Cloud应用示例

三、服务发现

四、服务间通信与集成

五、服务智能路由(本文)

六、集中配置管理

七、高可用和容错

八、监控和日志

九、服务的部署和发布策略

使用Zuul构建简单API Gateway

在手机端完成一个功能有可能需要调用多个后台的服务,如果从手机端完成所有调用,可能造成调用次数很多,通信时间过长。由于手机电量的限制,一般也不建议多次调用后台服务。

一个可行的办法是将所有相关的服务聚合起来,生成一个新的服务。新的服务作为入口点,前端应用只需调用一次,就完成了原来多次调用。并且,对于服务调用的处理也可以在新的服务中完成,更减轻了前端的处理压力。相关的代码在foobar中展示。

我们还可以利用Spring Cloud Zuul构建的一个API Gateway将foobar和其它需要对外提供服务的应用暴露出来。我们可以通过Zuul的配置文件声明对外的服务的URL模式等信息,可以非常简单地将服务对外输出。这部分示例代码为commons/gateway

Zuul是多实例的,对Zuul也需要负载均衡。在阿里云上,我们可以定义一个SLB来实现对Zuul的对外输出和负载均衡。相关的部署模版声明在docker-compose.yml中。

build.gradle中引入Zuul依赖

gateway服务使用Eureka进行服务的发现,所以在build.gradle不但由Zuul,还有对Eureka的依赖。

dependencies {
    compile('org.springframework.cloud:spring-cloud-starter-zuul')
    compile('org.springframework.cloud:spring-cloud-starter-eureka')
   ...

注解

在主class上添加@EnableZuulProxy,声明该应用使用Zuul提供服务路由能力;添加@EnableDiscoveryClient注解表示该应用内置服务发现客户端。由于在build.gradle中引入了Eureka,所以客户端会自动通过Eureka发现服务。

@SpringBootApplication
@EnableZuulProxy
@EnableDiscoveryClient
public class GatewayApplication {

    public static void main(String[] args) {
        SpringApplication.run(GatewayApplication.class, args);
    }
}

application.yml中定义对服务的访问

application.yml中定义gateway侦听固定的端口8080,在zuul.routes.foobar.path定义所有对本机/acs/***访问都指向foobar服务。

zuul通过Eureka发现所有foobar服务,具体Eureka的配置和前文相同。

server:
  port: 8080

eureka:
  ...

zuul:
  routes:
    foobar:
      path: /acs/**
...

利用阿里云SLB进行负载均衡

gateway是服务的职能路由,内部的服务可以通过它对外暴露。如果我们想让gateway也是多个实例那么怎么将单一外部访问端点映射到多个gateway实例呢?

使用阿里云的SLB负载均衡可以达成这个目标。在阿里云容器服务提供了对docker compose模版的标签扩展,将服务声明为通过SLB进行负载均衡。具体方法见docker-compose.yml文件:

  gateway:
    image: xxxx
    ...
    labels:
      aliyun.scale: "2"
      aliyun.lb.port_8080: http://${slbname}:8080
    ...

阿里云容器服务会解析以aliyun开头的标签,并根据标签的定义执行不同的操作。aliyun.scale表示启动2个实例。

aliyun.lb.port_8080表示将该的所有实例通过SLB进行负载均衡,服务端口号(又称为后端端口号)为8080,SLB的地址通过随后的URL来描述。${slbname}为占位变量,需要替换为对应SLB的名字或ID。用户可以在部署文件中直接替换这个变量,也可以在部署应用时系统提示输入slbname,用户填入正确值。

URL中最后的8080表示SLB对外的端口号,在这里也是8080。

关于如何利用标签扩展docker compose能力在容器服务的官方帮助文档中有很详细的描述,读者可以关注,链接是阿里云容器服务帮助文档

小节

本文讨论了如何利用zuul实现服务智能路由,以及对外通过阿里云SLB实现对zuul的负载均衡。

相关实践学习
Docker镜像管理快速入门
本教程将介绍如何使用Docker构建镜像,并通过阿里云镜像服务分发到ECS服务器,运行该镜像。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
2月前
|
资源调度 前端开发 Shell
[docker] DevContainer高效开发(第二篇):前端开发体验
上面的配置只是最基本的配置,大部分情况我们是需要自定义配置,让容器更符合我们的需求。自定义配置就需要用到 Dockerfile,这个文件是 docker 的配置文件,可以在里面安装软件,配置环境等等。Dockerfile 的语法可以参考 官方文档。然后根据自己的需求编写 Dockerfile# 设置变量,由 .devcontainer.json 中的 args 传入# 指定 node 版本# 设置编码# 设置工作目录# 挂载 volume# 设置 bash 为默认 shell。
|
3天前
|
Java Docker 微服务
|
3天前
|
缓存 运维 Serverless
Serverless 应用引擎产品使用之在阿里云函数计算中使用Docker进行部署函数如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
9 0
|
13天前
|
Java Linux 虚拟化
Docker 部署spring-boot项目(超详细 包括Docker详解、Docker常用指令整理等)
Docker 部署spring-boot项目(超详细 包括Docker详解、Docker常用指令整理等)
53 1
|
19天前
|
存储 运维 数据中心
Docker 的基本概念和优势,以及在应用程序开发中的实际应用。
Docker是容器化技术,基于镜像(只读模板)创建可移植的容器,确保应用及其服务在隔离环境中运行。其优势包括快速部署(整个应用打包一次部署)、跨平台兼容、统一运行环境、资源隔离和简化依赖管理。Docker在开发和运维中都发挥作用,助力高效测试、部署和提升生产稳定性。
|
22天前
|
JavaScript 前端开发 Docker
全栈开发实战:结合Python、Vue和Docker进行部署
【4月更文挑战第10天】本文介绍了如何使用Python、Vue.js和Docker进行全栈开发和部署。Python搭配Flask创建后端API,Vue.js构建前端界面,Docker负责应用的容器化部署。通过编写Dockerfile,将Python应用构建成Docker镜像并运行,前端部分使用Vue CLI创建项目并与后端交互。最后,通过Nginx和另一个Dockerfile部署前端应用。这种组合提升了开发效率,保证了应用的可维护性和扩展性,适合不同规模的企业使用。
|
23天前
|
Linux Docker 容器
阿里云安装docker教程
阿里云安装docker教程
44 0
|
24天前
|
SpringCloudAlibaba Java Nacos
SpringCloud Alibaba微服务 -- Nacos使用以及注册中心和配置中心的应用(保姆级)
SpringCloud Alibaba微服务 -- Nacos使用以及注册中心和配置中心的应用(保姆级)
|
28天前
|
Java 持续交付 开发者
使用 Docker 容器化 Java Web 应用:提高开发和部署效率
【4月更文挑战第4天】Docker 作为轻量级容器技术,提升了 Java Web 应用的开发和部署效率。它提供类似生产环境的本地开发体验,减少环境配置时间,保证应用隔离性与稳定性。Docker 改善了部署流程,实现跨环境的无缝迁移,支持自动化构建、部署和扩展,并促进持续集成和持续部署,助力企业实现更高效、可靠的软件生命周期管理。
|
2月前
|
Cloud Native Shell Linux
云原生专题 | 【深入浅出Docker原理及实战】「原理实战体系」零基础+全方位带你学习探索Docker容器开发实战指南(实战技术总结)
云原生专题 | 【深入浅出Docker原理及实战】「原理实战体系」零基础+全方位带你学习探索Docker容器开发实战指南(实战技术总结)
14 0

相关产品

  • 容器计算服务