springCloud搭建微服务集群+Zuul服务器端负载均衡

  • 概述
     最近研究了一下springCloud的微服务集群,主要用到了SpringCloud的服务发现和服务器端负载均衡,所有的项目都是用的springboot,
    可以和springCloud无缝对接。
  • 技术选型

    服务发现:eureka
    负载均衡:zuul
  • 实现
    Eureka集群(eurekaServer):8001、8002、8003
    服务提供方(eurekaClient):9001、9002
    服务端负载均衡服务:9100

    1、新建工程eureka服务器,用idea创建springboot项目,引入eureka依赖

    下面是三台服务器的配置文件

    //第一台
    server:
      port: 8001
    
    spring:
      application:
        name: eureka-server
    
    eureka:
      server:
        use-read-only-response-cache: false  #禁用readOnlyMap,分为ReadWriteMap和ReadOnlyMap
        eviction-interval-timer-in-ms: 3000  #主动失效检测时间
      instance:
        hostname: server8001
      client:
    #    register-with-eureka: false  #false表示不将自己也作为服务注册到eureka
    #    fetch-registry: false
        service-url:
          #集群设置,搭建eureka集群,用逗号分隔
          defaultZone: http://localhost:8002/eureka/,http://localhost:8003/eureka/
    
    //第二台
    server:
      port: 8002
    
    spring:
      application:
        name: eureka-server
    
    eureka:
      server:
        use-read-only-response-cache: false
        eviction-interval-timer-in-ms: 3000
      instance:
        hostname: server8002
      client:
    #    register-with-eureka: false #表示不将自己作为服务注册进eureka
    #    fetch-registry: false
        service-url:
          #集群设置,搭建eureka集群,用逗号分隔,defaultZone是map类型,所以没有提示
          defaultZone: http://localhost:8001/eureka/,http://localhost:8003/eureka/
    
    //第三台
    server:
      port: 8003
    
    spring:
      application:
        name: eureka-server
    
    eureka:
      server:
        use-read-only-response-cache: false
        eviction-interval-timer-in-ms: 3000
      instance:
        hostname: server8003
      client:
    #    register-with-eureka: false #表示不将自己作为服务注册进eureka
    #    fetch-registry: false
        service-url:
          #集群设置,搭建eureka集群,用逗号分隔,defaultZone是map类型,所以没有提示
          defaultZone: http://localhost:8001/eureka/,http://localhost:8002/eureka/
    

    在入口处加上EnableEurekaServer注解

    2、服务提供者

    //第一台
    server:
      port: 9001
    
    spring:
      application:
        name: eureka-client
    
    eureka:
      client:
        service-url:
          # 指定集群服务器列表
          defaultZone: http://localhost:8001/eureka/,http://localhost:8002/eureka/,http://localhost:8003/eureka/
      instance:
        instance-id: client9001.com
        prefer-ip-address: true
        lease-renewal-interval-in-seconds: 5       #发送心跳包服务刷新时间
        lease-expiration-duration-in-seconds: 15  #服务过期时间
    
    //第二台
    server:
      port: 9002
    spring:
      application:
        name: eureka-client
    
    eureka:
      client:
        service-url:
          # 指定集群服务器列表
          defaultZone: http://localhost:8001/eureka/
      instance:
        instance-id: client9002.com
        prefer-ip-address: true
        lease-renewal-interval-in-seconds: 5       #发送心跳包服务刷新时间
        lease-expiration-duration-in-seconds: 15  #服务过期时间
    

    添加EnableEurekaClient注解,并添加api业务测试接口

    3、zuul负载均衡服务

    server:
      port: 9100
    
    spring:
      application:
        name: zuul-gateway
    
    eureka:
      client:
        service-url:
          defaultZone: http://localhost:8001/eureka,http://localhost:8002/eureka,http://localhost:8003/eureka
        registry-fetch-interval-seconds: 5  #拉取服务列表时间
      instance:
        instance-id: gateway-9100.com
        prefer-ip-address: true
    
    zuul:
      prefix: /gateway
      ignored-services: eureka-client
      routes:
        eureka-client.serviceId: eureka-client
        eureka-client.path: /client/**
    

    依次启动Eureka服务器、服务提供者client,zull服务,访问其中一台Eureka服务器的控制台显示如下

    问题:
    1)、在配置eureka时,defaultZone是个map类型,不提供检测,所以会发现在配置时没有提示,直接写就行;
    2)、eurekaServer的hostname起的作用暂不明确,在控制台显示的都是application的name,三台eureka集群和两台服务提供客户端的application.name分别是一样的;
    3)、eureka服务器的服务清单分为ReadWriteMap和ReadOnlyMap,其他服务读取时是从ReadOnlyMap读取的,当有服务注册时,写入的是ReadWriteMap,然后会同步到
    ReadOnlyMap,这是为了解决读写锁的问题。当一台服务提供应用宕机之后会发现控制台还是有这台服务器的信息,表示没有将服务下线,服务清单列表没有删除这台
    服务器的信息,导致zuul在负载均衡时,有时会调用到宕机的那台应用导致返回异常,解决方法是禁用掉eureka服务器的ReadOnlyMap,设置主动失效检测时间,让服务器定时
    去检测服务,服务提供者设置服务失效时间和发送心跳包的时间,zuul设置拉取服务清单的时间间隔
    4)、zuul路由设置,设置路径前缀和服务的匹配关系

  • 测试

    不停刷新页面,会在9001和9002之间切换,证明配置成功,关闭9002应用,刷新页面,刚开始还会出现访问失败,过了一段时间后就稳定了,
    会有一个时间差,也可以给zuul配置熔断器来进行服务降级或者转发请求到其他正常服务。

原文地址:https://www.cnblogs.com/zhouyun-yx/p/12009950.html

时间: 2024-10-22 19:33:47

springCloud搭建微服务集群+Zuul服务器端负载均衡的相关文章

实践出真知——一文教你搭建Nginx+Tomcat集群,实现负载均衡及动静分离

实践出真知--一文教你搭建Nginx+Tomcat集群,实现负载均衡及动静分离 前言 ? 想必大家对于Nginx和Tomcat都非常熟悉了,Nginx的应用非常广泛,不仅是对web静态资源非常友好,而且也是非常实用的反向代理和负载均衡软件.结合后端Tomcat的服务,从而搭建Nginx+Tomcat集群. ? 对于直接想要实践的朋友而言可以获取本文的链接中的软件包后直接看第三备份的内容. 一.集群搭建结构及拓扑 1.1集群架构图示 Nginx+Tomcat集群的结构示意图如下: 1.2系统环境与

Spring Cloud(Dalston.SR5)--Zuul 网关-微服务集群

通过 url 映射的方式来实现 zuul 的转发有局限性,比如每增加一个服务就需要配置一条内容,另外后端的服务如果是动态来提供,就不能采用这种方案来配置了.实际上在实现微服务架构时,服务名与服务实例地址的关系在 eureka server 中已经存在了,所以只需要将Zuul注册到 eureka server上去发现其他服务,就可以实现对 serviceId 的映射,并且启用了 eureka server 同时也会启用 ribbon 对服务进行负载均衡调用,加入 Zuul 到微服务集群架构图如下:

11 微服务集群网关Zuul介绍

在实际环境中,我们的应用程序会有多个服务调用者,如何将其组织起来统一对外提供服务呢?我们可以使用Netflix的Zuul框架构建微服务集群网关来解决这个问题. 1. Zuul框架介绍 1.1 关于Zuul Spring Cloud提供了多个组件用于集群内部的通信,例如服务管理组件Eureka,负载均衡组件Ribbon,REST客户端组件Feign等等.如果集群提供可一个API或者Web服务,需要与外部进行通信,最好的方式就是添加一个网关,将集群的服务都隐藏到网关后面,这种做法对于外部客户端来说,

Dubbo之旅--集群容错和负载均衡

当我们的系统中用到Dubbo的集群环境,因为各种原因在集群调用失败时,Dubbo提供了多种容错方案,缺省为failover重试. Dubbo的集群容错在这里想说说他是因为我们实际的项目中出现了此类的问题,因为依赖的第三方项目出现异常,导致dubbo调用超时,此时使用的是默认的集群容错方式,而配置的reties='3',这样前段系统连续掉用了三次服务,结果可想而知. 先说一下各节点关系: 这里的Invoker是Provider的一个可调用Service的抽象,Invoker封装了Provider地

Apache反向代理结合Tomcat集群来实现负载均衡(四)、Apache反向代理

上文中主要介绍了tomcat的集群方式,下边再来说下apache的反向代理.反向代理可以这样来理解,我们通常认为的代理(正向代理)是局域网内部机器本身不能上网,网关可以上网,大家在局域网内是通过网关上网的,这个网关就是个代理机器.反向代理意思就反了过来,现在网关并不是给内部局域网做代理的,而是给外部请求内部局域网做代理的,例如,当前一个应用系统在局域网内的A机器上,外部网络不能直接访问A机器,而是通过网关访问到了A,这里网关就是个反向代理了. 总结:正向代理---为在防火墙内的局域网客户端提供I

ASP.NET Core使用Docker-Swarm集群部署实现负载均衡实战演练

一.需求背景 人生苦短,我用.NET Core!阿笨对Docker是这样评价的:Docker在手,环境我有!Docker出手,集群我有!前面的Doc基础课程我们学习了如何使用Docker来部署搭建单机容器应用.当一台服务器的处理能力.存储空间不足时,不要企图去换更强大的服务器,对大型网站而言,不管多么强大的服务器,都满足不了网站持续增长的业务需求.实践中会发现,生产环境中使用单个 Docker 节点是远远不够的,搭建 Docker 集群势在必行.然而,面对 Kubernetes, Mesos等众

Apache反向代理结合Tomcat集群来实现负载均衡(一)

好的博文一般都能做到"望题知文",看下标题就知道下边要讲的内容,写这个标题时犹豫了一下,本来要将标题定位apache+tomcat实现负载均衡,可是又觉得这样显得比较模糊,后来想了一下,觉得利用Apache做负载均衡底层结合的是tomcat的集群功能,所以便用了这个标题. 首先先做下集群与负载均衡的概念区分,很多人一直都不理解这两个概念,不知道该如何区分这两个概念,又觉得这两个概念仿佛是一个技术的两个术语,其实不然,下边介绍下这两个概念: 什么是集群(Cluster) 所谓集群是指一组

Apache反向代理结合Tomcat集群来实现负载均衡(一)、概念理解

好的博文一般都能做到"望题知文",看下标题就知道下边要讲的内容,写这个标题时犹豫了一下,本来要将标题定位apache+tomcat实现负载均衡,但是又认为这样显得比較模糊.后来想了一下,认为利用Apache做负载均衡底层结合的是tomcat的集群功能.所以便用了这个标题. 首先先做下集群与负载均衡的概念区分,非常多人一直都不理解这两个概念,不知道该怎样区分这两个概念,又认为这两个概念仿佛是一个技术的两个术语,事实上不然,下边介绍下这两个概念: 什么是集群(Cluster) 所谓集群是指

Openfire 集群部署和负载均衡方案

一.   概述 Openfire是在即时通讯中广泛使用的XMPP协议通讯服务器,本方案采用Openfire的Hazelcast插件进行集群部署,采用Haproxy进行负载均衡,在示例环境中测试通过. 二.   示例环境 服务器配置如下: 服务器名 用途 操作系统 IP PC647 Openfire节点1 Windows7 10.200.10.11 seasky Openfire节点2 Windows xp 10.200.10.18 Lub1 Mysql数据库 LUbuntu 12 10.200.