15、在微服务集群中初试Zuul

253 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第15天,点击查看活动详情

15、在微服务集群中初试Zuul

在前面小节介绍的例子中, Zuul 将请求转发到一个Web 项目进行处理,如果实际处理 请求的不是一个 Web 项目,而是整个微服务集群,那么 Zuul 将成为整个集群的网关。在 加入 Zuul 前, Spring Cloud 集群的结构请见下图。

image.png 为微服务集群加入Zuul网关后,结构如下图。 image.png

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>

本例的结构图:

image.png

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>