持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第15天,点击查看活动详情
15、在微服务集群中初试Zuul
在前面小节介绍的例子中, Zuul 将请求转发到一个Web 项目进行处理,如果实际处理 请求的不是一个 Web 项目,而是整个微服务集群,那么 Zuul 将成为整个集群的网关。在 加入 Zuul 前, Spring Cloud 集群的结构请见下图。
为微服务集群加入Zuul网关后,结构如下图。
1、集群搭建
沿用以前的Spring Cloud集群: 服务提供者:http://localhost:8888/person/1 服务调用者:http://localhost:9000/router/1
2、路由到集群服务
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
<version>1.4.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
<version>1.4.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>1.4.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.3</version>
</dependency>
<dependency>
<groupId>com.netflix.servo</groupId>
<artifactId>servo-core</artifactId>
<version>0.12.7</version>
</dependency>
启动类添加注解:
@SpringBootApplication
@EnableZuulProxy
public class SrlGatewayRouterApplication {
public static void main(String[] args) {
SpringApplication.run(SrlGatewayRouterApplication.class, args);
}
}
应用类跟前面的例子一致,使用@EnableZuulProxy 注解。但是,由于网关项目需要 加到集群中,因此要修改配置文件 让其注册到 Eureka 服务器中。本例的配置文件如代码
其中配置包括: 端口、应用名称、配置本服务示例的主机名称、指定服务注册中心地址,为集群时,多个地址以逗号分隔、配置路由规则等。
#端口
server.port=8080
#应用名称
spring.application.name=gateway-router
#配置本服务示例的主机名称
eureka.instance.hostname=localhost
#指定服务注册中心地址,为集群时,多个地址以逗号分隔
eureka.client.serviceUrl.defaultZone=http://slave1:8761/eureka/,http://slave2:8762/eureka/
#配置路由规则
zuul.routes.sale.path=/sale/**
zuul.routes.sale.service-id=invoker-server
使用eureka 配置,将自己注册到 8761的 Eureka 在配置 Zuul 时, 声明所有的 /sale/** 请求将会被转发到 Id为 invoker-server 的服务进行处理。 一般情况下,配置了 serviceId 后,在处理请求的 routing 阶段,将会使用一个名称为RibbonRoutingFilter 的过滤器 该过滤器会调用 Ribbon的 API 来实现负载均衡, 默认情况下用 HttpClient 来调用集群服务。
启动各个项目: 访问:http://localhost:8080/sale/router/1 即可转发到:http://localhost:9000/router/1
返回值:{"id":1,"age":"张三","name":"克罗斯","message":"http://localhost:8888/person/1"}
记录一个错误: 项目能正常访问, gateway-router 项目 特定时间内 控制台会输出: java.lang.NoSuchMethodError: com.netflix.servo.monitor.Monitors.isObjectRegistered(Ljava/lang/String;Ljava/lang/Object;)Z
添加该依赖即可:
<dependency>
<groupId>com.netflix.servo</groupId>
<artifactId>servo-core</artifactId>
<version>0.12.7</version>
</dependency>
本例的结构图:
3、Zuul Http 客户端
我们知道, ** Ribbon 用来实现负载均衡, Ribbon 在选取了合适的服务器后 ,再调用RSTE客户端 API 来调用集群服务。 在默认情况下,将使用 HttpClient的 API 来调用集群服务。** 除了 HttpClient 外,还可以使用 OkhttpClient ,以及 com.netflix.niws.client.http.RestClient, RestClient 目前已经不推荐使用,如果想启 用 OkhttpClient ,可以添加以下配置: ribbon.okhttp.enabled=true 。除了该配置外,还要在 pom.xml 中加入 OkHttpClient 依赖:
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
</dependency>