SpringCloud(重点是gateway)

2019-10-10  本文已影响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
(2) 客户端Client

Eureka源码略写

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

2. ribborn

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

3. Feign

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

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


上一篇下一篇

猜你喜欢

热点阅读