美文网首页SpringHome
面试:Spring Cloud构建微服务:网关

面试:Spring Cloud构建微服务:网关

作者: 奇点一氪 | 来源:发表于2018-07-31 15:09 被阅读75次

Spring Cloud的微服务架构了(简单的)

image.png

接口网管:

拦截请求类似nginx

网管 类似反向代理

拦截所有请求,将任何请求先交给接口网关,让接口网管进行转发。

网关作用

image.png

跨域问题

构建服务网关

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

创建一个基础的Spring Boot项目,命名为:api-gateway。并在pom.xml中引入依赖:

  <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-client和eureka-consumer,这时候Zuul就会创建两个路由规则。每个路由规则都包含两部分,一部分是外部请求的匹配规则,另一部分是路由的服务ID。针对当前示例的情况,Zuul会创建下面的两个路由规则:

转发到eureka-client服务的请求规则为:/eureka-client/**
转发到eureka-consumer服务的请求规则为:/eureka-consumer/**
最后,我们可以通过访问1101端口的服务网关来验证上述路由的正确性:

比如访问:http://localhost:1101/eureka-client/dc ,该请求将最终被路由到eureka-client的/dc接口上。

服务路由配置application.yaml

image.png

服务路由配置

服务路由我们在上一篇中也已经有过基础的介绍和体验,Spring Cloud Zuul通过与Spring Cloud Eureka的整合,实现了对服务实例的自动化维护,所以在使用服务路由配置的时候,我们不需要向传统路由配置方式那样为serviceId去指定具体的服务实例地址,只需要通过一组zuul.routes.<route>.path与zuul.routes.<route>.serviceId参数对的方式配置即可。

比如下面的示例,它实现了对符合/user-service/**规则的请求路径转发到名为user-service的服务实例上去的路由规则。其中<route>可以指定为任意的路由名称。

zuul.routes.user-service.path=/user-service/**  //请求路径(满足这个路径要求就会映射到)
zuul.routes.user-service.serviceId=user-service  //就会转发到这个服务实例上,服务实例内可以包含集群

对于面向服务的路由配置,除了使用path与serviceId映射的配置方式之外,还有一种更简洁的配置方式:zuul.routes.<serviceId>=<path>,其中<serviceId>用来指定路由的具体服务名,<path>用来配置匹配的请求表达式。比如下面的例子,它的路由规则等价于上面通过path与serviceId组合使用的配置方式。

zuul.routes.user-service=/user-service/**

传统路由

API网关直接根据请求的URL路径找到匹配的path,直接转发给该表达式对应的url或对应serviceId下配置的实例地址,以实现外部请求的路由

Zuul巧妙的整合了Eureka来实现面向服务的路由

在Spring Cloud Netflix中,Zuul巧妙的整合了Eureka来实现面向服务的路由。实际上,API网关将自己注册到Eureka服务注册中心上,也会从注册中心获取所有服务以及它们的实例清单。在Eureka的帮助下,API网关已经维护了系统中所有serviceId与实例地址的映射关系。当有外部请求到达API网关的时候,根据请求的URL找到最匹配的path,API网关就可以知道要将该请求"路由"到哪个具体的serviceId上去。 最终通过Ribbon的负载均衡策略实现请求的路由。

相关文章

网友评论

    本文标题:面试:Spring Cloud构建微服务:网关

    本文链接:https://www.haomeiwen.com/subject/laaqvftx.html