nisbos


API网关--Springcloud Gateway

<h2>1、什么是API网关</h2> <p>API网关是一个服务器,是系统的唯一入口。从面向对象设计的角度看,它与外观模式类似。API网关可以看成是路由转发 + 过滤器。API网关屏蔽内部细节,为调用者提供统一入口,接收所有调用者请求,通过路由机制转发到服务实例。API网关通过一系列的过滤器可以实现一系列与核心业务无关的横切面功能,如安全认证、限流熔断、日志监控等</p> <p>API网关方式的核心要点是,所有的客户端和消费端都通过统一的网关接入微服务,在网关层处理一系列非业务功能</p> <h2>2、API网关对微服务的好处</h2> <blockquote> <p>路由转发</p> </blockquote> <p>根据请求,锁定目标微服务并将请求进行转发(此功能需要与“服务注册中心”通信。“服务注册中心”实现微服务发布注册管理功能,与其通信获得目标微服务信息。)</p> <blockquote> <p>统一鉴权</p> </blockquote> <p>对于鉴权操作不涉及到业务逻辑,那么可以在网关层进行处理,不用下层到业务逻辑</p> <blockquote> <p>日志记录</p> </blockquote> <p>由于网关是外部服务的入口,所以我们可以在这里实现访问日志的记录,可用于分析访问、处理性能指标等</p> <blockquote> <p>流量控制,熔断降级</p> </blockquote> <p>对于流量控制,熔断降级非业务逻辑可以统一放到网关层</p> <blockquote> <p>协议适配</p> </blockquote> <p>实现通信协议校验、适配转换的功能</p> <p>。。。</p> <h2>3、微服务API网关的缺点</h2> <ul> <li>由于API网关需要额外的配置,你的部署架构需要更多的编排和管理能力</li> <li>在发布阶段需要管理路由的配置,以保障外部API被正确的路由到微服务上</li> <li>除非很好的使用高可用,可扩展的架构,否则API网关将会变成瓶颈和单点</li> </ul> <h2>4、API网关Springcloud Gateway</h2> <h3>4.1、 什么是springcloud gateway</h3> <p>Spring Cloud Gateway是Spring Cloud的一个全新项目,该项目是基于Spring 5.0,Spring Boot2.0和Project Reactor等技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的API路由管理方式。</p> <p>Spring Cloud Gateway作为Spring Cloud生态系统中的网关,目标是替代 Netflix Zuul,其不仅提供统一的路由方式,并且基于Filter链的方式提供了网关基本的功能,例如:安全,监控/指标,和限流</p> <h3>4.2、 springcloud gateway常用术语</h3> <ul> <li> <p><strong>Route(路由</strong>):这是网关的基本构建块。它由一个ID,一个目标 URI,一组断言和一组过滤器定义。如果断言为真,则路由匹配。</p> </li> <li> <p><strong>Predicate(断言</strong>):这是一个Java 8的Predicate。输入类型是一个 ServerWebExchange。我们可以使用它来匹配来自HTTP请求的任何内容,例如 headers 或参数。</p> </li> <li><strong>Filter(过滤器</strong>):这是org.springframework.cloud.gateway.filter.GatewayFilter的实例,我们可以使用它修改请求和响应。</li> </ul> <h3>4.3、Springcloud Gateway工作流程</h3> <p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/aa092a3087adce890fe4e1754178e282?showdoc=.jpg" alt="" /></p> <p>客户端向Spring Cloud Gateway发出请求。然后在Gateway Handler Mapping 中找到与请求相匹配的路由,将其发送到Gateway Web Handler。Handler再通过指定的过滤器链来将请求发送到我们实际的服务执行业务逻辑,然后返回。过滤器之间用虚线分开是因为过滤器可能会在发送代理请求之前(“pre”)或之后(“post”)执行业务逻辑</p> <h3>4.4、环境搭建</h3> <blockquote> <p>a、创建一个springboot项目</p> <p>b、项目中引入如下依赖</p> </blockquote> <pre><code class="language-java"> &lt;dependency&gt; &lt;groupId&gt;org.springframework.cloud&lt;/groupId&gt; &lt;artifactId&gt;spring-cloud-starter-gateway&lt;/artifactId&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt; &lt;artifactId&gt;spring-boot-starter-webflux&lt;/artifactId&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework.cloud&lt;/groupId&gt; &lt;artifactId&gt;spring-cloud-starter-netflix-eureka-client &lt;/artifactId&gt; &lt;/dependency&gt;</code></pre> <blockquote> <p>c、application.yml配置如下内容</p> </blockquote> <pre><code class="language-yaml">server: port: 8000 spring: cloud: gateway: locator: # 是否与服务发现组件进行结合,通过 serviceId(必须设置成大写) 转发到具体的服务实例。默认为false,设为true便开启通过服务中心的自动根据 serviceId 创建路由的功能 # 路由访问方式:http://Gateway_HOST:Gateway_PORT/大写的serviceId/**,其中微服务应用名默认大写访问。 enabled: true # 微服务应用名是否允许小写 lower-case-service-id: true routes: # 路由的id - id: baidu # 需要路由的地址 uri: https://baidu.com # 满足路由的条件 predicates: - Path=/hello</code></pre> <p>上面配置的路由信息的意思是配置了一个id为baidu的路由规则,当访问地址 <a href="http://localhost:8000/hello时会自动转发到地址为https://baidu.com/hello">http://localhost:8000/hello时会自动转发到地址为https://baidu.com/hello</a></p> <h2>4.6、场景预览</h2> <blockquote> <p>路由转发</p> </blockquote> <p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/a957d0f9ba3dba69cf4a3b516b3b1b4b?showdoc=.jpg" alt="" /></p> <blockquote> <p>统一鉴权</p> </blockquote> <p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/358c3c6e14ac3443bc8057c9ccea4966?showdoc=.jpg" alt="" /></p> <h2>4.7 快速入门</h2> <p>参考<a href="https://www.showdoc.cc/chlingm?page_id=4675188183588113" title="API网关--nisbos-gateway">API网关--nisbos-gateway</a></p>

页面列表

ITEM_HTML