负载均衡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进行负载均衡了
首先搭建自己的user-service
正常的service和Controller写法
加一个Eureka
没啥区别
主要是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 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端