zoukankan      html  css  js  c++  java
  • 008 SpringCloud 学习笔记4-----Ribbon负载均衡

    1.Ribbon概述

    实际环境中,我们往往会开启很多个itcast-service-provider的集群。此时我们获取的服务列表中就会有多个,到底该访问哪一个呢?

    Eureka中已经帮我们集成了负载均衡组件:Ribbon,简单修改代码即可使用。

    2.负载均衡入门案例

    (1)启动两个LuckyServiceProviderApplication实例,一个8081,一个8082。

    注意:启动第2个Application时需要修改yml文件中的端口配置。

    Eureka监控面板:http://localhost:10086/

    (2)开启负载均衡

    因为Eureka中已经集成了Ribbon,所以我们无需引入新的依赖,直接修改代码。
    修改lucky-service-consumer的引导类,在RestTemplate的配置方法上添加`@LoadBalanced`注解:

    package lucky.service;
    
    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.context.annotation.Bean;
    import org.springframework.web.client.RestTemplate;
    
    @SpringBootApplication
    @EnableDiscoveryClient
    public class LuckyServiceConsumerApplication {
    
        @Bean
        @LoadBalanced
        public RestTemplate restTemplate() {
            return new RestTemplate();
        }
    
        public static void main(String[] args) {
            SpringApplication.run(LuckyServiceConsumerApplication.class, args);
        }
    
    }

    修改调用方式,不再手动获取ip和端口,而是直接通过服务名称调用:

    package lucky.service.controller;
    
    import lucky.service.domain.Users;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.cloud.client.ServiceInstance;
    import org.springframework.cloud.client.discovery.DiscoveryClient;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.ResponseBody;
    import org.springframework.web.client.RestTemplate;
    
    import java.util.List;
    
    @Controller
    @RequestMapping(path = "/consumer/user")
    public class UserController {
        @Autowired
        private RestTemplate restTemplate;
    
    //    @Autowired
    //    private DiscoveryClient discoveryClient; // eureka客户端,可以获取到eureka中服务的信息
    
        @RequestMapping(path = "/queryUsersById")
        @ResponseBody
        public Users queryUserById(@RequestParam("id") Integer id){
    
            /*// 根据服务名称,获取服务实例。有可能是集群,所以是service实例集合
            List<ServiceInstance> instances = discoveryClient.getInstances("service-provider");
            // 因为只有一个Service-provider。所以获取第一个实例
            ServiceInstance instance = instances.get(0);*/
    
    
            // 获取ip和端口信息,拼接成服务地址
            String baseUrl = "http://SERVICE-PROVIDER/users/queryUsersById?id=" + id;
            Users user = this.restTemplate.getForObject(baseUrl, Users.class);
            return user;
        }
    
    
    }

    访问页面,查看结果:

  • 相关阅读:
    浅析MySQL关联left join 条件on与where的区别
    c语言 char * char** 指针 * 和**
    MVC实用构架实战(一)——项目结构搭建
    实现存储过程自动执行jobs
    Oracle 建立索引及SQL优化
    vue vhtml table里内容不换行 带省略号
    canvas lineTo 理解
    canvas quadraticCurveTo 二次贝塞尔曲线
    canvas arc 画园
    Java对象内存模型
  • 原文地址:https://www.cnblogs.com/luckyplj/p/11452156.html
Copyright © 2011-2022 走看看