微服务网关是整个微服务API接口的入口。
可以实现:
API接口过滤
验证登录
解决跨域
日志拦截
权限控制
限流熔断
负载均衡
黑白名单机制
2.过滤器和网关的区别过滤器局部拦截
网关全局拦截
3.zuul网关和gateway网关区别gateway比zuul的性能要好很多。
zuul底层基于servlet实现,阻塞式api,不支持长连接
gateway基于spring5构建,响应式非阻塞api,支持长连接
4.网关与nginx区别相同点:都可以实现api拦截,负载均衡,反向代理,请求过滤
不同点: gateway采用java语言编写 nginx采用c语言编写
5.搭建网关1)pom依赖
2.1.11.RELEASE org.springframework.boot spring-boot-starter-parent2.1.11.RELEASE com.alibaba.cloud spring-cloud-alibaba-nacos-discovery2.1.1.RELEASE org.springframework.cloud spring-cloud-starter-openfeignorg.springframework.cloud spring-cloud-starter-gatewayorg.springframework.cloud spring-cloud-dependenciesGreenwich.RELEASE pom import org.springframework.boot spring-boot-dependencies${boot-version} pom import com.alibaba.cloud spring-cloud-alibaba-dependencies2.1.1.RELEASE pom import
2)yml配置
server:
port: 80
####服务网关名称
spring:
application:
name: demo-gateway
cloud:
gateway:
###路由策略
routes:
###根据我们的服务名称查找地址实现调用
- id: member
####转发 https://www.baidu.com/ http://127.0.0.1:8080/ lb://nacos-member/
uri: lb://nacos-member/
filters:
- StripPrefix=1
###匹配规则
predicates:
- Path=/member
@Component
public class TokenGlobalFilter implements GlobalFilter, Ordered {
@Override
public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
// //获取参数
// String token = exchange.getRequest().getQueryParams().getFirst("token");
// if (StringUtils.isEmpty(token)) {
// 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 0;
}
}
package com.demo.filter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.http.HttpHeaders;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
@Component
public class CrossOriginFilter implements GlobalFilter {
@Override
public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpRequest request = exchange.getRequest();
ServerHttpResponse response = exchange.getResponse();
HttpHeaders headers = response.getHeaders();
headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN, "*");
headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS, "POST, GET, PUT, OPTIONS, DELETE, PATCH");
headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS, "true");
headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_HEADERS, "*");
headers.add(HttpHeaders.ACCESS_CONTROL_EXPOSE_HEADERS, "*");
return chain.filter(exchange);
}
}
4)启动
package com.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class AppGateWay {
public static void main(String[] args) {
SpringApplication.run(AppGateWay.class);
}
}
5)测试
http://localhost/member/getUser?userId=1
6.动态网关实现1)数据库
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for sys_gateway
-- ----------------------------
DROP TABLE IF EXISTS `sys_gateway`;
CREATE TABLE `sys_gateway` (
`id` bigint(20) NOT NULL,
`route_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`route_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`route_pattern` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`route_type` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`route_url` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of sys_gateway
-- ----------------------------
INSERT INTO `sys_gateway` VALUES (1, 'member', 'member', '/member
@RequestMapping("/synGatewayConfig")
public String synGatewayConfig() {
return gatewayService.loadAllLoadRoute();
}
}
7)启动类
package com.demo;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("com.demo.mapper")
public class AppGateWay {
public static void main(String[] args) {
SpringApplication.run(AppGateWay.class);
}
}
8)测试
http://localhost/synGatewayConfig 同步网关配置
http://localhost/member/getUser?userId=1



