API网关是一个服务器,是系统的唯一入口。从面向对象设计的角度看,它与外观模式类似。API网关封装了系统内部架构,为每个客户端提供一个定制的API。它可能还具有其它职责,如身份验证、监控、负载均衡、缓存、请求分片与管理、静态响应处理。
  按照使用场景来说,API网关只要用来给外部应用(PC客户端、移动端,外部系统等)提供API接口。上一章已经实现了系统内部服务的相互调用,内部服务是不对外开放的,外部应用要调用服务,则需要API网关来实现路由。
  Spring Cloud整合的API网关有:Netflix的zuul以及自研的Spring Cloud Gateway,目前使用zuul的比较多,资料也比较全,这里采用zuul作为API网关。

  1.创建API网关服务

  1.1添加zuul依赖

  创建一个空的Maven项目apigateway,并添加zuul的依赖,因为API网关也是一个服务,需要注册到Eureka Server,所以还需要添加Eureka Client的依赖。  

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>

  在启动类上添加@EnableZuulProxy注解

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; @SpringBootApplication
@EnableEurekaClient
@EnableZuulProxy
public class ApiGatewayApplication {
public static void main(String[] args) {
SpringApplication.run(ApiGatewayApplication.class, args);
}
}

  配置文件设置好端口及服务中心地址

server:
port: 5551 #服务端口 eureka:
client:
registerWithEureka: true #是否注册
fetchRegistry: true #启用客户端缓存
serviceUrl:
defaultZone: http://peer1:8881/eureka/,http://peer2:8882/eureka/ #注册到两个服务中心 spring:
application:
name: apigateway #服务名

  依次启动Eureka Server、订单服务、用户服务、API网关服务,浏览器带Eureka Server页面,发现API网关服务已注册成功。

  

  1.2 设置超时时间

  通过API网关路由来访问用户服务,zuul默认路由规则 :http://zuul的Host地址:zuul端口/要调用的服务名/服务方法地址

  浏览器中打开http://localhost:5551/userservice/user/getall
  报错:
  This application has no explicit mapping for /error, so you are seeing this as a fallback.
  Tue Aug 07 17:49:01 CST 2018
  There was an unexpected error (type=Gateway Timeout, status=504).
  com.netflix.zuul.exception.ZuulException: Hystrix Readed time out

  

  这个错误是应为zuul的默认超时时间比较小,我们配置下zuul的超时时间,因zuul启用了ribbon的负载均衡,还需要设置ribbon的超时时间,注意ribbon的超时时间要小于zuul超时时间 。  

zuul:
host:
connect-timeout-millis: 15000 #HTTP连接超时要比Hystrix的大
socket-timeout-millis: 60000 #socket超时
ribbon:
ReadTimeout: 10000
ConnectTimeout: 10000

  

  如有启用Hystrix,还需设置Hystrix的超时时间,注意Hystrix的超时时间要小于zuul超时时间

hystrix:
command:
default:
execution:
timeout:
enabled: true
isolation:
thread:
timeoutInMilliseconds: 10000 #设置超时时间 10秒

  再通过网关调用服务,已成功返回数据。

  

  如需要在zuul做过滤、拦截等,可以参考官网文档:http://cloud.spring.io/spring-cloud-static/Finchley.SR1/single/spring-cloud.html#_router_and_filter_zuul
  在网关项目新建一个继承ZuulFilter的类,然后在该类中写过滤逻辑,譬如参数过滤  

public class QueryParamPreFilter extends ZuulFilter {
    @Override
    public int filterOrder() {
        return PRE_DECORATION_FILTER_ORDER - 1; // run before PreDecoration
    }     @Override
    public String filterType() {
        return PRE_TYPE;
    }     @Override
    public boolean shouldFilter() {
        RequestContext ctx = RequestContext.getCurrentContext();
        return !ctx.containsKey(FORWARD_TO_KEY) // a filter has already forwarded
                && !ctx.containsKey(SERVICE_ID_KEY); // a filter has already determined serviceId
    }
@Override
public Object run() {
RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        if (request.getParameter("sample") != null) {
         // put the serviceId in `RequestContext`
        ctx.put(SERVICE_ID_KEY, request.getParameter("foo"));
    }
return null;
}
}

  

  2.客户端通过API网关调用服务

  2.1 .net core调用网关服务

  在VS中新建一个控制台程序,使用HttpClient来调用服务  

class Program
{
static void Main(string[] args)
{
string userServiceUrl = "http://localhost:5551/userservice/user/";//通过网关地址来调用服务
var client = new HttpClient { BaseAddress = new Uri(userServiceUrl) };
HttpResponseMessage response = client.GetAsync("getall").Result;
string responseStr = response.Content.ReadAsStringAsync().Result;
Console.WriteLine(responseStr);
Console.ReadKey();
}
}

  启动控制台,成功返回用户信息的Json数据。

  

  至此API网关配置完成。 

  关于安全及认证授权,.net core使用较多的是IdentityServer4,因我们现使用的系统已有自己的授权认证方法(时间戳来做有效时间,用户名+密码或APIKey的签名做验证),暂时不加IdentityServer4。

升级微服务架构5:API网关的更多相关文章

  1. spring cloud+dotnet core搭建微服务架构:Api网关(三)

    前言 国庆假期,一直没有时间更新. 根据群里面的同学的提问,强烈推荐大家先熟悉下spring cloud.文章下面有纯洁大神的spring cloud系列. 上一章最后说了,因为服务是不对外暴露的,所 ...

  2. spring cloud+.net core搭建微服务架构:Api网关(三)

    前言 国庆假期,一直没有时间更新. 根据群里面的同学的提问,强烈推荐大家先熟悉下spring cloud.文章下面有纯洁大神的spring cloud系列. 上一章最后说了,因为服务是不对外暴露的,所 ...

  3. 微服务架构中API网关的角色

    [上海尚学堂的话]:本文主要讲述了Mashape的首席技术执行官Palladino对API网关的详细介绍,以及API网关在微服务中所起的作用,同时介绍了Mashape的一款开源API网关Kong. A ...

  4. .NET微服务架构及API网关

    一.MSA简介 1.1.MSA是什么 微服务架构MSA是Microservice Architecture的简称,它是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间互相通讯.互相配合, ...

  5. spring cloud+dotnet core搭建微服务架构:Api授权认证(六)

    前言 这篇文章拖太久了,因为最近实在太忙了,加上这篇文章也非常长,所以花了不少时间,给大家说句抱歉.好,进入正题.目前的项目基本都是前后端分离了,前端分Web,Ios,Android...,后端也基本 ...

  6. spring cloud+.net core搭建微服务架构:Api授权认证(六)

    前言 这篇文章拖太久了,因为最近实在太忙了,加上这篇文章也非常长,所以花了不少时间,给大家说句抱歉.好,进入正题.目前的项目基本都是前后端分离了,前端分Web,Ios,Android...,后端也基本 ...

  7. Chris Richardson微服务翻译:构建微服务之使用API网关

    Chris Richardson 微服务系列翻译全7篇链接: 微服务介绍 构建微服务之使用API网关(本文) 构建微服务之微服务架构的进程通讯 微服务架构中的服务发现 微服务之事件驱动的数据管理 微服 ...

  8. Spring Cloud 微服务三: API网关Spring cloud gateway

    前言:前面介绍了一款API网关组件zuul,不过发现spring cloud自己开发了一个新网关gateway,貌似要取代zuul,spring官网上也已经没有zuul的组件了(虽然在仓库中可以更新到 ...

  9. 微服务架构~BFF和网关是如何演化出来的

    介绍 BFF(Backend for Frontend)和网关Gateway是微服务架构中的两个重要概念,这两个概念相对比较新,有些开发人员甚至是架构师都不甚理解. 本文用假想的公司案例+图示的方式, ...

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

    前言 又是很久没写博客了,最近一段时间换了新工作,比较忙,所以没有抽出来太多的时间写给关注我的粉丝写一些干货了,就有人问我怎么最近没有更新博客了,在这里给大家抱歉. 那么,在本篇文章中,我们就一起来探 ...

随机推荐

  1. python header设置随机user_agent

    1 安装 fake_useragent pip install fake_useragent 2 使用 # -*- coding:utf-8 -*- from fake_useragent impor ...

  2. 群晖系统设置链路聚合并配置静态IP的教程【江东网 JDX86.COM】

    1.进入控制面板 > 网络 > 网络接口.请单击创建 > 创建 Bond 2.进入聚合配置向导,选择你想要的模式,这里有几种模式意思分别为: 自适应负载平衡: 此模式优化了 Syno ...

  3. 解决QT5移植报错:This application failed to start because no Qt platform plugin could be initialized

    今天自己基于Pyqt5开发了一个软件,打包成exe后在自己的电脑上运行正常,在其他机器上提示: This application failed to start because no Qt platf ...

  4. Url跳转漏洞常见

    Url跳转漏洞常见出现点: 1.用户登录.统一身份认证处,认证完后会跳转. 2.用户分享.收藏内容过后,会跳转. 3.跨站点认证.授权后,会跳转. 4.站内点击其它网址链接时,会跳转. Url跳转漏洞 ...

  5. JQ选择器总结

    jQuery 的选择器可谓之强大无比,这里简单地总结一下常用的元素查找方法 $("#myELement") 选择id值等于myElement的元素,id值不能重复在文档中只能有一个 ...

  6. SpringMVC+Spring+mybatis+maven+搭建多模块框架前后端分离开发框架的完整demo,拿走不谢。——猿实战02

            猿实战是一个原创系列文章,通过实战的方式,采用前后端分离的技术结合SpringMVC Spring Mybatis,手把手教你撸一个完整的电商系统,跟着教程走下来,变身猿人找到工作不是 ...

  7. python基础 Day8

    python Day8 文件操作的识 利用python代码写一个脚本操作文件的过程 文件的路径:path 打开方式:读,写,追加,读写,写读 编码方式:utf-8,gbk,gb2312 简单文件读取( ...

  8. springboot~通过面向接口编程对控制反转IOC的理解

    IOC,把控制反转到业务端,这句话没什么问题,在springboot框架里,对象的管理是通过spring ioc来实现的,而开发人员的开发原则里总是说"面向接口编程",而为什么要面 ...

  9. Hello,Vue

    Vue版本 Vue完整版 有编译器compiler,体积大功能多,可以直接把html字符串变成DOM节点 视图,此处为html字符串,写在index.html里或者写在new Vue构造选项templ ...

  10. 牛客网PAT练兵场-部分A+B

    题解:简单循环 题目地址:https://www.nowcoder.com/questionTerminal/fb581ea099a14f5d97c6149cbeee249f /** * *作者:Yc ...