一、配置gateway

1、引入依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

2、配置

spring.cloud.gateway.discovery.locator.enabled=true
spring.cloud.gateway.discovery.locator.lower-case-service-id=true

#请求为 /comsumer/ 开头的发送到http://localhost:8082服务器端口
spring.cloud.gateway.routes[0].id=route_1
spring.cloud.gateway.routes[0].uri=http://localhost:8082
spring.cloud.gateway.routes[0].predicates=Path=/comsumer/**
spring.cloud.gateway.routes[0].filters=StripPrefix=1

#请求为 /1comsumer/ 开头的发送到http://localhost:8084服务器端口
spring.cloud.gateway.routes[1].id=route_2
spring.cloud.gateway.routes[1].uri=http://localhost:8084
spring.cloud.gateway.routes[1].predicates=Path=/1comsumer/**
spring.cloud.gateway.routes[1].filters=StripPrefix=1

这里可以配置多个网关,我在这里配置了两个,通过数组下标的方式对每一个网关进行配置

 3、编码

先创建一个类继承GlobalFilter和Ordered,在重写的filter方法中编写逻辑需求,我这里是开头为 /1comsumer/ 的请求需要登录,返回了一个字符串

@Component
public class GatewayFilter implements GlobalFilter, Ordered {

    private Logger logger= LoggerFactory.getLogger(getClass());

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        logger.info("GatewayFilter filter start");
        ServerHttpRequest request = exchange.getRequest();
        ServerHttpResponse response = exchange.getResponse();
        RequestPath path = request.getPath();
        String uristr = path.toString();
        if(uristr.startsWith("/comsumer")){
            JSONObject message = new JSONObject();
            message.put("data","需要登录");
            byte[] bits = message.toJSONString().getBytes(StandardCharsets.UTF_8);
            DataBuffer buffer = response.bufferFactory().wrap(bits);
            response.setStatusCode(HttpStatus.UNAUTHORIZED);
            response.getHeaders().add("Content-Type","text/plain;charset=utf-8");
            return response.writeWith(Mono.just(buffer));
        }
        return chain.filter(exchange);
    }

    @Override
    public int getOrder() {
        return 0;
    }
}

 二、配置hystrix

1、引入依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
    <version>2.2.10.RELEASE</version>
</dependency>

2、配置

feign.circuitbreaker.enabled=true

3、编写一个类继承FallbackFactory<需要熔断的fegin类>

@Component
public class FallBack implements FallbackFactory<CategoryFeign> {
    @Override
    public CategoryFeign create(Throwable cause) {
        return new CategoryFeign() {

            @Override
            public ResponseMessage getAllCategory() {
                ResponseMessage responseMessage = new ResponseMessage ();
                responseMessage.setCode("500");
                responseMessage.setMsg("出错了");
                return responseMessage;
            }
        };
    }
}

在需要熔断的fegin类的注解上添加 fallbackFactory = 实现熔断的类的类名.class

@FeignClient(name = "SpringCloudProvider",contextId = "CategoryFeign",fallbackFactory = FallBack.class)
public interface CategoryFeign extends CategoryService {
}

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐