SpringCloud(重点是gateway)
先写用法,都能干些什么,然后再附一点点源码。
下面是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地址写明白)
反正这个接口前后也就四五行。