微服务网关是整个微服务API请求的入口,可以实现日志拦截、权限控制、解决跨域问题、限流、熔断、负载均衡、黑名单与白名单拦截、授权等。
为什么需要微服务网关?
微服务中的架构模式采用前后分离,前端调用接口地址都能够被抓包分析到。
传统的方式我们可以使用过滤器拦截用户会话信息,这个过程所有的服务器都必须要写入该验证会话登陆的代码。
使用微服务网关可以统一解决这些问题和实现这些功能。
过滤器和网关的区别?
过滤器适合于单个服务实现过滤请求,局部拦截。
网关拦截整个微服务实现过滤请求,能够解决整个微服务中冗余代码,全局拦截。
官方文档:https://docs.spring.io/spring-cloud-gateway/docs/2.2.9.RELEASE/reference/html/
Gateway和Zuul的区别Zuul网关属于 netfix 公司开源的产品属于第一代微服务网关。
Gateway属于 SpringCloud 自研发的第二代微服务网关。
相比来说SpringCloudGateway性能比Zuul性能要好。
注意:Zuul基于Servlet实现的,阻塞式的Api, 不支持长连接,依赖于springboot-web组件。
SpringCloudGateway基于Spring5构建,能够实现响应式非阻塞式的Api,支持长连接,能够更好的整合Spring体系的产品,依赖于springboot-WebFux组件。
1、新建springboot项目,引入maven依赖
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-gatewayartifactId>
<version>2.0.0.RELEASEversion>
dependency>
2、编写application.yml文件,配置转发策略
spring:
application:
name: kaico-gateway-demo
cloud:
gateway:
###路由策略
routes:
###路由id
- id: kaico
####转发http://www.baidu.com/
uri: https://www.baidu.com/
###匹配规则
predicates:
- Path=/kaico/**
server:
port: 80
3、启动项目即可
浏览器请求http://127.0.0.1/kaico
,会转发请求到https://www.baidu.com/
1、maven依赖增加nacos配置依赖
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
<version>0.2.2.RELEASEversion>
dependency>
2、application.yml增加路由配置
spring:
application:
name: kaico-gateway-demo
cloud:
gateway:
discovery:
locator:
####开启以服务id去注册中心上获取转发地址
enabled: true
###路由策略
routes:
###路由id
- id: kaico
####转发http://www.baidu.com/
uri: https://www.baidu.com/
###匹配规则
predicates:
- Path=/kaico/**
###路由id
- id: member
#### 基于lb负载均衡形式转发
uri: lb://kaico-member
filters:
- StripPrefix=1
###匹配规则
predicates:
- Path=/member/**
nacos:
discovery:
server-addr: 127.0.0.1:8848
server:
port: 80
3、重启网关项目
浏览器请求路径:http://127.0.0.1/member/getUser,该请求会转发到 kaico-member 服务来处理。
相同点:都是可以实现对api接口的拦截,负载均衡、反向代理、请求过滤等,可以实现和网关一样的效果。
不同点:
Nginx采用C语言编写的,微服务都是自己语言编写的 比如Gateway就是java写的。
毕竟Gateway属于Java语言编写的, 能够更好对微服务实现扩展功能,相比Nginx如果想实现扩展功能需要结合Nginx+Lua语言等。
Nginx实现负载均衡的原理:属于服务器端负载均衡器。
Gateway实现负载均衡原理:采用本地负载均衡器的形式。
编写Java过滤器类:增加自己的校验规则,实现实现一些参数的拦截、登录的校验等等。
可接增加Ordered 接口来实现过滤器的排序执行。
@Component
public class TokenFilter implements GlobalFilter , Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
String token = exchange.getRequest().getQueryParams().getFirst("token");
if (token == null || token.isEmpty()) {
ServerHttpResponse response = exchange.getResponse();
response.setStatusCode(HttpStatus.INTERNAL_SERVER_ERROR);
String msg = "token not is null ";
DataBuffer buffer = response.bufferFactory().wrap(msg.getBytes());
return response.writeWith(Mono.just(buffer));
}
// 使用网关过滤
return chain.filter(exchange);
}
//多个过滤器排序执行
@Override
public int getOrder() {
return -1;
}
}
微服务接口保证安全
接口分为内网和外网接口
外网接口 基于OATUH2.0构建开放平台 比如appid、appsocet获取accesstoken调用接口。
内网接口:都是当前内网中实现通讯,相对于来说比较安全的。
- 需要保证接口幂等性问题(基于Token)
- 接口采用安全加密传输 https协议
- 防止数据被篡改 md5验证签名
- 使用微服务网关实现Api授权认证等、黑名单白名单。
- 对我们的接口实现服务的保护 隔离、熔断、降级等等。
最后使用apiswagger管理我们的微服务接口。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)