一、网关介绍
微服务框架中,后端服务一般都不是直接开发给调用端,而是通过一个API
网关根据请求的URL
,路由到响应的服务。网关是介于客户端与服务端的中间层。当添加API
网关后,就好像在第三方调用端和服务提供方间创建了面墙,这面墙直接与调用通信,处理非业务功能,提供路由请求、鉴权、监控、缓存、限流等功能,然后将请求均衡分发给后台服务器。
二、网关作用
(1)统一接入
统一接入的主要目的就是简化客户端调用的复杂度。微服务架构模式下后端服务的实例数(比如:8001、8002、8003…)都是动态的,这样客户端发现动态改变的服务实例的访问地址信息,就显得比较难。API Gageway
作为轻量级网关,就很好的解决了这个问题!
- 智能路由:通过判断路由接入不同的后端服务;
- 负载均衡:将对服务的请求分摊到服务器上;
AB
测试:不同的用户接入不同的版本,测试产品效果;- 灰度测试:应用或产品在发布之前,对其进行测试,及时修复
bug
; - 容灾处理:建立多套相同的系统,互相之间可以进行健康状态监控和功能切换,防止系统的崩溃,提高系统的高可用;
- 日志埋点:类似
Nginx
日志(日志:记录运行信息,通过日志可以监控系统的状态)。
(2)流量监控
限流处理:流量过大,在网关处进行阻断,不让过载的流量损害后端的服务。
服务降级:流量过大时关闭不重要的服务。腾出次要服务的访问流量,主要目的是让资源平均分配。
(3)安全防护
一般就是登录认证(鉴权处理),监控每个服务的运行状况。
(4)数据裁剪以及聚合
为了优化客户端使用体验,API Gateway
可以对通用性的响应数据进行裁剪以适应不同客户端的使用需求。同时还可以将多个API
调用逻辑进行聚合,从而减少客户端的请求数,优化客户端用户体验
(5)多渠道支持
针对不同的渠道和客户端提供不同的API Gateway
,该模式熟称“Backend for front-end
”。
(6)遗留系统的微服务化改造
通过微服务化的改造逐步实现对原有系统中的问题的修复,从而提升对于原有业务响应力的提升。通过引入抽象层,逐步使用新的实现替换旧的实现。
三、网关种类
(1)zuul
Netfilx
开源微服务网关,与Eureke
、Ribbon
、Hystrix
、Fegin
等组件配合使用,Zuul2.0
性能明显高于Zuul1.0
。
(2)kong
Mashape
公司开源,基于Nginx
的API Gateway
。
(3)nginx_lua
这是一个高性能HTTP
和反向代理服务器,lua
是脚本开发语言,可以自定义模块。
四、网关搭建
(1)初始化一个普通maven模块
(2)添加pom依赖
<dependencies>
<!--网关-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
</dependencies>
(3)修改application.properties配置文件
Zuul
实现请求转发,实际上就是nginx
的效果。
server.port=9003
#服务的名称
spring.application.name=xxxxx-api-gateway
### 配置URL映射 ###
#访问path路径 直接重定向到url指定的地址
zuul.routes.api-xxx.path=/testxxx/**
zuul.routes.api-xxx.url=http://localhost:8001/testxxx/
(4)创建启动类、启动Zuul网关服务
注意:@EnableZuulProxy
注解中包含了断路器注解@EnableCircuitBreaker!
package com.lindaxia.test.gateway;
@SpringBootApplication
@EnableZuulProxy //添加注解、支持网关路由。
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
}
}
(5)通过网关访问微服务
测试:访问用户微服务
用户详情api:http://localhost:8001/test/uesr/1001
通过网关访问:http://localhost:9003/test/user/1001
通过url
映射的方式来实现zull的转发存有局限性,增加一个服务就需要配置一条内容,另外后端的服务如果动态来提供如服务集群),所以这种配置方案就不可取。在实现微服务架构时,服务名与服务实例地址的关系在Eureka
服务中已经存在了,所以只需要将Zuul
注册到Eureka
上去发现其他服务,就可以实现对serviceId
的映射。
五、网关服务化
上面的网关配置实现请求转发,没实现集群效果,以下实现集群配置,需要把网关服务在注册中心进行注册!
(1)网关服务添加Eureka-pom依赖
<!--服务注册-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
(2)添加配置文件
Eureka
注册服务端口假设是9002
。
#指定注册中心地址
eureka.client.service-url.defaultZone=http://127.0.0.1:9002/eureka/
#eureka服务器上获取的是服务器的ip地址,否则是主机名
eureka.instance.prefer-ip-address=true
(3)注释掉zuul.routes的相关配置
(4)启动Zuul网关
依次启动Eureka
、user
和网关!
(5)通过网关访问微服务
测试:访问用户微服务
注册中心根据id获取用户信息api:http://localhost:8001/test/user/1001
通过网关访问:http://localhost:9001/xxxxx-user/test/user/1001
注意:网关的默认路由规则,Zuul
会代理所有注册到Eureka Server
的微服务,并且Zuul
的路由规则如下:
http://:ZUUL_PORT/微服务在Eureka上的serviceId/
(6)禁止通过网关服务某个服务
禁止通过网关访问xxxxx-user
<服务名>服务,在application.properties
文件配置:zuul.ignored-services=xxxxx-user
(7)禁止通过网关访问某些路由
禁止通过网关访问userservice
<模块名>,在application.properties
文件配置:zuul.ignored-patterns=/**/userservice/**
(8)自定义路由映射(别名)
在application.properties
文件配置:zuul.routes.guli-eduservice=/userserviceNew/**
(9)zuul网关默认不传递敏感信息cookie
方式一:使用token
方式二:在application.properties
文件配置:即还原被网关过滤的请求头,使cookie
可以向下游传递zuul.sensitive-headers=
♚学习、实战、总结、分享,让生活变得更美好!
☞林大侠博客:https://coding0110lin.blog.youkuaiyun.com/ 欢迎转载,一起技术交流探讨!