使用zuul做边缘服务

概念阐述

API Gateway:

API Gateway是一个服务器,也可以说是进入系统的唯一节点。API Gateway封装内部系统的架构,并且提供API给各个客户端。

Zuul

Zuul是Netflix的基于JVM的路由器和服务器端负载均衡器,可以使用Zuul进行以下操作:

  • 认证
  • 洞察
  • 压力测试
  • 金丝雀测试
  • 动态路由
  • 服务迁移
  • 负载脱落
  • 安全
  • 静态相响应处理
  • 主动/被动流量管理

本小节主要介绍在SpringBoot应用中使用Zuul做API Gateway。关于Zuul的详细功能介绍请参考文档路由器和过滤器:Zuul

场景描述

Zuul做API Gateway,即建立一个Zuul Proxy应用,在该Proxy应用中统一定义所有的微服务访问入口,通过使用不同的前缀(stripped)来区分各个微服务。本小节通过建立一个ZuulProxy SpringBoot应用来演示Zuul的API Gateway功能。

注意事项

本小节介绍的ZuulProxy和ZuulServer等demo都是基于SpringBoot和ServiceComb框架的应用,具体请参考在Spring Boot中使用java chassis

启动Zuul Proxy

本节介绍如何启动一个zuul proxy应用作为API Gateway。步骤如下:

  • 步骤 1在pom文件中添加依赖:
<dependency> 
  <groupId>org.springframework.cloud</groupId>  
  <artifactId>spring-cloud-starter-zuul</artifactId> 
</dependency>
<dependency> 
  <groupId>org.springframework.cloud</groupId>  
  <artifactId>spring-cloud-starter-ribbon</artifactId> 
</dependency><dependency> 
  <groupId>org.springframework.cloud</groupId>  
  <artifactId>spring-cloud-starter-hystrix</artifactId> 
</dependency>
<dependency> 
  <groupId>org.apache.servicecomb</groupId>  
  <artifactId>spring-boot-starter-discovery</artifactId> 
</dependency>
  • 步骤 2在SpringBoot主类添加注解:
@SpringBootApplication
@EnableServiceComb
@EnableZuulProxy//新增注解
public class ZuulMain{
    public static void main(String[] args) throws Exception{
      SpringApplication.run(ZuulMain.class, args);
    }
}
  • 步骤 3在application.yml文件中定义路由策略:
server: 
  port: 8754 #api gateway服务端口
zuul: 
  routes: #路由策略
    discoveryServer: /myServer/** #路由规则

红色的配置项表示可以根据实际开发环境进行配置。关于zuul.routers的路由策略的详细定义规则,请参考官方文献:路由器和过滤器:Zuul,可更细粒度地对路由进行控制。

  • 步骤 4在microservice.yaml定义微服务属性:
APPLICATION_ID: discoverytest #服务ID
service_description: 
  name: discoveryGateway #服务名称
  version: 0.0.2 #服务版本号
servicecomb: 
  service: 
    registry: 
      address:  http://127.0.0.1:30100            #服务注册中心地址
 rest: 
   address: 0.0.0.0:8082                         #微服务端口,可不写
  • **步骤 5 **Run ZuulMain Application

使用Zuul Proxy

在使用zuul做的API Gateway前,首先要启动在zuul.routers中定义的微服务提供者。

开发服务提供者,开按流程请参考3 开发服务提供者。在微服务microservice.yaml文件中需注意以下两点:

  • APPLICATION_ID需要于zuul proxy中定义的保持一致。

  • service_description.name需要于zuul.routers中相对应。

示例如下:

APPLICATION_ID: discoverytest #与zuul proxy一致
service_description: 
  name: discoveryServer #服务名称,与zuul.routers对应
  version: 0.0.2
servicecomb: 
  service: 
    registry: 
      address: http://127.0.0.1:30100                #服务注册中心地址
rest: 
  address: 0.0.0.0:8080

API Gateway的访问入口为:http://127.0.0.1:8754,所有在zuul.routers中定义的服务都可通过这个访问入口进行代理访问,访问规则如下:

http://127.0.0.1:8754/myServer/***

这表示,Http调用http://127.0.0.1:8754/myServer/***,会转到discoveryServer服务(例如:“/myServer/101”跳转到discoveryServer 服务下的"/101")

如果在服务中心同时存在多个discoveryServer服务(版本不同),zuul默认采用Ribbon策略对请求进行转发。