spring cloud zuul实现一个反向代理功能

知识点:

1.zuul:默认代理所有注册在Eureka的服务的。

2.Zuul的代理是使用Ribbon通过服务发现来定位后端服务实例的。

一.新建一个项目:ms-zuul-consumer

1.pom文件:

<!-- 注册eureka -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<!-- zuul-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
<!-- zuul-core -->
<dependency>
    <groupId>com.netflix.zuul</groupId>
    <artifactId>zuul-core</artifactId>
    <version>1.3.0</version>
</dependency>
 <!-- 注册eureka -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>
        <!-- 打印日志 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!--  web-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- feigin的依赖 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-feign</artifactId>
        </dependency>
        <!-- hystrix 的依赖  -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>
        <!--hystrix command -->
        <dependency>
            <groupId>com.netflix.hystrix</groupId>
            <artifactId>hystrix-javanica</artifactId>
            <version>1.5.12</version>
        </dependency>
        <!-- dashboard  -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
        </dependency>
        <!-- zuul-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
        </dependency>
        <!-- zuul-core -->
        <dependency>
            <groupId>com.netflix.zuul</groupId>
            <artifactId>zuul-core</artifactId>
            <version>1.3.0</version>
        </dependency>

2.resources文件:

server:
  port: 8008
spring:
  application:
    name: ms-zuul-consumer
eureka:
  client:
    healthcheck:
      enabled: true
    serviceUrl:
      defaultZone: http://ljf:123@localhost:8761/eureka
  instance:
    prefer-ip-address: true
    instance-id: ${spring.application.name}:${spring.cloud.client.ipAddress}:${spring.application.instance_id:${server.port}}

3.启动类:    @EnableZuulProxy

package com.ljf.weifuwu.springcloud.zuul;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;

/**
 * Hello world!
 *
 */
@SpringBootApplication
@EnableZuulProxy
public class ZuulConsumerApp
{   public static void main(String args[]){
    SpringApplication.run(ZuulConsumerApp.class, args);
    System.out.println( "zuul启动起来了!" );
}

}

4.启动服务:

ms-eureka-center(8761)、ms-eureka-provider(9701)、ms-zuul-consumer(8008)

5.访问直接访问提供者:http://localhost:7901/eureka-provider/1

6.通过zuul访问:http://localhost:8008/ms-eureka-provider/eureka-provider/1

可以发现此请求触发了Ribbon的“DynamicServerListLoadBalancer”,即客户端的静态服务负载均衡服务,这里根据ServiceId获取到其ip和端口,然后去访问该服务,此时Zuul就实现了一个反向代理的功能,通过Zuul服务可以访问注册在Eureka上的任意一个服务。
总结:

1.zuul:默认代理所有注册在Eureka的服务的。

2.Zuul的代理是使用Ribbon通过服务发现来定位后端服务实例的。

二.指定某个微服务进行代理

修改配置文件:

#指定要代理的微服务
zuul:
  ignored-services: '*'   #过滤掉所有服务请求
  routes:
    ms-eureka-provider: /user-zuul/**

1.阻止Zuul自动代理所有注册在Eureka上的服务。

2.设置所有在ServiceId为“ms-eureka-provider/”的微服务的代理地址变为“/user-zuul/**”,即原本的访问地址为“http://localhost:8008/ms-eureka-provider/eureka-provider/1”,设置之后可以访问简写地址“http://localhost:8008/user-zuul/eureka-provider/1

也就是说设置之后,http://localhost:8008/ms-eureka-provider/eureka-provider/1 访问不起作用了,只能通过“http://localhost:8008/user-zuul/eureka-provider/1”进行访问。

 

三.通过serviceid+path进行反向代理:

#第二种方式
zuul:
  routes:
    user:
      path: /user-zuul/**
      serviceId: ms-eureka-provider

这里的ServiceId是代理的微服务的实例ID,path是代理的ServiceId微服务对应的访问路径,它是一个ant风格的表达式,所以/user/*仅仅匹配一层目录,而/user/**可以匹配任意多层级目录

四.总结:

(1)Spring Cloud创建了一个内置Zuul代理来简化开发,可以令一个应用使用代理调用后端的一个或者多个服务。

(2)在Spring Boot的入口类上使用@EnableZuulProxy注解来开启代理。

(3)代理使用Ribbon通过服务发现来定位后端服务实例。

(4)Zuul的所有请求在Hystrix Command中执行。所以当断路器打开时,代理将不会重试连接后端服务。

(5)Zuul starter不包含服务发现客户端,所以想要使用服务发现功能,需要提供一个服务发现客户端(比如Eureka)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值