SpringCloud_v2.0
Gateway网关
简介:spring官方推出替代Netflix Zuul的网关框架,核心是过滤和路由。通过一系列过滤器将客户端请求转发(路由)到对应的微服务。它也是整个微服务的防火墙和代理器,可以隐藏服务节点的ip端口信息。除此之外,它本身也是一个微服务,要注册到Eureka服务中心。
入门
# 通过网关将包含/user的请求路由到http://127.0.0.1:9091/user/id
# 配置信息(引入依赖eureka-client和gateway)
server:
port: 10010
spring:
application:
name: api-gateway
cloud:
gateway:
routes:
# 路由id可以任意
- id: user-service-route
# (地址写死)uri: http://127.0.0.1:9091
uri: lb://user-service # 配置动态路由(lb之后的服务名必须要在eureka中注册)
# 路由断言:可以匹配映射路径
predicates:
- Path=/user/**
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka
instance:
prefer-ip-address: true
路由前缀处理
# 添加前缀:http://127.0.0.1:10010/8 -> http://127.0.0.1:10010/user/8
predicates:
- Path=/**
filters:
# 添加请求路径的前缀
- PrefixPath=/user
# 去除前缀:http://127.0.0.1:10010/api/user/8 -> http://127.0.0.1:10010/user/8
predicates:
- Path=/api/user/**
filters:
# 过滤一个路径
- StripPrefix=1 #2的话就是两个
自定义全局过滤器
//局部过滤器就先过了
@Component
public class MyGlobalFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
System.out.println("全局过滤器");
ServerHttpRequest request = exchange.getRequest();
String token = request.getQueryParams().getFirst("token");
if(StringUtils.isBlank(token)){
//设置响应状态码为未授权
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
return exchange.getResponse().setComplete();
}
return chain.filter(exchange);
}
@Override
public int getOrder() {
//值越小越先执行(配置优先级)
return 0;
}
}
/*
1.通过postman去测试接口http://127.0.0.1:10010/user/8?token=abc 可以拿到status:200 OK
2.如果测试的是 http://127.0.0.1:10010/user/8?name=lxw 就会拿到status:401 UNAUTHORIZED
*/
Gateway跨域配置
一般而言网关是所有微服务的统一入口,在调用时候会出现跨域问题。(前端js请求访问地址与当前服务器的域名、ip或端口号不一致就是跨域请求。)
spring:
cloud:
gateway:
# 解决跨域问题
globalcors:
corsConfigurations:
'[/**]':
# allowedOrigins: * (*表示全部)
allowedOrigins:
- "http://docs.spring.io"
allowedMethods:
- GET
Gateway网关一般是给终端请求使用的,而Feign是在微服务之间调用。
SpringCloud Config
简介:可以修改在git仓库中的配置文件完成其它所有微服务的配置文件的修改。
搭建配置中心
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<!--启动类里面加入注释开启配置服务
@SpringBootApplication
@EnableConfigServer
@EnableDiscoveryClient
-->
server:
port: 12000
spring:
application:
name: config-server
cloud:
config:
server:
git:
uri: https://gitee.com/lanotherl/lxw-config.git # 配置文件所在的仓库名 如果是私有的就加上gitee的账号密码
username: ?????
password: ?????
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka
# 本身也是个服务 要注册到服务中心
读取配置中心里的配置文件
拿一个微服务项目来说,现在可以将原来项目中的application.yml删除,添加一个bootstrap.yml配置文件
在里面写一些项目中固定的配置项,变动的都放在配置中心统一管理
spring:
cloud:
config:
# 要与仓库中的配置文件的application保持一致
name: user
# 要与仓库中的配置文件的profile保持一致
profile: dev
# 要与仓库中的配置文件所属的版本(分支)一样
label: master
discovery:
# 使用配置中心
enabled: true
# 配置中心服务名
service-id: config-server
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka
SpringCloud Bus
当git仓库的配置文件更新时,在不重启系统的情况下实现及时同步到各个微服务。
# config-server的配置文件中(配置中心)
management:
endpoints:
web:
exposure:
# 暴露触发消息总线的地址
include: bus-refresh
# 配置中心和具体微服务都要配置rabbitmq信息
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
# 在对应控制器controller上还要加上注释@RefreshScope来刷新配置
接着改动git上面的配置文件信息(注意!一定要通过向http://127.0.0.1:12000/actuator/bus-refresh地址发送post请求才能更新配置信息到rabbitmq中,再由rabbitmq发放到各个微服务中 完成配置信息的更新)
SpringCloud 大杂烩综合应用
总结
- 首先,我们开发微服务—比如用户服务、订单服务,并对其做集群部署。
- 将服务都注册到Eureka服务注册中心
- 服务之间通过Feign相互调用
- 各个微服务的配置从SpringCloud Config配置中心获取(配置中心读取Git仓库)
- 如果Git仓库的配置文件更新了,又不想要重启服务。就通过SpringCloud Bus、RabbitMQ(用post请求去刷新)更新服务的配置。
- PC或者移动端的请求先经过Gateway网关,进行权限鉴定、异常、日志记录,再将请求路由到不同的微服务。由于微服务部署了集群,因此路由过程中会通过Ribbon进行负载均衡,从中选择一个地址去调用。如果服务出现了错误异常,基于Hystrix进行服务降级。