负载均衡Ribbon

https://gitee.com/hslxy/spring-cloud-learning

遇事不决加一层我觉得这个Ribbon体现的就很好

看这个图,我用Eureka弄了一个注册中心嘛,端口8001

然后呢,我用创建了两个user service服务,但是这两个端口是8201,8202。这怎么进行负载均衡呢

这时候我去定义一个Ribbon就可以了,我把他也注册到Eureka中,上面两个服务都注册在Eureka吗,然后他们都有一个服务名user-service

那我的Ribbon这时候也去写一个Controller,但是这个Controller直接将服务转发给http://user-service,这样就能自动选择这两个user-service进行负载均衡了

20221201201503

20221201202145

首先搭建自己的user-service

正常的service和Controller写法

加一个Eureka

没啥区别

20221201202744

主要是yml中配置注册中心的名字为user-service

server:
  port: 8201
spring:
  application:
    name: user-service # 这在注册中心中会体现,后面都用http://user-service来调用这个服务
eureka:
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone: http://localhost:8001/eureka/

Ribbon负载均衡

首先需要在pom文件中导入Ribbon包

但是会版本冲突,No instances available for user-service

https://blog.csdn.net/qq_48322394/article/details/114322081

看到这个博客说不导包,因为Eureka中有

首先配置yml#

server:
  port: 8301
spring:
  application:
    name: ribbon-service
eureka:
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone: http://localhost:8001/eureka/
service-url:
# 主要是这个,以后发请求就根据这个来
  user-service: http://user-service

RibbonConfig设置负载均衡的配置#

@Configuration
public class RibbonConfig {
    @Bean
    // 配置负载均衡的策略
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

我们再写一个controller#

但是这次没有service,直接发请求给user-service

@RestController
@RequestMapping("/user")
public class UserRibbonController {
    @Autowired
    private RestTemplate restTemplate;
    // 主要是这个
    @Value("${service-url.user-service}")
    private String userServiceUrl;

    @GetMapping("/{id}")
    public CommonResult getUser(@PathVariable Long id) {
        return restTemplate.getForObject(userServiceUrl + "/user/{1}", CommonResult.class, id);
    }

    @GetMapping("/getByUsername")
    public CommonResult getByUsername(@RequestParam String username) {
        return restTemplate.getForObject(userServiceUrl + "/user/getByUsername?username={1}", CommonResult.class, username);
    }

    @GetMapping("/getEntityByUsername")
    public CommonResult getEntityByUsername(@RequestParam String username) {
        ResponseEntity<CommonResult> entity = restTemplate.getForEntity(userServiceUrl + "/user/getByUsername?username={1}", CommonResult.class, username);
        if (entity.getStatusCode().is2xxSuccessful()) {
            return entity.getBody();
        } else {
            return new CommonResult("操作失败", 500);
        }
    }

    @PostMapping("/create")
    public CommonResult create(@RequestBody User user) {
        return restTemplate.postForObject(userServiceUrl + "/user/create", user, CommonResult.class);
    }

    @PostMapping("/update")
    public CommonResult update(@RequestBody User user) {
        return restTemplate.postForObject(userServiceUrl + "/user/update", user, CommonResult.class);
    }

    @PostMapping("/delete/{id}")
    public CommonResult delete(@PathVariable Long id) {
        return restTemplate.postForObject(userServiceUrl + "/user/delete/{1}", null, CommonResult.class, id);
    }
}

最后记得主函数加@EnableDiscoveryClient注解#

有一些负载均衡的策略

  • com.netflix.loadbalancer.RandomRule:从提供服务的实例中以随机的方式;
  • com.netflix.loadbalancer.RoundRobinRule:以线性轮询的方式,就是维护一个计数器,从提供服务的实例中按顺序选取,第一次选第一个,第二次选第二个,以此类推,到最后一个以后再从头来过;
  • com.netflix.loadbalancer.RetryRule:在RoundRobinRule的基础上添加重试机制,即在指定的重试时间内,反复使用线性轮询策略来选择可用实例;
  • com.netflix.loadbalancer.WeightedResponseTimeRule:对RoundRobinRule的扩展,响应速度越快的实例选择权重越大,越容易被选择;
  • com.netflix.loadbalancer.BestAvailableRule:选择并发较小的实例;
  • com.netflix.loadbalancer.AvailabilityFilteringRule:先过滤掉故障实例,再选择并发较小的实例;
  • com.netflix.loadbalancer.ZoneAwareLoadBalancer:采用双重过滤,同时过滤不是同一区域的实例和故障实例,选择并发较小的实例。

作者:hslxy

出处:https://www.cnblogs.com/hslxy/p/16942638.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   要努力哇  阅读(24)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示