Spring Cloud负载均衡(二)-阿里云开发者社区

开发者社区> 开发与运维> 正文

Spring Cloud负载均衡(二)

简介: Netflix Ribbon 整合Eureka 激活服务发现的客户端@EnableDiscoveryClient package com.example.springcloudlesson6; import org.

Netflix Ribbon 整合Eureka

  • 激活服务发现的客户端
    @EnableDiscoveryClient
package com.example.springcloudlesson6;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
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")
})
@EnableDiscoveryClient
public class SpringCloudLesson6Application {

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

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

创建并且启动Eureka Server

spring-cloud-lesson-6-eureka-server为例
1.激活@EnableEurekaServer

package com.example.springcloudlesson6eurekaserver;

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

@SpringBootApplication
@EnableEurekaServer
public class SpringCloudLesson6EurekaServerApplication {

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

}

2.配置Eureka服务器,在application.properties


##定义应用名称
spring.application.name=spring-cloud-eureka-server
##配置端口
server.port=10000
##取消向注册中心注册
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

3.启动Eureka Server

调整Ribbon客户端

1.调整application.properties配置文件



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

##服务端口
server.port=8080
##关闭注册
#eureka.client.enabled=false

##连接 Eureka Server url
eureka.client.service-url.defaultZone=http://localhost:10000/eureka/

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

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

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

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

1.修改application.properties


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

##服务端口
server.port=9090
##关闭注册
#eureka.client.enabled=false
##连接Eureka Server
eureka.client.service-url.defaultZone=http://localhost:10000/eureka/

在启动两台 服务提供方实例
--server=9091
--server=9092
d1

负载均衡示意图

d2

程序界面示意图

d3

通过刷新重连后的结论为,三个服务器的权重是一致的,是以轮询的方式进行连接

Netflix Ribbon核心接口

  • 实际请求客户端
    LoadBalancerClient

RibbonLoadBalancerClient

  • 负载均衡上下文
    LoadBalancerContext

RibbonLoadBalancerContext

负载均衡器

ILoadBalancer
  • BaseLoadBalancer
  • DynamicServerListLoadBalancer
  • ZoneAwareLoadBalancer
  • NoOploadBalancer

规则接口

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

PING策略

IPingStrategy

  • NoOpPing (默认情况)
  • DummyPing
  • PingConstant
  • pingUrl
  • NIWSDiscoveryPing

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章