SpringBoot 整合SpringCloud组件gateway/zuul网关

Spring Boot 是构建单个微服务应用的理想选择,但是我们还需要以某种方式将它们互相联系起来。这就是 Spring Cloud Netflix 所要解决的问题。Netflix 它提供了各种组件,比如:Eureka服务发现与Ribbon客户端负载均衡的结合,为内部“微服务”提供通信支持。
本章介绍如何通过使用 Netflix Zuul 实现一个微服务API Gateway 来实现简单代理转发和过滤器功能。

API Gateway 是随着微服务(Microservice)这个概念一起兴起的一种架构模式,它用于解决微服务过于分散,没有一个统一的出入口进行流量管理的问题。

不同的微服务一般有不同的网络域名(或 IP地址),而通常情况下,在大规模分布式架构系统中,外部的客户端可能需要调用多个服务的接口才能完成一个业务逻辑。比如,在京东、淘宝上下单购买一个商品的场景,通常会去商品数据服务、订单服务、支付服务等。如果客户端直接单独和这些微服务进行通信,可能会存在诸如如下的问题:

 客户端会多次请求不同微服务,增加客户端的复杂性
 存在跨域请求,在一定场景下处理相对复杂
 认证复杂,每一个服务都需要独立认证

诸如上述问题,我们可以引入一个中间代理层—— API Gateway 来解决。API Gateway 是介于客户端和服务器端之间的中间层,所有的外部请求都会先经过微服务网关,架构图如下:

这样客户端只需要和API Gateway交互,而无需单独去调用特定微服务的接口,而且方便监控,易于认证,减少客户端和各个微服务之间的交互次数。

常规的选择我们会使用Nginx作为代理。但是Netflix带来了它自己的解决方案——智能路由Zuul。它带有许多有趣的功能,它可以用于身份验证、服务迁移、分级卸载以及各种动态路由选项。同时,它是使用Java编写的。

Zuul是Netflix开源的微服务网关,可以和Eureka,Ribbon,Hystrix等组件配合使用。Zuul 是netflix开源的一个API Gateway 服务器, 本质上是一个web servlet应用。Zuul 在云平台上提供动态路由,监控,弹性,安全等边缘服务的框架。Zuul 相当于是设备和 Netflix 流应用的 Web 网站后端所有请求的前门。

Zuul可以简单理解为一个类似于 Servlet 中过滤器(Filter)的概念。和大部分基于Java的Web应用类似,Zuul也采用了servlet架构,因此Zuul处理每个请求的方式是针对每个请求是用一个线程来处理。通常情况下,为了提高性能,所有请求会被放到处理队列中,从线程池中选取空闲线程来处理该请求。这样的设计方式,足以应付一般的高并发场景。Zuul 是在云平台上提供动态路由,监控,弹性,安全等边缘服务的框架。
1.3 Zuul核心组件
Zuul的核心组件是一系列的过滤器,它们可以完成以下功能:
 身份认证和安全: 识别每一个资源的验证要求,并拒绝那些不符的请求。
 审计和监控:实现对 API 调用过程的审计和监控,追踪有意义数据及统计结果,从而为我们带来准确的生产状态数据。
 动态路由:动态将请求路由到不同后端集群。
 压力测试:逐渐增加指向集群的流量,以了解系统的性能。
 负载分配:为每一种负载类型分配对应容量,并弃用超出限定值的请求。
 静态响应处理:边缘位置进行响应,避免转发到内部集群。
 多区域弹性:跨域AWS Region进行请求路由,旨在实现ELB(ElasticLoad Balancing)使用多样化。

Zuul 提供了四种过滤器的 API,分别为前置(pre)、后置(post)、路由(route)和错误(error)四种处理方式。其生命周期如下图所示

一个请求会先按顺序通过所有的前置过滤器,之后在路由过滤器中转发给后端应用,得到响应后又会通过所有的后置过滤器,最后响应给客户端。在整个流程中如果发生了异常则会跳转到错误过滤器中。

一般来说,如果需要在请求到达后端应用前就进行处理的话,会选择前置过滤器,例如鉴权、请求转发、增加请求参数等行为。在请求完成后需要处理的操作放在后置过滤器中完成,例如统计返回值和调用时间、记录日志、增加跨域头等行为。路由过滤器一般只需要选择 Zuul 中内置的即可,错误过滤器一般只需要一个,这样可以在 Gateway 遇到错误逻辑时直接抛出异常中断流程,并直接统一处理返回结果。

Spring Cloud 对 Zuul 进行了整合和增强。目前,Zuul使用的默认是Apache的HTTP Client。也可以通过设置ribbon.restclient.enabled=true 来使用Rest Client。在 Zuul 中,每一个后端应用都称为一个 Route,为了避免一个 Route 抢占了太多资源影响到其他 Route 的情况出现,Zuul 使用 Hystrix 对每一个 Route 都做了隔离和限流。

--------------------------------- Spring Boot 集成 Zuul 来实现 API Gateway -------------------------

创建3个应用:
demo_zuul(API Gateway 服务)、demo1(应用1)、demo2(应用2)

首先创建demo_zuul
1、添加maven依赖

org.springframework.cloud
spring-cloud-starter-netflix-zuul
2.1.4.RELEASE

2、配置文件appliation.properties
#环境:dev、test、prod
spring.profiles.active=dev

#端口配置
server.servlet.context-path=/myZuul
server.error.path=/error
server.port=8097

mybatis.mapper-locations=classpath:mapper/*.xml

 #网关配置
zuul.routes.do1_api.url=http://127.0.0.1:8098/do1_api
zuul.routes.do2_api.url=http://127.0.0.1:8099/do2_api

3、开启网关服务
在这里插入图片描述

至此,demo_zuul完成。

创建demo1(应用1)
1、application.properties配置
#端口配置
server.servlet.context-path=/do1_api
server.port=8098

2、方法
     package com.example.demo.controller;

import com.example.demo.common.Result;
import com.example.demo.common.ResultCode;
import com.example.demo.service.HouseMovingService;
import com.example.demo.utils.ResultBulider;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**

  • @Description: TODO
  • @Author: Top
  • @Version: V1.0
  • @Date: 2020-01-15 15:03
    */
    @RestController
    @RequestMapping(“/api/{edition}/page”)
    public class MyPageHelperController {

@Autowired
private HouseMovingService houseMovingService;

@GetMapping(“/myPage”)
@ResponseBody
public Result expenseStatement(HttpServletRequest request, HttpServletResponse response,
@PathVariable(“edition”) String edition,
@RequestParam(value = “pageNum”, required = false) Integer pageNum,
@RequestParam(value = “pageSize”, required = false) Integer pageSize) {
try {
String str = “我的页面”;
return ResultBulider.succuss(“成功”, str);
} catch (Exception e) {
return ResultBulider.faile(ResultCode.DATA_IS_WRONG);
}
}
}

运行 : http://localhost:8098/do1_api/api/v1/page/myPage 确保系统正常运行,方法正常返回

创建demo2(应用2)
1、application.properties配置
#端口配置
server.servlet.context-path=/do2_api
server.port=8099

2、方法
package com.example.demo.controller;

import com.example.demo.common.Result;
import com.example.demo.common.ResultCode;
import com.example.demo.service.HouseMovingService;
import com.example.demo.utils.ResultBulider;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**

  • @Description: TODO
  • @Author: Top
  • @Version: V1.0
  • @Date: 2020-01-15 15:03
    */
    @RestController
    @RequestMapping(“/api/{edition}/page”)
    public class MyPageHelperController {

@Autowired
private HouseMovingService houseMovingService;

@GetMapping(“/myUser”)
@ResponseBody
public Result expenseStatement(HttpServletRequest request, HttpServletResponse response,
@PathVariable(“edition”) String edition,
@RequestParam(value = “pageNum”, required = false) Integer pageNum,
@RequestParam(value = “pageSize”, required = false) Integer pageSize) {
try {
String str = “我的用户”;
int x = 1/0;
return ResultBulider.succuss(“成功”, str);
//return ResultBulider.faile(“效果如何”);
} catch (Exception e) {
return ResultBulider.faile(ResultCode.DATA_IS_WRONG);
}
}
}

运行 : http://localhost:8099/do2_api/api/v1/page/myUser 确保系统正常运行,方法正常返回

至此,三个应用创建完成,分别启动,进行测试。
http://localhost:8097/myZuul/do1_api/api/v1/page/myPage — 跳转到 —> 应用1
http://localhost:8097/myZuul/do2_api/api/v1/page/myUser — 跳转到 —> 应用2


学习参考
https://blog.csdn.net/ityouknow/article/details/79215698

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值