为服务中网关的作用

摘要:
“API网关”核心组件是架构用于满足此些需求。API网关定位为应用系统服务接口的网关,区别于网络技术的网关,但是原理则是一样。API网关统一服务入口,可方便实现对平台众多服务接口进行管控,对访问服务的身份认证、防报文重放与防数据篡改、功能调用的业务鉴权、响应数据的脱敏、流量与并发控制,甚至基于API调用的计量或者计费等等。

什么是网关

随着互联网的快速发展,当前以步入移动互联、物联网时代。用户访问系统入口也变得多种方式,由原来单一的PC客户端,变化到PC客户端、各种浏览器、手机移动端及智能终端等。同时系统之间大部分都不是单独运行,经常会涉及与其他系统对接、共享数据的需求。所以系统需要升级框架满足日新月异需求变化,支持业务发展,并将框架升级为微服务架构。“API网关”核心组件是架构用于满足此些需求。

很多互联网平台已基于网关的设计思路,构建自身平台的API网关,国内主要有京东、携程、唯品会等,国外主要有Netflix、Amazon等。

网关框架框架

1、基于nginx平台实现的网关有:KONG、API Umbrella

2、自研发的网关有:apigateway、Zuul

API网关设计

API网关是微服务架构(Microservices Architecture)标准化服务的模式。API网关定位为应用系统服务接口的网关,区别于网络技术的网关,但是原理则是一样。API网关统一服务入口,可方便实现对平台众多服务接口进行管控,对访问服务的身份认证、防报文重放与防数据篡改、功能调用的业务鉴权、响应数据的脱敏、流量与并发控制,甚至基于API调用的计量或者计费等等。

网关应用场景

1、黑白名单:实现通过IP地址控制禁止访问网关功能,此功能是应用层面控制实现,再往前也可以通过网络传输方面进行控制访问。

2、日志:实现访问日志的记录,可用于分析访问、处理性能指标,同时将分析结果支持其他模块功能应用。

3、协议适配:实现通信协议校验、适配转换的功能。

4、身份认证:负责网关访问身份认证验证,此模块与“访问认证中心”通信,实际认证业务逻辑交移“访问认证中心”处理。

5、计流限流:实现微服务访问流量计算,基于流量计算分析进行限流,可以定义多种限流规则。

路由:路由是API网关很核心的模块功能,此模块实现根据请求,锁定目标微服务并将请求进行转发。此模块需要与“服务发布管理中心”通信。“服务发布管理中心”实现微服务发布注册管理功能,与其通信获得目标微服务信息。

API网关部署

API网关是一个公共基础组件,无状态,可支持多套分布式部署。如下图所示:

为服务中网关的作用第1张

为服务中网关的作用第2张

lvs + Keepalived 属于四层负载均衡,针对于 ip + port 这一层。

lvs 作用:管理Nginx 集群。

Nginx 属于七层负载均衡,针对于 Http 协议这一层。

Zuul框架与Nginx 的区别

1、Zuul框架使用java语言写的,Nginx使用C语言写的。

2、Nginx是服务器端反向代理服务器,Zuul是为微服务中的反向代理服务器。

3、Nginx针对与服务器层面,Zuul 针对与客户端层面的。

基于Nginx 搭建API网关

使用网关可以解决跨越问题,实现原理:保证域名相同,使用Nginx区分不同的项目路径进行转发跳转。

Nginx配置反向代理:

http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name www.test.com;
location/api-a {
proxy_pass http://www.test.com:8000/;
index index.html index.htm;
}
location /api-b {
proxy_pass http://www.test.com:8001/;
index index.html index.htm;
}
}
}

为服务中网关的作用第3张

基于Zuul搭建网关

zuul 网关 配置文件

### 将服务注册到 eureka 注册中心 i

eureka.client.serviceUrl.defaultZone=http://localhost:8100/eureka/

### zuul 服务端口号

server.port=8080

### zuul 服务别名

spring.application.name=service-zuul

### 路由配置

zuul.routes.api-a.path=/api-a/**

zuul.routes.api-a.serviceId=springboot_zuul_a

### 路由拦截地址

zuul.routes.api-b.path=/api-b/**

zuul.routes.api-b.serviceId=springboot_zuul_b

Eureka 注册中心配置文件

## eureka 端口号

server.port=8100

### 注册中心 eureka 别名
eureka.instance.hostname=eureka-server

### eureka 注册中心地址
eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/

### 是否注册到自己本身 eureka 集群时使用(true)
eureka.client.register-with-eureka=false

### 是否检索服务信息 集群时使用(true)
eureka.client.fetch-registry=false

spirngboot_zuul_a 配置文件

### a 项目端口号

server.port=8081

### a 项目服务别名
spring.application.name=springboot_zuul_a

### 服务注册到 eureka 注册中心地址
eureka.client.service-url.defaultZone=http://localhost:8100/eureka

spirngboot_zuul_b 配置文件

### b 项目端口号

server.port=8082

### b 项目服务别名
spring.application.name=springboot_zuul_b

### 服务注册到 eureka 注册中心地址
eureka.client.service-url.defaultZone=http://localhost:8100/eureka

zuul 启动类上面需要添加二个注解:

@EnableZuulProxy //开启 zuul 服务

@EnableEurekaClient // 注册到 eureka 注册中心

过滤器拦截参数

// 使用网关拦截Token参数
public class TokenFilter extends ZuulFilter {
public Object run() throws ZuulException {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
Object accessToken = request.getParameter("accessToken");
if (accessToken == null) {
// 返回错误信息
ctx.setSendZuulResponse(false);
ctx.setResponseStatusCode(401);
ctx.setResponseBody("accessToken is null");
return null;
}
return null;
}
public boolean shouldFilter() {
return true;// 是否执行该过滤器,此处为true,说明需要过滤
}
@Override
public int filterOrder() {
return 0;// 优先级为0,数字越大,优先级越低
}
@Override
public String filterType() {
return "pre"; // 前置过滤器
}
}

免责声明:文章转载自《为服务中网关的作用》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇PartⅠ邮件伪造PLSQL常用配置之窗口/版面保存、SQL格式化/美化、SQL注释去掉注释等快捷键配置、登陆历史修改配置下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

SpringCloud学习(3)——Eureka服务注册中心及服务发现

Eureka概述Eureka是Netflix的一个子模块, 也是核心模块之一。Eureka是一个基于REST的服务, 用于定位服务, 以实现云端中间层服务发现和故障转移。服务注册与发现对于微服务框架来说非常重要, 有了服务注册和发现, 只需要使用服务的标识符,就可以访问到服务,而不需要修改服务调用的配置文件了。功能类似于Dubbo的注册中心, 比如Zook...

如何利用 Python 爬虫实现给微信群发新闻早报?(详细)

1. 场景 经常有小伙伴在交流群问我,每天的早报新闻是怎么获取的? 其实,早期使用的方案,是利用爬虫获取到一些新闻网站的标题,然后做了一些简单的数据清洗,最后利用 itchat 发送到指定的社群中。 由于爬虫面对 网站改版的不稳定性及 itchat 不安全性,所以放弃了这种方案 后期更改了一种方案,通过修改爬虫方案,创建 API 服务,编写 App 去获...

ASP.NET Web API 2系列(一):初识Web API及手动搭建基本框架

 1.导言 随着Web技术的发展,现在各种框架,前端的,后端的,数不胜数。全栈工程师的压力越来越大。 PC端,pad端,移动端App(安卓/IOS)的发展,使得前后端一体的开发模式十分笨重。因此,前后端分离是web发展的趋势,其中,RESTful API是目前前后端分离的最佳实践,ASP.NET Web API是在.NET Framework上构建RES...

如何在Web项目中给没有添加API核心组件添加APIController的帮助页HelpPage

前言:   ASP.NET中的Web项目可以通过APIController控制器来为其他项目提供接口。  而我们在调试这些接口时,可以选择单元测试,网页测试(Get接口),自己写测试代码或者第三方测试工具等等(如:PostMan可以发送GET/POST请求)。    但这里为大家介绍一种新的调试工具:微软提供的一种关于APIController控制器说明帮...

创建telegram 机器人 并发送消息

telegram是国外常用的聊天功能,功能很强大,除了聊天还可以玩游戏,传文件,视频,声音,投票,群组。当然,这些跟qq,微信都很类似了。但是它毕竟是国外最常用的IM之一。telegram有个聊天机器人可以自动发消息,也是挺有意思的。它还开放了api,可以自己创建bot,通过api发送消息,视频,声音,文件等功能。下面,我简单介绍下怎么新建一个bottel...

zuul隔离机制

文章转载自:https://blog.csdn.net/farsight1/article/details/80078099 ZuulException REJECTED_SEMAPHORE_EXECUTION 是一个最近在性能测试中经常遇到的异常。查询资料发现是因为zuul默认每个路由直接用信号量做隔离,并且默认值是100,也就是当一个路由请求的信号量高...