Spring Cloud架构教程 (三)服务网关(基础)

经过以前几篇Spring Cloud中几个核心组件的介绍,咱们已经能够构建一个简略的(不够完善)微服务架构了。好比下图所示:html

altalt前端

咱们使用Spring Cloud Netflix中的Eureka实现了服务注册中心以及服务注册与发现;而服务间经过Ribbon或Feign实现服务的消费以及均衡负载;经过Spring Cloud Config实现了应用多环境的外部化配置以及版本管理。为了使得服务集群更为健壮,使用Hystrix的融断机制来避免在微服务架构中个别服务出现异常时引发的故障蔓延。web

在该架构中,咱们的服务集群包含:内部服务Service A和Service B,他们都会注册与订阅服务至Eureka Server,而Open Service是一个对外的服务,经过均衡负载公开至服务调用方。本文咱们把焦点汇集在对外服务这块,这样的实现是否合理,或者是否有更好的实现方式呢?spring

先来讲说这样架构须要作的一些事儿以及存在的不足:api

  • 首先,破坏了服务无状态特色。为了保证对外服务的安全性,咱们须要实现对服务访问的权限控制,而开放服务的权限控制机制将会贯穿并污染整个开放服务的业务逻辑,这会带来的最直接问题是,破坏了服务集群中REST API无状态的特色。从具体开发和测试的角度来讲,在工做中除了要考虑实际的业务逻辑以外,还须要额外可续对接口访问的控制处理。
  • 其次,没法直接复用既有接口。当咱们须要对一个即有的集群内访问接口,实现外部服务访问时,咱们不得不经过在原有接口上增长校验逻辑,或增长一个代理调用来实现权限控制,没法直接复用原有的接口。

面对相似上面的问题,咱们要如何解决呢?下面进入本文的正题:服务网关!安全

为了解决上面这些问题,咱们须要将权限控制这样的东西从咱们的服务单元中抽离出去,而最适合这些逻辑的地方就是处于对外访问最前端的地方,咱们须要一个更强大一些的均衡负载器,它就是本文未来介绍的:服务网关。架构

服务网关是微服务架构中一个不可或缺的部分。经过服务网关统一贯外系统提供REST API的过程当中,除了具有服务路由、均衡负载功能以外,它还具有了权限控制等功能。Spring Cloud Netflix中的Zuul就担任了这样的一个角色,为微服务架构提供了前门保护的做用,同时将权限控制这些较重的非业务逻辑内容迁移到服务路由层面,使得服务集群主体可以具有更高的可复用性和可测试性。app

下面咱们经过实例例子来使用一下Zuul来做为服务的路有功能。spring-boot

准备工做

在构建服务网关以前,咱们先准备一下网关内部的微服务,能够直接使用前几篇编写的内容,好比:微服务

  • eureka-client
  • eureka-consumer

 

在启动了eureka-clienteureka-consumer的实例以后,全部的准备工做就以就绪,下面咱们来试试使用Spring Cloud Zuul来实现服务网关的功能。

构建服务网关

使用Spring Cloud Zuul来构建服务网关的基础步骤很是简单,只须要下面几步:

  • 建立一个基础的Spring Boot项目,命名为:api-gateway。并在pom.xml中引入依赖:
<parent>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-parent</artifactId>
  <version>1.5.4.RELEASE</version>
  <relativePath/>
</parent>

<dependencies>
  <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-zuul</artifactId>
  </dependency>
  <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-eureka</artifactId>
  </dependency>
</dependencies>

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-dependencies</artifactId>
      <version>Dalston.SR1</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>
  • 建立应用主类,并使用@EnableZuulProxy注解开启Zuul的功能。
@EnableZuulProxy
@SpringCloudApplication
public class Application {
  
  public static void main(String[] args) {
    new SpringApplicationBuilder(Application.class).web(true).run(args);
  }
  
}
  • 建立配置文件application.yaml,并加入服务名、端口号、eureka注册中心的地址:
spring:
  application:
    name: api-gateway

server:
  port: 1101

eureka:
  client:
    serviceUrl:
      defaultZone: http://eureka.didispace.com/eureka/

到这里,一个基于Spring Cloud Zuul服务网关就已经构建完毕。启动该应用,一个默认的服务网关就构建完毕了。因为Spring Cloud Zuul在整合了Eureka以后,具有默认的服务路由功能,即:当咱们这里构建的api-gateway应用启动并注册到eureka以后,服务网关会发现上面咱们启动的两个服务eureka-clienteureka-consumer,这时候Zuul就会建立两个路由规则。每一个路由规则都包含两部分,一部分是外部请求的匹配规则,另外一部分是路由的服务ID。针对当前示例的状况,Zuul会建立下面的两个路由规则:

  • 转发到eureka-client服务的请求规则为:/eureka-client/**
  • 转发到eureka-consumer服务的请求规则为:/eureka-consumer/**

最后,咱们能够经过访问1101端口的服务网关来验证上述路由的正确性:

相关文章
相关标签/搜索