知识点:
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)。