首页 > 其他分享 >springcloud--负载均衡(ribbon)

springcloud--负载均衡(ribbon)

时间:2022-09-25 23:14:23浏览次数:63  
标签:String -- springcloud public uname 服务提供者 class ribbon

springcloud--负载均衡(ribbon)

一、项目背景

  1. 搭建好的springcloud项目,包含erueka模块(这里是单个,也可以多个)、服务提供者(多个)、消费者。
  2. 创建多个服务提供者模块,用于集群(单个业务多个提供接口,避免单个宕机或者其他因素影响服务)。
  3. 相同的服务提供者的服务名需要保持一直,将其在erueka注册中心进行注册。
  4. erueka中包含了ribbon依赖,可以不需要单独引入。
  5. ribbon负载均衡,引入依赖坐标,并在消费者模块的调用接口restTemplate(配置类)上添加@LoadBalanced
  6. 需要创建RibbonRule配置类配置一个策略对象,即将策略装配到容器中,RandomRule();//随机访问策略
  7. 在消费者模块的启动类上增加ribbon启动注解:@RibbonClient(name = "provider",configuration = RibbonRule.class)

二、代码步骤

  1. 搭建多个服务提供者

    创建一个springboot项目provider-8004,并将provider-8001项目的代码复制一份到provider-8004中,因为是单机原因,这里用端口进行区分,8001是服务提供者1,8004是服务提供者2,8080是erueka注册中心,8002是消费者(这里的8003端口的项目已经删除,故略)。

    8004服务提供者启动类代码:(以下8004逻辑代码与8001相同)

    @SpringBootApplication
    @EnableEurekaClient
    public class Provider8004Application {
        public static void main(String[] args) {
            SpringApplication.run(Provider8004Application.class, args);
        }
    }
    

    service层代码:

    @Mapper
    @Repository
    public interface ShiroUserService {
        @Select("select * from usershiro")
        public List<ShiroUser> selectAll();
    
        @Select("select * from usershiro where uname=#{uname}")
        public ShiroUser selectOne(String uname);
    
        @Select("insert into usershiro (uname,password,datasource) values (#{uname},#{password},#{datasource})")
        void insertOne(ShiroUser shiroUser);
    
        @Select("delete from usershiro where uname=#{uname}")
        void deleteOne(String uname);
    }
    

​ 实体类代码:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class ShiroUser {
    private Integer uid;
    private String uname;
    private String password;
    private String datasource;
}

controller代码

@RestController
public class ShiroUserController {
    @Autowired
    ShiroUserService shiroUserService;

    @GetMapping("/getAll")
    public List<ShiroUser> getAll(HttpServletRequest request){
        System.out.println("服务端口:"+request.getServerPort()+"服务名:"+request.getServerName());
        return shiroUserService.selectAll();
    }

    @GetMapping("/getOne")
    public ShiroUser getOne(String uname){ return shiroUserService.selectOne(uname);}
}

application.xml配置文件:

server:
  port: 8004
mybatis:
  type-aliases-package: com.yiblue.provider8004.entity
  mapper-locations: classpath:mappers/*xml
spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/shiro?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8
    username: caidongji
    password: abc123
  application:
    name: provider
eureka:
  client:
    register-with-eureka: true
    fetchRegistry: true
    service-url:
      defaultZone: http://localhost:8080/eureka/

以上配置,已将服务注册到erueka中心,服务名,即application.name与8001提供者一样,provider

  1. 在消费者中的ribbon配置

    在restTemplateconfig类中配置注解:@LoadBalanced

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

    添加ribbon策略,创建一个配置类:

    @Configuration
    public class RibbonRule {
        @Bean
        public IRule RibbomStrategy(){
            return new AvailabilityFilteringRule();
    //        return new RandomRule();//随机访问策略
            /*
            * Ribbon负载均衡策略:
                RoundRobinRule 轮询,默认策略。
                RandomRule  随机
                RetryRule 先按照RoundRobinRule的策略获取服务,如果获取服务失败则在指定时间内会进行重试,获取可用的服务
                WeightedResponseTimeRule  对RoundRobinRule的扩展,响应速度越快的实例选择权重越大,越容易被选择
                BestAvailableRule 会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务
                AvailabilityFilteringRule 先过滤掉故障实例,再选择并发较小的实例
                ZoneAvoidanceRule 默认规则,复合判断server所在区域的性能和server的可用性选择服务器
            * */
        }
    }
    

​ 在消费者启动类上配置启动注解:@RibbonClient

@SpringBootApplication
@EnableEurekaClient
@RibbonClient(name = "provider",configuration = RibbonRule.class)
public class Consumer8002Application {
    public static void main(String[] args) {
        SpringApplication.run(Consumer8002Application.class, args);
    }
}
  1. 模块启动顺序erueka>provider1>provider2>consumer。服务者的之间的顺序可以颠倒。

标签:String,--,springcloud,public,uname,服务提供者,class,ribbon
From: https://www.cnblogs.com/yiblue/p/16729336.html

相关文章

  • ubuntu安装go
    1.下载go的安装包wget-chttps://studygolang.com/dl/golang/go1.19.1.linux-arm64.tar.gz-O-|sudotar-xz-C/usr/local注意!!!下载的版本一定要和你的linux系统配......
  • 165. 比较版本号
    165.比较版本号给你两个版本号version1和version2,请你比较它们。版本号由一个或多个修订号组成,各修订号由一个'.'连接。每个修订号由多位数字组成,可能包含......
  • 实验一
           个人总结:这次实验要求我们理解掌握如何创建网络拓扑,根据老师的指导,实验过程比较顺利,不过后期还是遇到了测试链路带宽出不来结果的问题......
  • dsm安装paperless-ng
    介绍paperless-ng是一个文档管理的软件,能够ocrpdf图片等,并存储起来便于文档的最终使用管理。安装说明docker-compose配置文件如下,这个是参照官方安装指南安装后获取的......
  • Java基础语法 三元运算符
    格式优先级packageBasicGrammar.day03;/*运算符之五:位运算符(了解)结论:1.位运算符操作的都是整型的数据2.<<:在一定范围内,每向左移1位,相当于*2>>:在一......
  • 使用github时遇到的一些问题与解决办法
    fatal:unabletoaccess‘https://github.com/.../.git/‘:参见:https://blog.csdn.net/xyaicwj/article/details/125256149......
  • ES 中let、const、var的区别
    (1)块级作用域:块作用域由 {} 包括,let和const具有块级作用域,var不存在块级作用域。块级作用域解决了ES5中的两个问题:1.内层变量可能覆盖外层变量2.用来计数的循环变量......
  • tomcat 访问日志转json
    一、安装jdk、tomcatcat install_tomcat.sh #!/bin/bashJDK_FILE="jdk-8u341-linux-x64.tar.gz"#JDK_FILE="jdk-8u281-linux-x64.tar.gz"TOMCAT_FILE="apache-tomc......
  • ::before与::after的使用
    今天介绍在前端开发中,会使用到的伪元素::before和::after介绍两个主要的作用1.在标签前面或者后面添加元素 例子1:使用::before和::after在标签前添加线条观察上面......
  • 实验3:OpenFlow协议分析实践
    实验3:OpenFlow协议分析实践一、实验目的1.能够运用wireshark对OpenFlow协议数据交互过程进行抓包;2.能够借助包解析工具,分析与解释OpenFlow协议的数据包交互过程与......