为服务中网关的作用

什么是网关

随着互联网的快速发展,当前以步入移动互联、物联网时代。用户访问系统入口也变得多种方式,由原来单一的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网关是一个公共基础组件,无状态,可支持多套分布式部署。如下图所示:

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;
         }
     }
}

基于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"; // 前置过滤器    }

}

原文地址:https://www.cnblogs.com/ming-blogs/p/11087413.html

时间: 2024-11-05 14:40:31

为服务中网关的作用的相关文章

Spring Cloud微服务中网关服务是如何实现的?(Zuul篇)

导读 我们知道在基于Spring Cloud的微服务体系中,各个微服务除了在内部提供服务外,有些服务接口还需要直接提供给客户端,如Andirod.IOS.H5等等. 而一个很尴尬的境地是,如果直接将提供外部接口的微服务暴露给公网,那么意味着为了增强这个微服务的安全性,需要做很多额外的安全性措施,如报文数字签名.加密等:而大部分场景下,微服务本身又是提供给内部其他微服务调用的,即便所有的微服务都会不同程度地直接面向App客户端提供公网服务,那么为了这确保这些微服务的安全性,涉及的微服务也都需要实现

谈谈微服务中的 API 网关(API Gateway)

转载至:http://www.cnblogs.com/savorboard/p/api-gateway.html 背景 我们知道在微服务架构风格中,一个大应用被拆分成为了多个小的服务系统提供出来,这些小的系统他们可以自成体系,也就是说这些小系统可以拥有自己的数据库,框架甚至语言等,这些小系统通常以提供 Rest Api 风格的接口来被 H5, Android, IOS 以及第三方应用程序调用. 但是在UI上进行展示的时候,我们通常需要在一个界面上展示很多数据,这些数据可能来自于不同的微服务中,举

Win7中如何在服务中启动一个当前用户的进程——函数CreateProcessAsUser()的一次使用记录

这次工作中遇到要从服务中启动一个具有桌面UI交互的应用,这在winXP/2003中只是一个简单创建进程的问题.但在Vista 和 win7中增加了session隔离,这一操作系统的安全举措使得该任务变得复杂了一些. 一.Vista和win7的session隔离 一个用户会有一个独立的session.在Vista 和 win7中session 0被单独出来专门给服务程序用,用户则使用session 1.session 2... 这样在服务中通过CreateProcess()创建的进程启动UI应用用

Win7中如何在服务中启动一个当前用户的进程——一次CreateProcessAsUser()使用记录

这次工作中遇到要从服务中启动一个具有UI交互的桌面应用,这在winXP/2003中只是一个简单创建进程的问题.但在Vista 和 win7中增加了session隔离,这一操作系统的安全举措使得该任务变得复杂了一些. 一.Vista和win7的session隔离 一个用户会有一个独立的session.在Vista 和 win7中session 0被单独出来专门给服务程序用,用户则使用session 1.session 2... 这样在服务中通过CreateProcess()创建的进程启动UI应用用

Oracle 中TNS的作用

什么是TNS? TNS是Oracle Net的一部分,专门用来管理和配置Oracle数据库和客户端连接的一个工具,在大多数情况下客户端和数据库要通讯,必须配置TNS,当然在少数情况下,不用配置TNS也可以连接Oracle数据库,比如通过JDBC.如果通过TNS连接Oracle,那么客户端必须安装Oracle client程序. 什么时候用TNS 如上边所说,非JDBC等方式连接ORACLE的情况下需要用到TNS,另外本地数据库客户端连接数据时的主机字符串为本地指定的服务名称,并非数据库的SID,

计算机主机网关的作用是什么?

转载自<计算机主机网关的作用是什么> 假设你的名字叫小不点,你住在一个大院子里,你的邻居有很多小伙伴,在门口传达室还有个看大门的李大爷,李大爷就是你的网关.当你想跟院子里的某个小伙伴玩,只要你在院子里大喊一声他的名字,他听到了就会回应你,并且跑出来跟你玩. 但是你不被允许走出大门,你想与外界发生的一切联系,都必须由门口的李大爷(网关)用电话帮助你联系.假如你想找你的同学小明聊天,小明家住在很远的另外一个院子里,他家的院子里也有一个看门的王大爷(小明的网关).但是你不知道小明家的电话号码,不过你

使用AIDL调用服务中的方法

AIDL:android interface define language(接口定义语言) 作用:方便远程调用其他服务中的方法 注意:安卓四大组件都要在清单文件注册 aidl创建图: interface InterfaceAidl { void interfacePay(); } public class MyService extends Service { class MyBinder extends InterfaceAidl.Stub { @Override public void i

Oracle多个服务各代表什么作用(转)

在Windows 操作系统下安装Oracle 9i时会安装很多服务——并且其中一些配置为在Windows 启动时启动.在Oracle 运行在Windows 下时,它会消耗很多资源,并且有些服务可能我们并不总是需要.你会发现不使用Windows 图形界面就可以快速.完全地关闭数据库会很有用. 只要拥有管理员权限就可以通过net start 启动一个服务,或者通过net stop 命令停止一个服务,从而控制以下服务中的任何一个.在Windows XP 中,可以通过在控制面板的服务中改变想要禁用的服务

解决vista和win7在windows服务中交互桌面权限问题:穿透Session 0 隔离

转载自 http://www.cnblogs.com/therock/articles/2261371.html 解决vista和win7在windows服务中交互桌面权限问题:穿透Session 0 隔离 服务(Service)对于大家来说一定不会陌生,它是Windows 操作系统重要的组成部分.我们可以把服务想像成一种特殊的应用程序,它随系统的“开启-关闭”而“开始-停止”其工作内容,在这期间无需任何用户参与. Windows 服务在后台执行着各种各样任务,支持着我们日常的桌面操作.有时候可