服务网关~Gateway

服务网关~Gateway,第1张

目录

1 前言

2 Gateway

2.1 Gateway初步使用

2.2 从nacos获取信息


1 前言

网关就是系统的统一入口,它封装了应用程序的内部结构,为客户端提供统一服务,一些与业务本身无关公共逻辑可以在这里实现,像认证、鉴权、路由转发等等。

常见网关:

  • Nginx+lua

使用nginx的反向代理和负载均衡可实现对api服务器的负载均衡和高可用,lua是一种脚本语言,可以编写一些简单的逻辑,nginx支持lua脚本

  • Kong

基于nginx+lua开发,性能高,稳定,有多个可用的插件(限流、鉴权)可以开箱即用

问题:只支持http协议,二次开发,自由扩展困难;提供管理API,缺乏更易用的管控、配置方式。

  • Zuul

Netflix开源的网关,功能丰富,使用java开发,易于二次开发

问题:缺乏管控,无法动态配置;依赖组件较多;处理http请求依赖是web容器,性能不如Nginx。

  • Spring Cloud Gateway

spring公司为了替换zuul而开发的网关服务。

2 Gateway 2.1 Gateway初步使用

        Spring Cloud Gateway是Spring官方基于Spring 5.0,Spring Boot 2.0和Project Reactor等技术开发的网关,Spring Cloud Gateway旨在为微服务架构提供一种简单而有效的统一的API路由管理方式。Spring Cloud Gateway作为Spring Cloud生态系中的网关,目标是替代ZUUL,其不仅提供统一的路由方式,并且基于Filter链的方式提供了网关基本的功能,例如:安全,监控/埋点,和限流等。

优点:

  •         性能强劲:是第一代网关Zuul的1.6倍
  •         功能强大:内置了很多实用的功能,例如,转发,监控、限流
  •         设计优雅,容易扩展

缺点:

  • 其实现依赖于Netty与WebFlux,不是传统的Servlet编程模型,学习成本高
  • 不能将其部署在Tomcat、Jetty等Servlet容器里、只能打成jar运行
  • 需要Spring Boot2.0 以上才能支持

1)新建一个moudle,添加api-gateway

2)引入相关依赖

    
        
        
            org.springframework.cloud
            spring-cloud-starter-gateway
        
    

3)编写配置文件

server:
  port: 7000
spring:
  application:
    name: api-gateway
  cloud:
    gateway:
      routes: #路由数组(当前请求满足什么样的条件转发到哪个微服务上)
        - id: product_route #当前路由发的标识、要求唯一
          uri: http://localhost:8081 #请求最终要被转发的地址
          order: 1 #路由的优先级,数字越小代表路由的优先级越高
          predicates: #断言(条件判断,返回值是boolean 转发请求要满足的条件)
            - Path=/product-serv/** #当请求路径满足Path的指定路径时,此路由信息才会正常转发
          filters: #过滤器(在请求传递过程中,对请求做一些处理)
            - StripPrefix=1 #在请求转发之前去掉一层路径

4) 商品微服务controller层

@RestController
@Slf4j
public class ProductController {

    @Autowired
    private ProductService productService;

    @RequestMapping("/product/{pid}")
    public Product product(@PathVariable("pid") Integer pid) {
        log.info("接下来要进行{}号商品的查询",pid);
        Product product =  productService.findById(pid);
        log.info("商品信息查询成功,内容为{}", JSON.toJSONString(product));
        return product;
    }



}

5)通过网关访问

 可见通过网关:http://localhost:7000/product-serv/product/1 == http://localhost:8081/product/1

2.2 从nacos获取信息

由2.1 可知:服务网关需要路由的地址是在配置文件中写死固定的,那么这显然在平时开发中是不方便的,所以我们需要将我们的网关服务和nacos结合起来,从nacos中去获取配置。

1)在网关微服务的配置文件下加入nacos的配置

        
        
            com.alibaba.cloud
            spring-cloud-starter-alibaba-nacos-discovery
        

2)在启动类上加入@EnableDiscoveryClient注解

 3)修改配置文件

server:
  port: 7000
spring:
  application:
    name: api-gateway
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848 #将gateway注册到nacos
    gateway:
      discovery:
        locator:
          enabled: true #让gateway从nacos中获取信息
      routes: #路由数组(当前请求满足什么样的条件转发到哪个微服务上)
        - id: product_route #当前路由发的标识、要求唯一
          #uri: http://localhost:8081 #请求最终要被转发的地址
          uri: lb://server-product #lb负载均衡 ,后面跟具体微服务在nacos中的标识
          order: 1 #路由的优先级,数字越小代表路由的优先级越高
          predicates: #断言(条件判断,返回值是boolean 转发请求要满足的条件)
            - Path=/product-serv/** #当请求路径满足Path的指定路径时,此路由信息才会正常转发
          filters: #过滤器(在请求传递过程中,对请求做一些处理)
            - StripPrefix=1 #在请求转发之前去掉一层路径
#localhost:7000/product-serv/product/1--->http://localhost:8081/product/1

4)测试访问

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/904823.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-15
下一篇 2022-05-15

发表评论

登录后才能评论

评论列表(0条)

保存