GateWay相对Zuul的优点
三大核心概念
项目结构及jar包
启动类
@SpringBootApplication
@EnableEurekaClient
public class GateWayMain9527 {
public static void main(String[] args) {
SpringApplication.run(GateWayMain9527.class,args);
}
}
单机版yml
server:
port: 9527
spring:
application:
name: cloud-gateway
cloud:
gateway:
routes:
- id: payment_get #路由ID,没有固定规则,要求唯一
uri: http://localhost:8001 #匹配后提供服务的路由地址
predicates:
- Path=/payment/get/** #断言,路径相匹配后进行路由
- id: payment_port #路由ID,没有固定规则,要求唯一
uri: http://localhost:8001 #匹配后提供服务的路由地址
predicates:
- Path=/payment/port/** #断言,路径相匹配后进行路由
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://eureka7001.com:7001/eureka
调用支付微服务Payment8001
@RestController
@Slf4j
public class PaymentController {
@Resource
private PaymentService paymentService;
@Value("${server.port}")
private String serverPort;
@GetMapping(value = "/payment/get/{id}")
public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id){
Payment payment = paymentService.getPaymentById(id);
log.info("查询结果:"+payment);
if(payment != null){
return new CommonResult<>(200,"查询成功,serverPort: "+serverPort,payment);
}else {
return new CommonResult<>(444,"没有记录",null);
}
}
@GetMapping(value = "/payment/port")
public String getServerPort(){
return serverPort;
}
}
1、微服务Payment8001自测
2、通过GateWay网关微服务调用微服务Payment8001自测
这样可以做到隐藏实际端口的功能
@Configuration
public class GateWayConfig {
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder routeLocatorBuilder) {
RouteLocatorBuilder.Builder routes = routeLocatorBuilder.routes();
routes.route("path_route_xc", r -> r.path("/guonei","/guoji").uri("http://news.baidu.com"));
return routes.build();
}
}
1、国内新闻
2、国际新闻
之前使用Ribbon实现复杂均衡,这里GateWay网关实现复杂均衡
启动两个服务端,只有端口不一样
@GetMapping(value = "/payment/port")
public String getServerPort(){
return serverPort;
}
网关微服务yml
server:
port: 9527
spring:
application:
name: cloud-gateway
cloud:
gateway:
discovery:
locator:
enabled: true # 开启从注册中心动态创建路由的功能,利用微服务名进行路由
routes:
- id: payment_get # 路由的id,没有固定的规则但要求统一,建议配合服务名
uri: lb://cloud-payment-service # lb表示负载均衡
predicates: # 断言
- Path=/payment/get/** # 指定的路径才可生效
- id: payment_port # 路由的id,没有固定的规则但要求统一,建议配合服务名
uri: lb://cloud-payment-service # lb表示负载均衡
predicates:
- Path=/payment/port/** # 断言,路径相对应的进行路由
eureka:
client:
service-url:
fetch-registry: true
# true将服务注册到eureka
register-with-eureka: true
# 单机版Eureka
defaultZone: http://localhost:7001/eureka
访问获取端口的url
第一次
第二次
同时满足这些条件才能路由对应的url
@Component
@Slf4j
public class LogGatewayFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
log.info("*****come in LogGatewayFilter"+ new Date());
String username = exchange.getRequest().getQueryParams().getFirst("username");
if (StringUtils.isEmpty(username)){
log.info("***用户名为空,非法进入");
exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);
return exchange.getResponse().setComplete();
}
return chain.filter(exchange);
}
@Override
//过个过滤器顺序,越小越先执行
public int getOrder() {
return 0;
}
}
正常访问
带username参数访问
无效访问
不带username参数访问
这里相当于用username参数识别请求,只过滤带username参数的请求,无此参数,将被拒绝请求访问