天天看点

Spring Cloud实战(二):微服务集成-ZUUL

我们在第一章《 Spring Cloud实战(一):微服务注册与微服务发现》中,讲述了微服务注册与微服务发现,但是对用户来说,每个微服务都有自己独立的入口与访问地址,访问起来实在太不方便,所以我们需要一个统一的入口,协同它们应付所有的访问请求。或者简单来说,我们需要为所有的微服务建立一个代理,就类似于nginx服务器那样,所以今天就要请出我们的主角——ZUUL。

1. 创建项目

创建MAVEN项目,并引入zuul依赖,如下:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-zuul</artifactId>
</dependency>
<!-- 千万不要省略此依赖 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
           

为了降低Spring Cloud项目配置的复杂程度,强烈建议采用MAVEN模块的模式,就如本人的示例项目所示。在上面的配置中,最容易犯错的就是省略了第二个依赖,导致“Forwarding error”错误,如下:

com.netflix.zuul.exception.ZuulException: Forwarding error
Caused by: com.netflix.client.ClientException: Load balancer does not have available server for client: ASSET
    at com.netflix.loadbalancer.LoadBalancerContext.getServerFromLoadBalancer(LoadBalancerContext.java:) ~[ribbon-loadbalancer-.jar:]
    at com.netflix.loadbalancer.reactive.LoadBalancerCommand$1.call(LoadBalancerCommand.java:) ~[ribbon-loadbalancer-.jar:]
    at com.netflix.loadbalancer.reactive.LoadBalancerCommand$1.call(LoadBalancerCommand.java:) ~[ribbon-loadbalancer-.jar:]
           

再强调一遍,zuul服务器要读取eureka注册的微服务,必须自己也要作为eureka的客户端,所以必定要配置eureka依赖。

2. 创建配置文件

在resources文件夹中,添加application.yml,只需要配置如下内容:

#  统一访问端口
server:
  port: 

zuul:
  # 禁止服务自动添加
  ignoredServices: '*'
  # 手动添加服务
  routes:
    # 需要映射的微服务地址
    asset:
      path: /asset/**
      # 可忽略,服务器会自动发现
      serviceId: ASSET
      # 关键配置项
      stripPrefix: false
           

上面的配置已经足够支持zuul+eureka的运行了,zuul会自动发现所有的eureka服务,也就是说,zuul服务器会自动拉取eureka注册的微服务,如果需要将eureka配置得更加详细点,还可以添加如下内容:

eureka:
  client:
    # 千万不要手贱把它设成false
    fetch-registry: true
    service-url:
      defaultZone: http://localhost:8761/eureka/
           

更多配置项请参见配置文件,仅供参考。

在很多网上的实例中,很多人都把“eureka.client.fetch-registry”设置为false,结果我花费了整整一上午才调试找到这个错误。

3. 编写ZUUL主类

启动zuul服务非常简单,只需要添加如下主类,并以主函数启动即可,如下:

@SpringBootApplication
@EnableZuulProxy
public class ZuulServerApplication {

    public static void main(String[] args) {
        new SpringApplicationBuilder(ZuulServerApplication.class).web(true).run(args);
    }
}
           

现在从8000端口(请参见配置文件)访问我们的资产服务了,如http://localhost:8000/asset/list,如果没有出现404错误,则说明将8081端口上的服务映射到了8000端口上,最后再访问eureka的服务(http://localhost:8761),可以清晰地看到我们有两个eureka客户端实例,如下图所示:

Spring Cloud实战(二):微服务集成-ZUUL

4. HTTP代理服务

在项目的实际开发过程中,我们可能还需要集成其他语言版本的WEB应用程序,如python、nodejs,或者没有采用eureka客户端的服务,所以还可以直接配置HTTP代理,将配置文件修改为如下内容:

zuul:
  # 禁止服务自动添加
  ignoredServices: '*'
  # 手动添加服务
  routes:
    asset:
      path: /asset/**
      serviceId: ASSET
      stripPrefix: false
    users:
      path: /users/**
      url: http://localhost:/asset

asset:
  ribbon:
    listOfServers: localhost
           

现在不仅可以代理eureka服务器的注册服务,还可以代理其他HTTP服务,那么集成nodejs、php、python的WEB服务也不成问题了。

结论

ZUUL服务器可暂时理解为JAVA版的Nginx服务器,支持各种路径映射与代理,不仅支持eureka注册的微服务,还支持非eureka版的JAVA WEB应用程序,最后还支持非JAVA语言版的WEB应用程序。

继续阅读