【微服务架构学习笔记】Spring Cloud核心组件之路由网关Zuul

一、网关介绍

  微服务框架中,后端服务一般都不是直接开发给调用端,而是通过一个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开源微服务网关,与EurekeRibbonHystrixFegin等组件配合使用,Zuul2.0性能明显高于Zuul1.0

(2)kong

  Mashape公司开源,基于NginxAPI 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网关

  依次启动Eurekauser和网关!

(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.csdn.net/  欢迎转载,一起技术交流探讨!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值