
Spring Cloud Ribbon
发布日期:2021-05-20 01:12:05
浏览次数:12
分类:精选文章
本文共 3684 字,大约阅读时间需要 12 分钟。
Ribbon 服务消费者
1.1 RestTemplate
Ribbon对RestTemplate进行了封装,提供负载均衡和重试功能。RestTemplate是Spring Boot提供的一个远程调用工具,可以执行GET和POST等请求。
RestTemplate 的方法
getForObject("url", 转换类型, 提交的参数)
- `postForObject("url", 协议体数据, 转换类型)"
修改 sp06-ribbon 项目
新建项目
- 项目名称:sp06-ribbon
- 依赖项:
- spring-boot-starter-parent
- spring-boot-starter-web
- spring-cloud-starter-netflix-eureka-client
- sp01-commons
application.yml
spring: application: name: ribbon server: port: 3001 eureka: client: service-url: defaultZone: http://eureka1:2001/eureka, http://eureka2:2002/eureka
主程序
- 添加
@EnableDiscoveryClient
注解 - 创建
RestTemplate
实例
1.2 RibbonController
@RestControllerpublic class RibbonController { @Autowired private RestTemplate rt; @GetMapping("/item-service/{orderId}") public JsonResult getItem(@PathVariable String orderId) { return rt.getForObject("http://item-service/{1}", JsonResult.class, orderId); } @PostMapping("/item-service/decreaseNumber") public JsonResult decreaseNumber(@RequestBody List- items) { return rt.postForObject("http://item-service/decreaseNumber", items, JsonResult.class); } @GetMapping("/user-service/{userId}") public JsonResult getUser(@PathVariable Integer userId) { return rt.getForObject("http://user-service/{1}", JsonResult.class, userId); } @GetMapping("/user-service/{userId}/score") public JsonResult addScore(@PathVariable Integer userId, Integer score) { return rt.getForObject("http://user-service/{1}/score?score={2}", JsonResult.class, userId, score); } @GetMapping("/order-service/{orderId}") public JsonResult getOrder(@PathVariable String orderId) { return rt.getForObject("http://order-service/{1}", JsonResult.class, orderId); } @GetMapping("/order-service") public JsonResult addOrder() { return rt.getForObject("http://order-service/", JsonResponse.class); }}
1.3 启动服务并测试
项目启动
mvn spring-boot:run
访问测试
http://eureka1:2001
http://localhost:3001/item-service/decreaseNumber
- 使用 Postman Sending POST 请求,请求体为
[{"id":1, "name":"abc", "number":23},{"id":2, "name":"def", "number":11}]
2.1 Ribbon 负载均衡
修改项目
添加 ripple 依赖
org.springframework.cloud spring-cloud-starter-netflix-ribbon
在主程序中加 @LoadBalanced
注解
访问路径改为服务ID
2.2 Ribbon 重试
添加 retry 依赖
org.springframework.retry spring-retry
在 application.yml 配置重试参数
spring: application: name: ribbon server: port: 3001 eureka: client: service-url: defaultZone: http://eureka1:2001/eureka, http://eura2:2002/eureka ribbon: MaxAutoRetries: 1 MaxAutoRetriesNextServer: 2 OkToRetryOnAllOperations: true
设置超时时间
@Beanpublic RestTemplate getRestTemplate() { SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); factory.setConnectTimeout(1000); factory.setReadTimeout(1000); return new RestTemplate(factory);}
修改 ItemController 添加延迟
@Slf4j@RestControllerpublic class ItemController { @Autowired private ItemService itemService; @Value("${server.port}") private int port; @GetMapping("/{orderId}") public JsonResult getItem(@PathVariable String orderId) throws Exception { log.info("server.port = {}, orderId = {}", port, orderId); if (Math.random() < 0.6) { log.info("temp sleep: {}", new Random().nextInt(5000)); Thread.sleep(new Random().nextInt(5000)); } List- items = itemService.getItems(orderId); return JsonResult.ok(items); }}
测试
- 负载均衡测试
- 同时访问
http://localhost:3001/item-service/decreaseNumber
- 同时访问
- 重试测试
- ItemService 降低响应速度,测试Ribbon的自动重试能力
发表评论
最新留言
路过按个爪印,很不错,赞一个!
[***.219.124.196]2025年04月21日 04时15分32秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
计网复习3
2019-03-16
JDK动态代理的实现原理
2019-03-16
Spring Security 架构与源码分析
2019-03-16
教程丨使用MeterSphere做Dubbo接口测试
2019-03-16
【毕设-STM32f103寄存器版本】智能防盗系统
2019-03-16
勒索病毒Kraken2.0.7分析
2019-03-16
MySQL错误1366处理方法
2019-03-16
pytorch深度学习中每个epoch运行时间的统计代码
2019-03-16
API->DeviceIOControl
2019-03-16
VxWorks 操作系统学习笔记
2019-03-16
链表插入和删除算法
2019-03-16
断言(assert)的用法
2019-03-16
主机与虚拟机(ubuntu)可以互ping,虚拟机不能上网解决办法
2019-03-16
驱动程序之_1_字符设备_13_USB设备_1_基本概念
2019-03-16
wxPython下载安装教程
2019-03-16
HERest源码解析
2019-03-16
【阅读论文】博-自动化眼底图像分析技术可筛查糖尿病患者的视网膜疾病--第二章
2019-03-16
51单片机的复位电路
2019-03-16