SpringCloud Netflix-Zuul使用

1、介绍

项目github地址:https://github.com/Netflix/zuul

zuul是netflix开源的一个API网关服务,本质上也是一个HTTP服务器。zuul已经整合到SpringCloud生态中,作为SpringCloudNetflix的一个组件,在微服务架构中从当API网关角色。

SpringCloud Netflix-Zuul使用_第1张图片

由上图可以看出,在微服务架构中,zuul作为整个系统访问的统一入口,具备了身份认证鉴权、动态路由、负载均衡、服务容错等一系列功能,在整个系统中至关重要。

SpringCloud Netflix-Zuul使用_第2张图片

2、使用

详细演示代码:https://gitee.com/micro_service_xk/netflix-cloud-demo.git zuul模块

1、导入zuul依赖

<dependency>
    <groupId>org.springframework.cloudgroupId>
    <artifactId>spring-cloud-starter-netflix-zuulartifactId>
dependency>

2、开启zuul网关功能

@EnableDiscoveryClient //开启Eureka客户端
@EnableZuulProxy // 开启Zuul的网关功能
@SpringBootApplication
public class App {

    public static void main(String[] args) {
        SpringApplication.run(App.class,args);
    }

}

application.yml配置文件

server:
  port: 10010 # 服务端口
spring:
  application:
    name: zuul-service # 服务名,将注册到eureka-server中
eureka:
  client:
    service-url:  # eureka-server的地址信息,多个使用英文逗号分割
      defaultZone: http://127.0.0.1:10086/eureka

3、演示zuul路由

注册到eureka服务端的服务实例列表:

SpringCloud Netflix-Zuul使用_第3张图片

携带服务名访问zuul,zuul将动态路由到指定服务。例如访问http://localhost:10010/order-service/order/1,且zuul已集成robbin、hystix,已实现多实例路由负载均衡及熔断。

在这里插入图片描述

其它配置信息:

zuul:
  retryable: true #zuul开启重试
  prefix: /api #zuul网关访问前缀

ribbon:
  ConnectTimeout: 250 # Ribbon的连接超时时间(创建会话的连接时间,不是服务的响应时间,而是本机与服务建立会话的时间。)
  ReadTimeout: 1000 # Ribbon的数据读取超时时间(当请求发出之后,如果对方服务没有在规定时间内返回)
  OkToRetryOnAllOperations: true # 是否对所有操作都进行重试
  MaxAutoRetriesNextServer: 1 # 切换实例的重试次数(默认1)
  MaxAutoRetries: 0 # 对当前实例的重试次数(默认0)

hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 3000 # 设置hystrix的降级超时时间为3000ms,对所有远程服务调用生效

使用重试机制需要引入spring-retry依赖

<dependency>
    <groupId>org.springframework.retrygroupId>
    <artifactId>spring-retryartifactId>
dependency>

使用zuul降级操作,需要编写降级类(示例:)

@Component
public class OrderServiceFallBack implements FallbackProvider {
    @Override
    public String getRoute() {
        /**
         * 指定对哪个服务进行降级操作,* 代表对所有服务进行降级
         */
        return "order-service";
    }

    @Override
    public ClientHttpResponse fallbackResponse(String route, Throwable cause) {
        return new ClientHttpResponse() {
            @Override
            public HttpStatus getStatusCode() throws IOException {
                return HttpStatus.BAD_GATEWAY;
            }

            @Override
            public int getRawStatusCode() throws IOException {
                return HttpStatus.BAD_REQUEST.value();
            }

            @Override
            public String getStatusText() throws IOException {
                return HttpStatus.BAD_REQUEST.getReasonPhrase();
            }

            @Override
            public void close() {

            }

            @Override
            public InputStream getBody() throws IOException {
                String msg = "{\"code\":-1,\"msg\":\"远程服务调用失败\"}";
                return new ByteArrayInputStream(msg.getBytes());
            }

            @Override
            public HttpHeaders getHeaders() {
                HttpHeaders headers = new HttpHeaders();
                headers.setContentType(MediaType.APPLICATION_JSON);
                return headers;
            }
        };
    }
}

4、演示zuul过滤器

你可能感兴趣的:(分布式,spring,cloud,eureka,微服务)