Spring Cloud的微服务架构了(简单的)
接口网管:
拦截请求类似nginx
网管 类似反向代理
拦截所有请求,将任何请求先交给接口网关,让接口网管进行转发。
网关作用
跨域问题
构建服务网关
使用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
服务路由配置
服务路由我们在上一篇中也已经有过基础的介绍和体验,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的负载均衡策略实现请求的路由。