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

服务智能路由

本文为阿里云容器服务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的负载均衡。

上一篇:centos安装docker显示 No package docker-ce available


下一篇:linux离线安装mysql