专栏首页卯金刀GG【spring cloud】 网关Zuul(过滤:安全、监控、限流、路由)

【spring cloud】 网关Zuul(过滤:安全、监控、限流、路由)

单点搭建 注意:蓝色虚线代表注册;绿色虚线代表调用、红色虚线代表心跳

1. 添加依赖 创建项目tcloud-gateway-zuulserver , pom.xml内容如下

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>



    <groupId> com.svw.tbox.tcloud.gateway</groupId>

    <artifactId>tcloud-gateway-zuulserver</artifactId>

    <version>0.0.1-SNAPSHOT</version>

    <name>tcloud-gateway-zuulserver</name>

    <url>http://maven.apache.org</url>



    <parent>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-starter-parent</artifactId>

        <version>1.4.3.RELEASE</version>

    </parent>



    <properties>

        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

        <java.version>1.8</java.version>

    </properties>



    <dependencies>

        <dependency>

            <groupId>org.springframework.cloud</groupId>

            <artifactId>spring-cloud-starter-eureka</artifactId>

        </dependency>

        <dependency>

            <groupId>org.springframework.cloud</groupId>

            <artifactId>spring-cloud-starter-zuul</artifactId>

        </dependency>

    </dependencies>

    <!-- 引入spring cloud的依赖 -->

    <dependencyManagement>

        <dependencies>

            <dependency>

                <groupId>org.springframework.cloud</groupId>

                <artifactId>spring-cloud-dependencies</artifactId>

                <version>Camden.SR4</version>

                <type>pom</type>

                <scope>import</scope>

            </dependency>

        </dependencies>

    </dependencyManagement>

</project>

2. 启动类开启zuul

package com.svw.tbox.tcloud.gateway.zuul;



import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.cloud.netflix.zuul.EnableZuulProxy;



@SpringBootApplication

@EnableZuulProxy

publicclass ZuulApplication {

    publicstaticvoid main(String[] args) {

        SpringApplication.run(ZuulApplication.class, args);

    }

}

3. application.yml配置端口和注册到eurekaserver

server:

  port: 8200

spring:

  application:

    name: tcloud-gateway-zuulserver

eureka:

  client:

    service-url:

      defaultZone: http://localhost:8100/eureka/

  instance:

    prefer-ip-address:true

4. 效果 启动tcloud-user-eurekaserver 2个实例进程

启动tcloud-user-provider 2个实例进程

启动tcloud-user-consumer 1个实例进程

启动tcloud-gateway-zuulserver

访问http://localhost:8200/tcloud-user-consumer/user/hrf ,

请求会被Zuul转发到http://localhost:9000/user/hrf

访问http://localhost:8200/tcloud-user-provider/getUser ,

请求会被Zuul转发到http://localhost:8000/getUser

ü 小结

前提条件:

Eureka Server注册的微服务的serviceId 在此处简称ms_id ;

Eureka Server注册的微服务的IP 在此处简称 ms_ip ;

Eureka Server注册的微服务的端口号 在此处简称 ms_port 。

Zuul转发规则是:

http://网关IP地址:网关端口号/ms_id/**

会被转发到 =》

http:// ms_ip: ms_port/**

1. 高可用 原理:

Zuul 作为 Eureka Client ,创建多个ZuulEureka Client注册到Eureka Server集群

=>将多个Zuul节点注册到eureka sever

操作:

1.tcloud-gateway-zuulserver修改依赖pom.xml改成:

server:

  port: 8200

spring:

  application:

    name: tcloud-gateway-zuulserver

eureka:

  client:

    service-url:

      defaultZone: http://localhost:8100/eureka/,http://localhost:8101/eureka/

  instance:

    prefer-ip-address:true

复制tcloud-gateway-zuulserver 项目 ,命名tcloud-gateway-zuulserver2修改 pom.xml

server:

  port: 8201

spring:

  application:

    name: tcloud-gateway-zuulserver

eureka:

  client:

    service-url:

      defaultZone: http://localhost:8100/eureka/,http://localhost:8101/eureka/

  instance:

    prefer-ip-address:true

启动两个zuul server

=》重启provider和consumer微服务 ,运行效果和单节点一样

2. 容错:Zuul回退 如果微服务下线了,针对每个微服务,都需要回复一个中文提示,而不是报异常1. 修改zuul server 1. 针对微服务tcloud-user-consumer添加回退类

package com.svw.tbox.tcloud.gateway.zuul.fallback;



import org.springframework.cloud.netflix.zuul.filters.route.ZuulFallbackProvider;

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;

import java.nio.charset.Charset;



@Component

public class ConsumerFallbackProvider implements ZuulFallbackProvider {

  @Override

  public String getRoute() {

    // 表明是为哪个微服务提供回退

    return "tcloud-user-consumer";

  }



  @Override

  public ClientHttpResponse fallbackResponse() {

    return new ClientHttpResponse() {

      @Override

      public HttpStatus getStatusCode() throws IOException {

        // fallback时的状态码

        return HttpStatus.OK;

      }



      @Override

      public int getRawStatusCode() throws IOException {

        // 数字类型的状态码,本例返回的其实就是200,详见HttpStatus

        return this.getStatusCode().value();

      }



      @Override

      public String getStatusText() throws IOException {

        // 状态文本,本例返回的其实就是OK,详见HttpStatus

        return this.getStatusCode().getReasonPhrase();

      }



      @Override

      public void close() {

      }



      @Override

      public InputStream getBody() throws IOException {

        // 响应体

        return new ByteArrayInputStream("tcloud-user-consumer微服务不可用,请稍后再试。".getBytes());

      }



      @Override

      public HttpHeaders getHeaders() {

        // headers设定

        HttpHeaders headers = new HttpHeaders();

        MediaType mt = new MediaType("application","json", Charset.forName("UTF-8"));

        headers.setContentType(mt);

        return headers;

      }

    };

  }

}

2. 效果 按照如下顺序启动:

=> tcloud-base-eurekaserver

=>tcloud-commons-configserver

=>tcloud-gateway-zuulserver

=>tcloud-user-provider

=>tcloud-user-consumer

关闭:tcloud-user-consumer

访问http://localhost:8200/tcloud-user-consumer/log-instance 出现如下效果:

1. 动态路由 参考3.9.4配置文件动态更新,将网关作为一个config client,注册到Eureka、config server ,连接到kafka。

1. Pom.xml添加依赖 <dependency>

<groupId>org.springframework.cloud</groupId>

<artifactId>spring-cloud-starter-eureka</artifactId>

</dependency>

<dependency>

<groupId>org.springframework.cloud</groupId>

<artifactId>spring-cloud-starter-config</artifactId>

</dependency>

<dependency>

<groupId>org.springframework.cloud</groupId>

<artifactId>spring-cloud-starter-bus-kafka</artifactId>

</dependency>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-configuration-processor</artifactId>

<optional>true</optional>

</dependency>

2. 添加配置参数 eureka:

client:

service-url:

defaultZone: http://localhost:8100/eureka/

instance:

prefer-ip-address:true

server:

port: 8200

spring:

application:

name: tcloud-gateway

cloud:

stream:

default-binder: kafka

kafka:

binder:

zk-nodes: localhost:2181

brokers: localhost:9092

config:

failFast:true

profile: local

label: develop

discovery:

enabled:true

serviceId: tcloud-commons-config-server

3. 启动类中注册自动配置bean @RefreshScope @SpringBootApplication

@EnableZuulProxy

@EnableFeignClients

@EnableHystrix

publicclass GatewayApplication {

publicstaticvoid main(String[] args) {

SpringApplication.run(GatewayApplication.class, args);

}

@RefreshScope

@ConfigurationProperties("zuul")

public ZuulProperties zuulProperties() {

returnnew ZuulProperties();

}

}

4. 配置路由参数 zuul:

add-host-header:true

routes:

tcloud-security-auth: /auth/**

tcloud-commons-config-server: /config/**

tcloud-gateway: /gateway/**

management:

security:

enabled:false

5. 效果 1. 开启基础服务 开启zookeeper、kafka

2. 写一个微服务测试controller tcloud-security-auth ,访问地址是:http://localhost:8200/auth/mqtt/profile

@RefreshScope

@RestController

@RequestMapping("/mqtt")

publicclass MqttController {

@Value("${profile}")

private String profile;

@RequestMapping(value = "/profile", method = RequestMethod.GET)

public String profile() {

returnprofile;

}

……

3. 修改路由地址 zuul:

add-host-header:true

routes:

tcloud-security-auth: /check/**

tcloud-commons-config-server: /config/**

tcloud-gateway: /gateway/**

management:

security:

enabled:false

4. 请求自动刷新参数 访问: http://localhost:8300/bus/refresh

5. 再次请求 访问:http://localhost:8200/check/mqtt/profile

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Linux命令之zip详解

    1、把/home目录下面的data目录压缩为data.zip zip -r data.zip data #压缩mydata目录 2、把/home目录下面的d...

    用户5640963
  • springboot-3-springboot中引入xml文件

    原文地址: http://412887952-qq-com.iteye.com/blog/2293846

    用户5640963
  • MyBatis根据数组、集合查询

    foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。foreach元素的属性主要有item,index,collection,open...

    用户5640963
  • [Android] Android O 广播限制

    通常来讲,这个广播会被所有注册这个action的receiver接收到。即便是在Android O版本,还有两类receiver仍然会接收这个广播:

    wOw
  • Go语言经典库使用分析(七)| 高性能可扩展 HTTP 路由 httprouter

    Go语言(golang)的一个很大的优势,就是很容易的开发出网络后台服务,而且性能快,效率高。在开发后端HTTP网络应用服务的时候,我们需要处理很多HTTP的请...

    飞雪无情
  • Go语言经典库使用分析(四)| Gorilla Handlers 源代码实现分析

    上一篇 Go语言经典库使用分析(三)| Gorilla Handlers 详细介绍 中介绍了Handlers常用中间件的使用,这一篇介绍下这些中间件实现的原理...

    飞雪无情
  • python开发_常用的python模块及安装方法

    adodb:我们领导推荐的数据库连接组件 bsddb3:BerkeleyDB的连接组件 Cheetah-1.0:我比较喜欢这个版本的cheetah cherry...

    Hongten
  • 50. RESTful API的简单实现 | 厚土Go学习笔记

    RESTfull API是现在很流行的 API 设计风格。众所周知的 HTTP 1.1规范正是基于 REST 架构风格的指导原理来设计的。需要注意的是,REST...

    李海彬
  • Waymo无人驾驶出租车上线:科技感爆棚,还比Uber便宜

    Waymo无人驾驶出租车终于商用了,为了这一天,Waymo付出了10年的努力,进行了超过1600万公里的实际路测。

    量子位
  • 最新实用Python异步爬虫代理池(开源)

    异步爬虫代理池,以 Python asyncio 为基础,旨在充分利用 Python 的异步性能。

    Python中文社区

扫码关注云+社区

领取腾讯云代金券