SpringCloud之Ribbon(客户端负载均衡)

SpringCloud之Ribbon(客户端负载均衡)

通过Eureka服务治理框架,我们可以通过服务名来获取具体的服务实例的位置了(IP),一般在使用SpringCloud的时候不需要自己手动创建HttpClient来进行远程调用,我们可以使用Spring封装好的RestTemplate工具类进行远程调用,使用Ribbon进行客户端负载均衡
一.使用RestTemplate发送请求+客户端负载均衡(Ribbon)
步骤:
	1.在启动类中添加RestTemplate的bean
	2.注入RestTemplate,定义静态常量URL
	public static final String PRODUCT_URL =  "http://PRODUCT-SERVER"; 
	3.调用方法,类似于发短信的方式,发起http请求
Product product = template.getForObject(PRODUCT_URL + "/products/get/" + productId, Product.class);//远程获取
	4.通过value注解可以查看是哪个端口被调用了
	 @Value("${server.port}")
  	 private String port;
1.代码
@Service
@Slf4j
public class OrderServiceImpl implements IOrderService {
    @Autowired
    private RestTemplate template;
    //传统方式存在问题:写死ip端口,后续如果做了集群,那么这种方式就无法使用集群中其他的服务了
    //比如8081 8082等端口
    //public static final String PRODUCT_URL = "http://localhost:8080";
    
    //Eureka中服务名
    public static final String PRODUCT_URL = "http://PRODUCT-SERVER"; 
    @Override
    public Product save(Long userId, Long productId) {
        log.info("OrderServiceImpl.save....");
        //远程获取
        Product product = template.getForObject(PRODUCT_URL + "/products/get/" + productId, Product.class);
        return product;
    }
}
//使用restTemplate访问restful接口非常的简单粗暴无脑。
//(url, requestMap, ResponseBean.class)这三个参数分别代表 REST请求地址、请求参数、HTTP响应转换被转换成的对象类型。
//因为进行负载均衡调用,此时需要用的是Eureka中product-server服务名
//而Eureka中可以通过服务名获取到product-server所有服务集群的ip与端口
---------------------------------------------------------------------------------------
启动类
@SpringBootApplication
@EnableEurekaClient
public class OrderMain8090 {
    @Bean
    @LoadBalanced //负载均衡
    public RestTemplate template(){
        return new RestTemplate();
    }
    public static void main(String[] args) {
        SpringApplication.run(OrderMain8090.class, args);
    }
}
2.yml文件
server:
  port: 8090

spring:
  application:
    name: order-server

eureka:
  client:
    #是否将自己注册进去eureka,false为不注册,true注册
    registerWithEureka: true
    #是否从eureka抓取注册信息,单点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
    fetchRegistry: true
    serviceUrl:
      defaultZone:  http://localhost:8761/eureka/
      
#设置轮询策略
PRODUCT-SERVER:   #必须是provide的服务名
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule
#注意:服务的名称需要和代码中的服务名称一致,不然是修改不了负载均衡策略.
3.pom.xml
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

        <!--可加可不加, eureka-client客户端默认引入ribbon依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
        </dependency>
二.什么时候需要使用Ribbon?

例如在进行秒杀项目时,为了实现服务的高可用,我们可以将服务提供者集群,当使用集群后,我们就需要将用户请求进行合理的分配,就是说将请求分给对应请求压力小的服务器,这就叫做负载均衡,SpringCloud中实现这一功能的就是Ribbon

在这里插入图片描述

三.负载均衡策略调整
#Ribbon中默认负载均衡的策略为轮询模式
#我们可以通过修改yml文件,修改策略

#设置轮询策略
PRODUCT-SERVER:   #必须是provide的服务名
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule
#注意:服务的名称需要和代码中的服务名称一致,不然是修改不了负载均衡策略.
负载均衡策略种类

在这里插入图片描述

四.小结
1.负载均衡原理:客户端从Eureka Server中得到一份服务清单(ip端口),在发送请求时通过负载均衡算法,
  在多个服务器之间选择一个进行访问
2.远程调用使用RestTemplate工具类时,需要将该bean交给spring容器管理并贴上 @LoadBalanced 负载均衡注解
3.一般集群时就需要使用到客户端负载均衡(Ribbon),还有一种服务端负载均衡(Nginx)
4.可以通过配置yml文件设置负载均衡策略
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值