美文网首页
spring cloud gateway入门(四)-负载均衡

spring cloud gateway入门(四)-负载均衡

作者: gmdqtd | 来源:发表于2019-07-18 23:59 被阅读0次

1、ribbon负载均衡


在gateway工程添加ribbon相关依赖:
1、添加依赖

<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: &quot;Courier New&quot; !important; font-size: 12px !important;"><dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
    <version>2.1.0.RELEASE</version>
</dependency></pre>

2、修改配置文件,增加或者修改见红色部分

server:
  port: 8080
spring:
  application:
    name: gateway_server
  cloud:
    gateway:
      default-filters:
      routes:
        - id: my_route
          uri: lb://my-load-balanced-service
          predicates:
            - Path=/gateway/**
          filters:
            - StripPrefix=1
my-load-balanced-service:
  ribbon:
    listOfServers: localhost:1001, localhost:1002
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule**</pre>

3、重启gateway服务,不断访问 http://localhost:8080/gateway/hello,发现可以不断访问的时候在两个服务中来回切换,达到衡的目的。上面我们使用了轮询的负载均衡策略。

注意:

  • listOfServers:配置的微服务的服务器ip端口
  • NFLoadBalancerRuleClassName:使用的负载均衡策略,默认提供了几种,也可以自己实现(后续讲解),默认提供的如下:

image

疑问:

如果上面listOfServers中的任何一个服务关闭了,然后使用gateway访问,会出现什么情况?

事实是这样的:

比如provider1003服务宕机。那么使用轮询算法的时候,不断访问gateway,会出现:
provider1001 正常,provider1002 异常
provider1002已经宕机,但是请求还是不断转发到该服务上,导致服务访问的过程中,部分请求异常。

我们需要有这样的功能,如果某个服务宕机,那么请求就不会发送到该服务器上,如果宕机的服务器恢复了,那么请求又可以发送到该服务器上,要实现这个功能,需要ribbon对服务进行健康检查。

(1)首先微服务需要有个rest接口,就叫做heath接口吧,调用heath接口返回ok表明服务正常。

(2)gateway需要有调用heath接口的功能,并且配置到ribbon可以不断调用该接口,时刻检查服务的状态,如果有服务器挂掉,可以很快感知到,并把该服务剔除可用服务列表。

2、健康检查


1、provider1001,provider1002增加一个rest接口HealthController

import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController;

@RestController
 public class HealthController
{
    @GetMapping("/heath")
    @ResponseBody public String heath()
    { return "ok";
    }
}

2、在gateway工程里面做如下修改

(1)新建一个Config类

package com.yefengyu.gateway.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.client.RestTemplate;

@Configuration 
public class MainConfig
{
    @Bean public RestTemplate restTemplate()
    { return new RestTemplate();
    }
}

(2)新建一个健康检查的类,主要是调用heath接口。

package com.yefengyu.gateway.loadbanlance; import com.netflix.loadbalancer.IPing; import com.netflix.loadbalancer.Server; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate;

@Component 
public class HealthExamination implements IPing
{
    @Autowired private RestTemplate restTemplate;

    @Override public boolean isAlive(Server server)
    {
        String url = "http://" + server.getId() + "/heath"; try {
            ResponseEntity<String> heath = restTemplate.getForEntity(url, String.class); if (heath.getStatusCode() == HttpStatus.OK)
            {
                System.out.println("ping " + url + " success and response is " + heath.getBody()); return true;
            }
            System.out.println("ping " + url + " error and response is " + heath.getBody()); return false;
        } catch (Exception e)
        {
            System.out.println("ping " + url + " failed"); return false;
        }
    }
}

上面代码继承IPing接口,判断服务是否可用。我们在微服务中增加heath接口,在gateway中调用该接口,如果返回正常则认为微服务可用。

(3)修改配置文件,注意最后一行,这是唯一增加的。

server:
  port: 8080 spring:
  application:
    name: gateway_server
 cloud:
    gateway: default-filters:
      routes: - id: my_route
          uri: lb://my-load-balanced-service predicates: - Path=/gateway/** filters:
            - StripPrefix=1
my-load-balanced-service:
  ribbon:
    listOfServers: localhost:1001,localhost:1002,localhost:1003
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule NFLoadBalancerPingClassName: com.yefengyu.gateway.loadbanlance.HealthExamination

3、重新启动微服务和gateway服务,然后通过网关访问,可以看到可以正常访问,如果此时把某一台微服务停掉,访问的时候开始可能会报错,但是随着健康检查的运行,检测到该服务不可用,则会把该服务剔除,以后只会访问正常运行的服务。当宕机的服务重启,健康检查还会把该服务加入到可用服务列表,下次请求就会再次发送到该服务上。

相关文章

网友评论

      本文标题:spring cloud gateway入门(四)-负载均衡

      本文链接:https://www.haomeiwen.com/subject/plddlctx.html