Skip to content

Latest commit

 

History

History
270 lines (193 loc) · 6.36 KB

6.服务负载均衡.md

File metadata and controls

270 lines (193 loc) · 6.36 KB

Spring Cloud 负载均衡

Netflix Ribbon(客户端负载均衡)

image-20210227202114355

image-20210227202252483

引入Maven 依赖

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>

激活 Ribbon 客户端

package com.springcloud.lesson6ribbonclient;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.ribbon.RibbonClient;
import org.springframework.cloud.netflix.ribbon.RibbonClients;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
@RibbonClients({
        @RibbonClient(name = "spring-cloud-service-provider")
})
public class Lesson6RibbonClientApplication {

	public static void main(String[] args) {
		SpringApplication.run(Lesson6RibbonClientApplication.class, args);
	}

	// 声明 RestTemplate
    @Bean
    public RestTemplate restTemplate() {
	    return new RestTemplate();
    }
}

配置 Ribbon 客户端

### 配置ribbon 服务地提供方
spring-cloud-service-provider.ribbon.listOfServers = \
  http://${service-provider.host}:${service-provider.port}

调整 RestTemplate

//声明 RestTemplate
@LoadBalanced // RestTemplate 的行为变化
@Bean
public RestTemplate restTemplate(){
    return new RestTemplate();
}

Neflix Ribbon 整合 Eureka

激活服务发现的客户端

package com.springcloud.lesson6ribbonclient;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.ribbon.RibbonClient;
import org.springframework.cloud.netflix.ribbon.RibbonClients;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
@RibbonClients({
        @RibbonClient(name = "spring-cloud-service-provider")
})
public class Lesson6RibbonClientApplication {

	public static void main(String[] args) {
		SpringApplication.run(Lesson6RibbonClientApplication.class, args);
	}

	// 声明 RestTemplate
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
	    return new RestTemplate();
    }
}

创建并且启动 Eureka Server

spring-cloud-lesson6-eureka-server 为例

激活 Eureka Server

package com.springcloud.lesson6eurekaserver;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication
@EnableEurekaServer
public class Lesson6EurekaServerApplication {

	public static void main(String[] args) {
		SpringApplication.run(Lesson6EurekaServerApplication.class, args);
	}

}

配置 Eureka 服务器

spring.application.name=spring-cloud-eureka-server

server.port=9090

## 管理端安全失效
# 启用端点 env
management.endpoint.env.enabled=true

# 暴露端点 env 配置多个,隔开
management.endpoints.web.exposure.include=*
management.endpoint.info.enabled=true
management.info.env.enabled=true

## 公用 Eureka 配置
### 向注册中心注册
eureka.client.register-with-eureka = false
### 向获取注册信息(服务、实例信息)
eureka.client.fetch-registry = false

## 解决 Peer / 集群 连接问题
eureka.instance.hostname = localhost
eureka.client.serviceUrl.defaultZone = http://${eureka.instance.hostname}:${server.port}/eureka

启动 Eureka Server

调整 Ribbon 客户端连接 Eureka Server

applicaiont.properties

## 服务提供方
spring.application.name = spring-cloud-ribbon-client

### 服务端口
server.port = 8080

### 管理安全失效
management.security.enabled = false

### 暂时性关闭 Eureka 注册
## 当使用 Eureka 服务发现时,请注释掉一下配置
# eureka.client.enabled = false

## 连接 Eureka Sever
eureka.client.serviceUrl.defaultZone = http://localhost:10000/eureka/

### 服务提供方主机
serivce-provider.host = localhost
### 服务提供方端口
serivce-provider.port = 9090

serivce-provider.name = spring-cloud-service-provider

### 配置ribbon 服务地提供方
## 当使用 Eureka 服务发现时,请注释掉一下配置
# spring-cloud-service-provider.ribbon.listOfServers = \
  http://${serivce-provider.host}:${serivce-provider.port}

调整服务提供方并且连接 Eureka Server

## 服务提供方
spring.application.name=spring-cloud-service-provider

## 服务端口
server.port=9090

# 启用端点 env
management.endpoint.env.enabled=true

# 暴露端点 env 配置多个,隔开
management.endpoints.web.exposure.include=*
### 暂时性关闭 Eureka 注册
## 当使用 Eureka 服务发现时,请注释掉一下配置
#eureka.client.enabled=false

## 连接 Eureka Sever
eureka.client.serviceUrl.defaultZone = http://localhost:10000/eureka/

再启动两台服务提供方实例

--server.port=9091

--server.port=9092

image-20210227230128442

image-20210227230545292

实际请求客户端

  • LoadBalancerClient
    • RibbonLoadBalancerClient

负载均衡上下文

  • LoadBalancerContext
    • RibbonLoadBalancerContext

负载均衡器

  • ILoadBalancer
    • BaseLoadBalancer
    • DynamicServerListLoadBalancer
    • ZoneAwareLoadBalancer
    • NoOpLoadBalancer

负载均衡规则

核心规则接口

  • IRule
    • 随机规则:RandomRule
    • 最可用规则:BestAvailableRule
    • 轮训规则:RoundRobinRule
    • 重试实现:RetryRule
    • 客户端配置:ClientConfigEnabledRoundRobinRule
    • 可用性过滤规则:AvailabilityFilteringRule
    • RT权重规则:WeightedResponseTimeRule
    • 规避区域规则:ZoneAvoidanceRule

PING 策略

核心策略接口

  • IPingStrategy

PING 接口

  • IPing
    • NoOpPing
    • DummyPing
    • PingConstant
    • PingUrl

Discovery Client 实现

  • NIWSDiscoveryPing