• (五)api网关服务 zuul-路由


    路由是微服务架构中必须的一部分,比如,“/” 可能映射到你的WEB程序上,”/api/users “可能映射到你的用户服务上,“/api/shop”可能映射到你的商品服务商。(注解:我理解这里的这几个映射就是说通过Zuul这个网关把服务映射到不同的服务商去处理,从而变成了微服务!)

    这里只列举zuul一些配置,headers,client等等不做考虑。

    通过Zuul我们可以完成以下功能:

    • 动态路由
    • 监控与审查
    • 身份认证与安全
    • 压力测试: 逐渐增加某一个服务集群的流量,以了解服务性能;
    • 金丝雀测试
    • 服务迁移
    • 负载剪裁: 为每一个负载类型分配对应的容量,对超过限定值的请求弃用;
    • 静态应答处理

    构建网关

    在Idea里,新建项目,选择Spring initializer.

    下面的pom

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

      

    配置properties文件参数;

    server.port=8887
    
    spring.application.name=zuul-proxy
    
    eureka.client.service-url.defaultZone=http://localhost:8882/eureka
    

    启动类如下:

    @EnableZuulProxy	// 启动Zuul的路由服务
    @SpringBootApplication
    public class SpringCloundZuulDemoApplication {
    
    	public static void main(String[] args) {
    		SpringApplication.run(SpringCloundZuulDemoApplication.class, args);
    	}
    }
    

      

    代码基本编写完成,下面我们来启动项目;Eureka,service-hello(两个 + 一个实例),最后启动zuul-proxy;

    浏览器输入:(可见,zuul也实现了负载均衡)

     

     可见,zuul-proxy已经帮我们路由到相应的微服务。

    自定义微服务访问路径

    zuul.routes.service-hello = /hello/**
    zuul.routes.service-hello-2 = /hello2/**

    所要配置的路径可以指定一个正则表达式来匹配路径,因此,/hello/*只能匹配一级路径,但是通过/hello/**可以匹配所有以/hello/开头的路径。

    忽略指定微服务

    配置格式为: zuul.ignored-services=微服务Id1,微服务Id2...,多个微服务之间使用逗号分隔。

    zuul.ignored-services = service-hello-2
    

    可见,自定义路由依旧可以访问。

    还有其他形式的路由配置,不在此一一列举。

    spring-cloud-starter-zuul本身已经集成了hystrix和ribbon,所以Zuul天生就拥有线程隔离和断路器的自我保护能力,以及对服务调用的客户端负载均衡功能。但是,我们需要注意,当使用path与url的映射关系来配置路由规则时,对于路由转发的请求则不会采用HystrixCommand来包装,所以这类路由请求就没有线程隔离和断路器保护功能,并且也不会有负载均衡的能力。因此,我们在使用Zuul的时候尽量使用path和serviceId的组合进行配置,这样不仅可以保证API网关的健壮和稳定,也能用到Ribbon的客户端负载均衡功能。

     我们来看看zuul是否集成hystrix,在之前feign已经集成了hystrix,这里不多做说明。

     请注意,Zuul的Hystrix监控的粒度是微服务,而不是某个API,也就是所有经过Zuul的请求都会被Hystrix保护起来。假如,我们现在把service-hello-2服务关闭,再来访问会出现什么结果呢?结果可能不是我们所想那样,如下:

    那么如何为Zuul实现容错与回退呢?

    Zuul提供了一个ZuulFallbackProvider(新版:FallbackProvider接口,通过实现该接口就可以为Zuul实现回退功能。那么让我们改造之前的Zuul-proxy

    package com.example.zuul.fallback;
    
    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 sky.javaweb@qq.com
     * @version 1.0
     * @date 2018-12-28
     */
    @Component
    public class ServiceFallbackProvider 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((route + "服务暂不可用,请稍后重试!" + cause.getMessage()).getBytes());
                }
    
                @Override
                public HttpHeaders getHeaders() {
                    HttpHeaders headers = new HttpHeaders();
                    headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
                    return headers;
                }
            };
        }
    }
    

     再打开service-hello-2服务接口

  • 相关阅读:
    VSTO资源
    Windows Server 2008启用无线网络服务支持(转)
    [转载]数据库设计三大范式应用实例剖析
    C#如何为winform程序打包发布应用(图解)
    XPO学习一(获取数据库服务器时间)
    php中echo和print的区别
    isset()
    asp.net文本编辑器FCKeditor详解
    ASP.net 上传大文件问题
    StringBuilder与string和String的区别
  • 原文地址:https://www.cnblogs.com/skyLogin/p/10021356.html
Copyright © 2020-2023  润新知