路由器和过滤器:Zuul
我们都知道在微服务架构中,系统会被拆分为很多个微服务。那么作为客户端要如何去调用这么多的微服务呢?难道要一个个的去调用吗?很显然这是不太实际的,我们需要有一个统一的接口与这些微服务打交道,这就是我们需要服务网关的原因。路由在微服务体系结构的一个组成部分。Zuul是Netflix的基于JVM的路由器和服务器端负载均衡器,Zuul实现了两个功能,路由转发和过滤器。例如,/
可以映射到您的Web应用程序,/api/users
映射到用户服务,并将/api/shop
映射到商店服务。
我们新建一个项目ZuulServer,引入spring-cloud-starter-netflix-zuul 、spring-cloud-starter-netflix-eureka-client、spring-cloud-config-client
plugins {
id 'org.springframework.boot' version '2.1.3.RELEASE'
id 'java'
}
apply plugin: 'io.spring.dependency-management'
group = 'com.sl'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'
repositories {
mavenCentral()
}
ext {
set('springCloudVersion', 'Greenwich.SR1')
}
dependencies {
implementation 'org.springframework.cloud:spring-cloud-config-client'
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-zuul'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
}
}
在启动类中,加上@EnableZuulProxy
注解
@SpringBootApplication
@EnableZuulProxy
public class ZuulServerApplication {
public static void main(String[] args) {
SpringApplication.run(ZuulServerApplication.class, args);
}
}
我们新建一个bootstrap.yml ,我们还是和前面一样配置走ConfigServer
spring:
profiles: zuul01
application:
name: zuulserver
cloud:
config:
discovery:
enabled: true
service-id: configserver # 注册中心的服务名
profile: zuul01 # 指定配置文件的环境
bus:
refresh:
enabled: true
kafka:
bootstrap-servers: localhost:9092
server:
port: 8011
eureka:
client:
service-url:
defaultZone: http://localhost:8081/eureka/,http://localhost:8082/eureka/,http://localhost:8083/eureka/
management:
endpoints:
web:
exposure:
include: '*'
接下来我们启动一下实例,通过
http://localhost:8011/eurekadiscovery/hi?name=joe 就能访问到EurekaDiscovery上的接口
访问地址说明:/
eurekadiscovery是需要访问的服务的名称,/hi?name=joe是接口参数
直接访问configserver也是可以的
默认情况下,zuul的熔断机制超时时间是2秒,当一个服务响应的时间较长就会报网关超时错误。
zuul三种超时时间的配置
ribbon.ReadTimeout, ribbon.SocketTimeout是ribbon超时时间
zuul.host.connect-timeout-millis, zuul.host.socket-timeout-millis这两个和上面的ribbon都是配超时的。区别在于,如果路由方式是serviceId的方式,那么ribbon的生效,如果是url的方式,则zuul.host开头的生效。
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=6000 ,ribbon和hystrix是同时生效的,哪个值小哪个生效
上面每次请求某个服务的接口,都需要带上这个服务的名称。我们可以在配置文件中,增加路由的自定义配置。有些服务的接口不希望对外暴露可以增加路由排除的配置listForOrder防止
被外部访问.我们前面已经使用了ConfigServer 来动态更新配置文件。
我们就是git上新建一个配置文件,内容如下:
zuul:
routes:
dis:
path: /dis/**
serviceId: eurekadiscovery
ignored-patterns:
- /configserver/**
ribbon:
ReadTimeout: 3000
ConnectTimeout: 3000
我们还需要添加一个类,用于更新配置文件zuul配置
@Component
public class ZuulConfig {
@RefreshScope
@ConfigurationProperties("zuul")
public ZuulProperties zuulProperties(){
return new ZuulProperties();
}
}
http://localhost:8011/dis/hi?name=joe
http://localhost:8011/configserver/eurekadiscovery-dis02.yml
我们更改一下,git上面的routes配置改成:zuul.routes.dis.path: /mydis/**,并Post刷新一下