SpringCloud之Zuul路由网关讲解(Demo创建笔记)

hello你好我是辰兮,很高兴你能来阅读,本篇文章整理了关于SpringCloud中路由网关的相关知识点,整理了简单的创建步骤,Zuul与Nginx的相关区别,分享给初学者,知识是开源的,希望自己不断努力取的更多的进步!


一、Zuul简介

zuul 是netflix开源的一个API Gateway 服务器, 本质上是一个web servlet应用。

Zuul 在云平台上提供动态路由,监控,弹性,安全等边缘服务的框架。Zuul 相当于是设备和 Netflix 流应用的 Web 网站后端所有请求的前门。

在这里插入图片描述

zuul的例子可以参考 netflix 在github上的 simple webapp,可以按照netflix 在github wiki 上文档说明来进行使用。

在这里插入图片描述

Zuul 的主要功能是路由转发和过滤器。路由功能是微服务的一部分,比如 /api/user 转发到到 User 服务,/api/shop 转发到到 Shop 服务。Zuul 默认和 Ribbon 结合实现了负载均衡的功能。


API网关是什么

API网关可以提供一个单独且统一的API入口用于访问内部一个或多个API。简单来说嘛就是一个统一入口,比如现在的支付宝或者微信的相关api服务一样,都有一个统一的api地址,统一的请求参数,统一的鉴权。

在这里插入图片描述
这个图应该比较容易理解,其实就是一个公共的入口,通过这个入口可以访问到你想要的服务。


二、Nginx 和 Zuul

Nginx 和 Zuul 的区别

1、Nginx是C语言开发,而 Zuul 是Java语言开发

2、其次,Nginx负载均衡实现,采用服务器实现负载均衡,而Zuul负载均衡的实现是采用 Ribbon + Eureka 来实现本地负载均衡.

3、Nginx适合于服务器端负载均衡,Zuul适合微服务中实现网关

4、Nginx相比Zuul功能会更加强大,因为Nginx整合一些脚本语言( Nginx + lua )

5、Nginc 是一个高性能的HTTP 和反向代理服务器, 也是一个 IMAP / POP3 /SMIP 服务器. Zuul是 Spring Cloud Netflix 中的开源的一个API Gateway 服务器,本质上是一个web servlet 应用, 提供动态路由,监控,弹性,安全等边缘服务的框架. Zuul 相当于是设备和Netflix 流应用的Web 网站后端所有请求的前门


Nginx 和 Zuul 的共同点

1、可以实现负载均衡 (Zuul使用的是Ribbon实现负载均衡)

2、可以实现反向代理 (即隐藏真实ip地址)

3、 可以过滤请求,实现网关的效果

在这里插入图片描述


三、Zuul的创建步骤

1.创建路由网关

在项目文件夹中创建SpringBoot项目“spring-cloud-zuul”,添加如下依赖:

Spring web
Thymeleaf
Eureka Server
zuul

在这里插入图片描述

Maven添加“spring-cloud-zuul”项目pom文件,并同步依赖库

在这里插入图片描述
在启动类中添加@EnableZuulProxy注解开启Zuul功能

@SpringBootApplication
@EnableZuulProxy
public class SpringCloudZuulApplication {
    
    

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

}

在application.yml文件配置zuul路由规则

spring:
  application:
    name: spring-cloud-zuul

server:
  port: 8766

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/

## 配置zuul的路由规则
## 访问路由网关/api/c1/**,则将请求分发到对应的serviceId: springcloud-customer1 
## 访问路由网关/api/c2/**,则将请求分发到对应的serviceId: springcloud-customer2
zuul:
  routes:
    api-a:
      path: /api/c1/**
      serviceId: springcloud-customer1 
    api-b:
      path: /api/c2/**
      serviceId: springcloud-customer2

2.测试网关

访问http://localhost:8766/api/c1/customer1/get

在这里插入图片描述
访问http://localhost:8766/api/c2/customer2/get
在这里插入图片描述
这里相当于访问上面的对应的path路径,即能访问到对应的服务,而真实的服务端口其实是被隐藏的,我们看不到,也不需要去看到。


3.配置网关路由失败时的回调

当zuul网关请求的服务[serviceId: springcloud-customer2]或[serviceId: springcloud-customer1]无法到达时,我们可以通过配置网关路由失败时的回调类来响应zuul的请求者

/**
 * 1.创建回调类implements FallbackProvider
 * 2.getRoute方法返回回调服务的服务名“springcloud-customer1”
 * 3.实现fallbackResponse方法,如果请求服务失败,则返回指定的信息给调用者
 */
@Component
public class Customer1FallBackProvider implements FallbackProvider {
    
    
    @Override
    public String getRoute() {
    
    
        //ServiceId,如果需要所有调用都支持回退,则 return "*" 或 return null
        return "springcloud-customer1";
    }

    @Override
    public ClientHttpResponse fallbackResponse(String route, Throwable cause) {
    
    
        return new ClientHttpResponse() {
    
    
            /**
             * 网关向 api 服务请求失败了,但是消费者客户端向网关发起的请求是成功的,
             * 不应该把 api 的 404,500 等问题抛给客户端
             * 网关和 api 服务集群对于客户端来说是黑盒
             */
            @Override
            public HttpStatus getStatusCode() throws IOException {
    
    
                return HttpStatus.OK;
            }

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

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

            @Override
            public InputStream getBody() throws IOException {
    
    
                ObjectMapper objectMapper = new ObjectMapper();
                Map<String, Object> map = new HashMap<>();
                map.put("status", 200);
                map.put("message", "无法连接,请检查您的网络");
                return new ByteArrayInputStream(objectMapper.writeValueAsString(map).getBytes("UTF-8"));
            }

            @Override
            public HttpHeaders getHeaders() {
    
    
                HttpHeaders headers = new HttpHeaders();
                // 和 getBody 中的内容编码一致
                headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
                return headers;
            }

            @Override
            public void close() {
    
    
            }
        };
    }
}

关闭“springcloud-customer1”服务,通过zuul访问
在这里插入图片描述
通常情况下我们会设置一个回调函数,这样当某一个服务挂掉的时候我们可以收到提示信息


The best investment is to invest in yourself.

在这里插入图片描述

2020.10.24 祝大家程序员节日快乐 愿你们奔赴在自己的热爱里!

猜你喜欢

转载自blog.csdn.net/weixin_45393094/article/details/109265035