在了解微服务网关Spring Cloud Zuul之前,我们先要了解为什么我们要使用微服务网关:
不同的微服务一般会有不同的网络地址,而客户端可能需要调用多个服务接口才能完成一个业务需求.
若让客户端直接与各个微服务通信,会有以下问题:
- 客户端会多次请求不同微服务,增加了客户端复杂性
- 存在跨域请求,处理相对复杂
- 认证复杂,每个服务都需要独立认证
- 难以重构,多个服务可能将会合并成一个或拆分成多个
为了解决上面这些问题,我们需要将权限控制、日志收集这样的东西从我们的服务单元中抽离出去,而最适合这些逻辑的地方就是处于对外访问最前端的地方,我们需要一个更强大一些的均衡负载器服务网关。
此时我们引入了zuul网关
Zuul 是开源的微服务网关,可与 Eureka、Ribbon、Hystrix 等组件配合使用,Zuul 它的核心是一系列过滤器,这些过滤器可完成下面功能:
身份认证与安全:识别每个资源的验证要求,并拒绝那些要求不符合的请求
审核与监控:在边缘位置追踪有意义的数据和统计结果,从而带来精确的生产视图
动态路由:动态的将请求路由到不同的后端集群压力测试:逐渐增加指向集群的流量,以了解性能
负载分配:为每一种负载类型分配对应容量,并弃用超出限定值的请求
静态响应处理:在边缘位置直接建立部分响应,从而避免转发到内部集群
多区域弹性:跨越 AWS Region 进行请求路由,实现 ELB
使用多样化,让系统边缘更贴近使用者
接下来我们将进行zuul的快速入门:
1.创建一个工程,导入相应依赖:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.zpc.microservice</groupId>
<artifactId>microservice-api-gateway</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.6.RELEASE</version>
</parent>
<dependencyManagement>
<dependencies>
<!-- 导入Spring Cloud的依赖管理 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!--整合zuul网关-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2.编写启动类ServiceZuulApplication
package com.zyc.zuul;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
@EnableZuulProxy//启动zuul
@SpringBootApplication
@EnableEurekaClient
public class ServiceZuulApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceZuulApplication.class, args);
}
}
3.编写application.yml文件
server:
port: 9999
spring:
application:
name: service-zuul
eureka:
client:
service-url:
defaultZone: http://localhost:8888/eureka/
###因为该应用为服务提供者,是eureka的一个客户端,需要注册到注册中心
register-with-eureka: true
###是否需要从eureka上检索服务
fetch-registry: true
instance:
prefer-ip-address: true #将自己的ip地址注册到Eureka服务中
ip-address: 127.0.0.1
instance-id: ${spring.application.name}:${server.port}
###${server.port} #指定实例id
zuul:
routes: #定义服务转发规则
service-product: #item-service这个名字是任意写的
path: /service-product/** #匹配service-product的请求product服务
#url: http://127.0.0.1:8081 #真正的微服务地址
service-order: #名字尽量和业务系统相关
path: /service-order/** #匹配service-order的请求order服务
其中:
zuul: routes: #定义服务转发规则
service-product: #item-service这个名字是任意写的
path: /service-product/** #匹配service-product的请求product服务
#url: http://127.0.0.1:8081 #真正的微服务地址
service-order: #名字尽量和业务系统相关
path: /service-order/** #匹配service-order的请求order服务
为相应的路由规则
4.启动测试
启动Eureka注册中心、Item服务、order服务、网管服务4个工程。
接下来测试,功能是否正常:
service-order
service-product:
总结:微服务网关的解决方案
1. Nginx+Lua
2. spring cloud zuul(本次案例)
3. spring cloud Gateway