美文网首页
SpringCloud(重点是gateway)

SpringCloud(重点是gateway)

作者: 榷奕 | 来源:发表于2019-10-10 15:33 被阅读0次

    先写用法,都能干些什么,然后再附一点点源码。

    下面是gateway的部分

    gateway分成几块来写吧,路由,predict,filter,限流,发现和注册

    1. gateway路由

        @Bean
        public RouteLocator myRoutes(RouteLocatorBuilder builder) {
           return builder.routes()
            .route(p -> p
                .path("/get")
                .filters(f -> f.addRequestHeader("Hello", "World"))
                .uri("http://httpbin.org:80"))
            .build();
        }
    

    这东西涉及到核心概念是router。
    这个路由器的那些配置,在这里也就两个最主要,一个是path一个是uri。
    作用是把path(path比如7052/auth)的路由到这个uri(AUTH/**)去,实际写的时候uri多半是用服务名来写的。

    2. gateway的predict

    这个的发生时间是在router生效之前,只有通过了predict的验证条件,这个router才生效。

    例子

    spring:
      cloud:
        gateway:
          routes:
          - id: after_route
            uri: http://httpbin.org:80/get
            predicates:
            - After=2017-01-20T17:42:47.789-07:00[America/Denver]
            - Header=X-Request-Id, \d+
            - Cookie=name, forezp
            - Method=GET
            - Path=/foo/{segment}
    

    上面的这个例子就是,
    如果满足了时间在2017-1.xxx这个时间之后,
    Header里面有这个X-Request-Id而且内容是个数字,
    以及Cookie正好带着这个内容也满足,
    方法的请求类型是Get,
    Path也满足条件
    然后就满足了这个router,给路由到这个uri里面去。

    3. gateway的filter

    filter就是已经确定了是哪个router起作用,就是已经知道了用哪个服务的哪个Controller。然后在真正调用这个方法之前,和调用之后,一个标准的AOP操作。
    常用操作:鉴权、限流、日志。

    这里的具体操作比较复杂,也就是如果要在java代码里面直接配置的话,是一种写法。想在java里面设置成工厂,然后在yml里面配置又是一种写法。
    (此坑待填,具体filter怎么做登录,把登录这一个学会了就行,别的都可以不看。)

    4. gateway的发现和注册

    如果不使用gateway的自动发现自动注册的话,那就要在gateway的yml里面写好多的对应关系,比如

    spring:
      cloud:
        gateway:
          routes:
          - id: host_route
            uri: http://httpbin.org:80/get
            predicates:
                - Path=/foo/{segment}
    

    这样的东西就要写好多组。

    如果使用gateway的自动注册,那就开启一个配置,然后gateway应该是会去Eureka读取服务列表的uri和服务名,然后用服务名做path,对应到uri。

    自动配置:

    spring:
      application:
        name: sc-gateway-service
      cloud:
        gateway:
          discovery:
            locator:
              enabled: true    #(开启发现自动注册)
              lowerCaseServiceId: true    #(不开这个的话服务名是全大写的)
    

    这个实际上也就是去读取了Eureka的列表之后,然后自动生成了一堆的router,省得你自己去配置router了。

    如果开启了这个配置之后,然后你自己又在后面写了一堆yml,自己又配置了一堆router,那这两堆都有效,router不存在覆盖的说法,也就是两个路径都可以访问这个服务。


    1. 注册中心和客户端

    (1)注册中心Server
    • 导包
    • 主类上面打注解@EurekaServer
    • yml里面配个地址
      (这个服务必须独占一个模块,因为地址不能重复呀,为了这个地址只能新开一个模块,不过里面真没几行代码)
    (2) 客户端Client
    • 导包
    • 主类上面打注解@EurekaClient
    • yml里面配个服务中心地址

    Eureka源码略写

    Eureka做的事情大概都有:服务注册、服务续约、获取服务列表。
    大概的原理是把当前服务的port、application name这些封在一个对象里面,然后把对象传给Server。
    传过去之后就解析,变成map。
    最后获取列表的时候就获取map。

    2. ribborn

    首先是上面的那些配置Client用到的东西,基本不需要多什么。
    然后再代码里面@Autowired一个RestTemplate 。
    用这个Template基本可以像前端一样,把url和入参什么的都手写出来拼在字符串后面,然后就直接调用服务。
    基本就几行语句,简单至极。
    (负载均衡就是,如果调用的这个服务在Server上面跑了好几个,可以平均地去调用。)

    3. Feign

    上面的ribborn因为执行一个语句,如果多次调用每次都要重写就很麻烦,所以把那个语句封城了一个接口。

    • 导包Feign的包
    • 打注解@Feign
    • yml里面填地址
    • 被调用的模块啥也不用改,调用别人的模块多写一个接口。(这个接口着重写明白,要调用的是哪个服务,的哪个Controller,这个用url地址写明白)

    反正这个接口前后也就四五行。


    相关文章

      网友评论

          本文标题:SpringCloud(重点是gateway)

          本文链接:https://www.haomeiwen.com/subject/fexapctx.html