• spring cloud zuul 配置


    参考:http://www.ityouknow.com/springcloud/2017/06/01/gateway-service-zuul.html

    spring boot版本:2.0.3.RELEASE

    pom.xml

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
    </dependency>
    <!-- 通过注册中心调用时需要引入此依赖 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>

    application.properties

    可以手动配置固定地址调用,也可以通过注册中心调用,二选一

    spring.application.name=gateway-service-zuul-wly
    server.port=8088
    #1.显式将所有/wly/**请求转发给http://localhost:8081处理,例如/wly/a等同于http://localhost:8081/a
    #zuul.routes.wly.path=/wly/**
    #zuul.routes.wly.url=http://localhost:8081
    #2.配置注册中心地址,默认通过注册中心调用,规则“/注册中心serviceId/xxx”
    eureka.client.serviceUrl.defaultZone=http://localhost:8765/eureka/

    启动类

    package com.wang.springcloudzuul;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
    
    @SpringBootApplication
    @EnableZuulProxy
    public class SpringcloudzuulApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(SpringcloudzuulApplication.class, args);
        }
    }

    启动一个注册中心、1个生产者、2个消费者、1个zuul服务,如下图:

    单独访问消费者服务

    http://localhost:8081/a/c?name=sb

    页面

    Hello World!sb

    使用zuul通过eureka多次访问消费者服务

    http://localhost:8088/spring-cloud-consumer/a/c?name=sb

    页面

    Hello World!sb

    查看控制台日志

    多次请求zuul的服务,请求会被分发到不同的消费者服务里

    zuul服务熔断机制

    新增一个类

    package com.wang.springcloudzuul.fallback;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.cloud.netflix.zuul.filters.route.FallbackProvider;
    import org.springframework.http.HttpHeaders;
    import org.springframework.http.HttpStatus;
    import org.springframework.http.MediaType;
    import org.springframework.http.client.ClientHttpResponse;
    import org.springframework.stereotype.Component;
    
    import java.io.ByteArrayInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    
    /**
     * @Author wly
     * @Date 2018/7/3 15:53
     */
    @Component
    public class ProducerFallBack implements FallbackProvider {
        private final Logger logger = LoggerFactory.getLogger(FallbackProvider.class);
    
        /**
         * 定义对那个服务做熔断
         * @return
         */
        @Override
        public String getRoute() {
            return "spring-cloud-provider";
        }
    
        /**
         * 提供者路由熔断返回值
         *
         * @return
         */
        public ClientHttpResponse fallbackResponse() {
            return new ClientHttpResponse() {
                @Override
                public HttpStatus getStatusCode() throws IOException {
                    return HttpStatus.OK;
                }
    
                @Override
                public int getRawStatusCode() throws IOException {
                    return 200;
                }
    
                @Override
                public String getStatusText() throws IOException {
                    return "OK";
                }
    
                @Override
                public void close() {
    
                }
    
                @Override
                public InputStream getBody() throws IOException {
                    return new ByteArrayInputStream("The service is unavailable.".getBytes());
                }
    
                @Override
                public HttpHeaders getHeaders() {
                    HttpHeaders headers = new HttpHeaders();
                    headers.setContentType(MediaType.APPLICATION_JSON);
                    return headers;
                }
            };
        }
    
        @Override
        public ClientHttpResponse fallbackResponse(String route, Throwable cause) {
            if (cause != null && cause.getCause() != null) {
                String reason = cause.getCause().getMessage();
                logger.info("Excption {}", reason);
            }
            return fallbackResponse();
        }
    }

    当服务调用失败,会返回

    The service is unavailable.

    zuul服务重连机制

    pom.xml新增配置

    <dependency>
        <groupId>org.springframework.retry</groupId>
        <artifactId>spring-retry</artifactId>
    </dependency>

    applicaiton.yml新增配置

    #服务重试功能
    zuul.retryable=true
    #重试次数
    ribbon.MaxAutoRetries=2
    #重试其他实例的最大次数
    ribbon.MaxAutoRetriesNextServer=0

    提供者controller

    package com.wang.eurekaprovider.controller;
    
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    /**
     * @Author wly
     * @Date 2018/6/27 16:15
     */
    @RestController
    @RequestMapping("/a")
    public class HelloController {
        @RequestMapping("/b")
        public String hello(String name) throws InterruptedException {
            System.out.println("11111111111111111");
            Thread.sleep(100000L);
            return "Hello World!" + name;
        }
    }

    服务调用失败后自动重试

    通过zuul访问http://localhost:8088/spring-cloud-provider/a/b?name=sb

    控制台输出3次:11111111111111111

  • 相关阅读:
    sublime text 2安装及使用
    C陷阱与缺陷之语法陷阱
    上门洗车APP --- Androidclient开发 之 项目结构介绍
    编写语法分析程序
    TCP header
    boost事件处理
    TP-LINK无线路由器WR340G+ 54M支持WDS
    300M无线路由器 TL-WR842N
    python 2.7 支持dict comprehension
    100M 宽带办理
  • 原文地址:https://www.cnblogs.com/douJiangYouTiao888/p/9258446.html
Copyright © 2020-2023  润新知