这里是【秒懂·云原生】,关注我学习云原生不迷路
如果对你有帮助,给博主一个免费的点赞以示鼓励
欢迎各位点赞评论收藏⭐️

专栏介绍

【秒懂·云原生】 目前主要更新微服务,一起学习一起进步。

本期介绍

主要介绍Spring Cloud —— 微服务可有本手、妙手、俗手?落子网关,俗手转妙手 ———— 2022高考全国作文题

文章目录

  • 专栏介绍
  • 本期介绍
  • Spring Cloud Zuul 网 关
    • API 网关
    • 使用Zuul构建微服务网关

Spring Cloud Zuul 网 关

在微服务架构中,一个系统往往由多个微服务组成,而这些服务可能部署在不同机房、不同地区、不同域名下。这种情况下,客户端(例如浏览器、手机、软件工具等)想要直接请求这些服务,就需要知道它们具体的地址信息,例如 IP 地址、端口号等。
这种客户端直接请求服务的方式存在以下问题:

  • 当服务数量众多时,客户端需要维护大量的服务地 址,这对于客户端来说,是非常繁琐复杂的。
  • 在某些场景下可能会存在跨域请求的问题。
  • 身份认证的难度大,每个微服务需要独立认证。

我们可以通过 API 网关来解决这些问题,下面就让我们 来看看什么是 API 网关。

API 网关

API 网关是一个搭建在客户端和微服务之间的服务,我们可以在 API 网关中处理一些非业务功能的逻辑,例如权限验证、监控、缓存、请求路由等。
API 网关就像整个微服务系统的门面一样,是系统对外的唯一入口。有了它,客户端会先将请求发送到 API 网关,然后由 API 网关根据请求的标识信息将请求转发到微服务实例。

对于服务数量众多、复杂度较高、规模比较大的系统来说,使用 API 网关具有以下好处:

  • 客户端通过 API 网关与微服务交互时,客户端只需要知道 API
    网关地址即可,而不需要维护大量的服务地址,简化了客户端的开发。客户端直接与 API 网关通信,能够减少客户端与各个服务的交互次数。
  • 客户端与后端的服务耦合度降低。
  • 节省流量,提高性能,提升用户体验。
  • API 网关还提供了安全、流控、过滤、缓存、计费以 及监控等 API 管理功能。

常见的 API 网关实现方案:

  • Spring Cloud Gateway

  • Spring Cloud Netflix Zuul

  • Nacos

Zuul 是 Netflix OSS 中的一员,是一个基于 JVM 路由和服务端的负载均衡器。提供路由、监控、弹性、安全等方面的服务框架。Zuul 能够与 Eureka、Ribbon、Hystrix 等组件配合使用。
Zuul 的核心是过滤器,通过这些过滤器我们可以扩展出
很多功能,比如:
1)动态路由
动态地将客户端的请求路由到后端不同的服务,做一些
逻辑处理,比如聚合多个服务的数据返回。
2)请求监控
可以对整个系统的请求进行监控,记录详细的请求响应
日志,可以实时统计出当前系统的访问量以及监控状
态。
3)认证鉴权
对每一个访问的请求做认证,拒绝非法请求,保护好后
端的服务。
4)压力测试
压力测试是一项很重要的工作,像一些电商公司需要模
拟更多真实的用户并发量来保证重大活动时系统的稳
定。通过 Zuul 可以动态地将请求转发到后端服务的集群
中,还可以识别测试流量和真实流量,从而做一些特殊
处理。
5)灰度发布
灰度发布可以保证整体系统的稳定,在初始灰度的时候
就可以发现、调整问题,以保证其影响度。
微服务中,新版服务上线的时候,为了保证不出什么
问题,可以将少量的请求转发到新的服务上,然后其
他的请求还是转发到旧的服务上去,等线上的新服务
测试通过以后,就可以重新平均分配请求。这种功能
就称为灰度发布。

使用Zuul构建微服务网关

创建一个module ws-zuul,引入starter-web、Zuul的依赖,如下:

<dependency> <groupId>org.springframework.cloud</groupId ><artifactId>spring-cloud- starter-netflix-zuul</artifactId> <version>2.2.9.RELEASE</version></dependency>

2.2.9.RELEASE 是zuul 最新版本 ,spring boot 使 用2.3.9.RELEASE 既可,版本太高的话 ,缺少ConfigurationBeanFactoryMetadata类

属性文件application.yml中增加配置信息:

spring:application:name: ws-zuulserver:port: 7000 zuul:routes: #路由转发ws: # ws是自定义的名称 当访问以/ws/**开 始的地址的时 ,就会跳到http://127.0.0.1:8001 path: /ws/** url: http://127.0.0.1:8001`

启动类如下:

@SpringBootApplication @EnableZuulProxy public class WsZuulApplication { public static void main(String[] args) {SpringApplication.run(WsZuulApplication.cla ss, args); } }

访问测试:
访问地址: http://127.0.0.1/ws/user/123
结果: