springcloud zuul

springcloud zuul

Zuul 作为路由网关组件,在微服务架构中有着非常重要的作用,主要体现在以下 6 个方面。 D Zuul、 Ribbon 以及 Eureka 相结合,可以实现智能路由和负载均衡的功能, Zuul 能够 将请求流量按某种策略分发到集群状态的多个服务实例。 口 网关将所有服务的 API 接口统一聚合,并统一对外暴露。外界系统调用 API 接口时, 都是由网关对外暴露的 API 接口,外界系统不需要知道微服务系统中各服务相互调 用的复杂性。微服务系统也保护了其内部微服务单元的 API 接口 , 防止其被外界直 接调用,导致服务的敏感信息对外暴露。 口 网关服务可以做用户身份认证和权限认证,防止非法请求操作 API 接口,对服务器 起到保护作用。 口 网关可以实现监控功能,实时日志输出,对请求进行记录。 口 网关可以用来实现流量监控, 在高流量的情况下,对服务进行降级。 口 API 接口从内部服务分离出来, 方便做测试。

1.pom依赖

父pom dependencyManagement

<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>
                    org.springframework.cloud
                </groupId>
                <artifactId>
                    spring-cloud-dependencies
                </artifactId>
                <version>
                    Greenwich.RELEASE
                </version>
                <type>
                    pom
                </type>
                <scope>
                    import
                </scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

zuul pom

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
           <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
        </dependency>
    </dependencies>

2. application.properties

spring.application.name=cloud5
server.port=8092
eureka.client.service-url.defaultZone=http://localhost:8080/eureka/
zuul.routes.cloud1.path=/a/*/*
zuul.routes.cloud1.service-id=cloud3

zuul.routes.cloud2.path=/b/*/*
zuul.routes.cloud2.service-id=cloud4

#HTTP连接超时要比Hystrix的大
zuul.host.connect-timeout-millis=150000
#socket超时
zuul.host.socket-timeout-millis=600000  

#设置ribbon超时时间 
ribbon.ReadTimeout=5000
ribbon.ConnectTimeout=5000

3.代码部分

@SpringBootApplication
@EnableZuulProxy
@EnableEurekaClient
public class SpringCloud5Application {

    public static void main(String[] args) {

        SpringApplication.run(SpringCloud5Application.class,args);
    }
}

配置熔断器

return * 代表为所有服务加上熔断器

@Component
public class MyFallbackProvider implements FallbackProvider {
    @Override
    public String getRoute() {
        return "*";
    }

    @Override
    public ClientHttpResponse fallbackResponse(String route, Throwable cause) {

        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("{\"status\":500,\"message\":\"sorry,the system goes to sleep,please try again later!\"}".getBytes());
            }

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

        };
    }
}

配置过滤器

filterType方法 ----- 返回过滤器类型
Zuul有一下四种过滤器
“pre”:是在请求路由到具体的服务之前执行,这种类型的过滤器可以做安全校验,例如身份校验,参数校验等
“routing”:它用于将请求路由到具体的微服务实例,在默认情况下,它使用Http Client进行网络请求
“post”:它是在请求已被路由到微服务后执行,一般情况下,用作收集统计信息,指标,以及将响应传输到客户端
“error”:它是在其他过滤器发生错误时执行

filterOrder ----- 方法执行顺序 越小越早

shouldFilter ----- 方法表示该过滤器是否过滤逻辑,如果是ture,则执行run()方法;如果是false,则不执行run()方法.

run方法 ----- 具体过滤逻辑

@Component
public class MyZuulFilter extends ZuulFilter {
    @Override
    public String filterType() {
        return "pre";
    }

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

    @Override
    public boolean shouldFilter() {
        return true;
    }

    @Override
    public Object run() throws ZuulException {

        System.out.println("run method ......");
        return null;
    }
}
发布了43 篇原创文章 · 获赞 6 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43866295/article/details/88135305