服务智能路由
本文为阿里云容器服务Spring Cloud应用开发系列文章的第五篇,讨论如何利用Spring Cloud 对 Netflix Zuul支持,完成服务的职能路由功能。
一、在阿里云容器服务上开发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的负载均衡。